“Nginx高性能Web服务器详解笔记”的版本间的差异
(→8.3 资源不存在驱动的Web缓存) |
|||
(未显示同一用户的19个中间版本) | |||
第1行: | 第1行: | ||
+ | =相关文章= | ||
+ | [http://mp.weixin.qq.com/s?__biz=MzA3MzYwNjQ3NA==&mid=2651297317&idx=1&sn=ffc57671c8c55d257f8a6d0ad3b502b6&chksm=84ff4200b388cb1668925a6293736729d45d39339292a6536da8f59392a221cb219be5cd64fd&mpshare=1&scene=1&srcid=1114zKz1SjAUK67xK2yn1sWd#rd 京东Nginx平台化实践] | ||
=第2章 Nginx服务器的安装部署= | =第2章 Nginx服务器的安装部署= | ||
[http://www.tuicool.com/articles/Jr63qy Nginx 之 Location基础配置 及 Location最佳实践]<br /> | [http://www.tuicool.com/articles/Jr63qy Nginx 之 Location基础配置 及 Location最佳实践]<br /> | ||
第9行: | 第11行: | ||
相应的配置文件在 '''/etc/sysctl.conf'''<br /> | 相应的配置文件在 '''/etc/sysctl.conf'''<br /> | ||
− | 使用 <font | + | 使用 <font class=code>#/sbin/sysctl -p</font> 命令使修改生效: |
<nowiki> | <nowiki> | ||
#添加: | #添加: | ||
第25行: | 第27行: | ||
==4.2针对CPU的Nginx配置优化的2个指令== | ==4.2针对CPU的Nginx配置优化的2个指令== | ||
;worker_processes 设置成内核的倍数。针对2核CPU,建议为2或4 | ;worker_processes 设置成内核的倍数。针对2核CPU,建议为2或4 | ||
− | :<font | + | :<font class=code>worker_processes 4;</font> |
;worker_cpu_affinity 若是4核CPU,则: | ;worker_cpu_affinity 若是4核CPU,则: | ||
− | :<font | + | :<font class=code>worker_cpu_affinity 0001 0010 0100 1000;</font> |
==4.3与网络连接相关的4个指令== | ==4.3与网络连接相关的4个指令== | ||
− | ;keepallive_timeout:如:<font | + | ;keepallive_timeout:如:<font class=code>keepalive_time 60 50; </font> |
− | ;send_timeout:如:<font | + | ;send_timeout:如:<font class=code>send_timeout 10s; </font> 如果这个时间之后客户端没有任何活动,Nginx服务器会关闭 |
;client_header_buffer_size: 如果发现 400 错误,有很大一部分原因是客户端的请求头部过大造成的 | ;client_header_buffer_size: 如果发现 400 错误,有很大一部分原因是客户端的请求头部过大造成的 | ||
− | :<font | + | :<font class=code>client_header_buffer_size 32k; </font> |
− | ;multi_accept:配置Nginx尽可能多的接收客户端的连接请求: <font | + | ;multi_accept:配置Nginx尽可能多的接收客户端的连接请求: <font class=code>multi_accept on; </font> |
==4.4与事件驱动相关的8个指令== | ==4.4与事件驱动相关的8个指令== | ||
− | ;(1)use指令: <font | + | ;(1)use指令: <font class=code>use epoll; </font> |
− | ;(2)worker_connections指令:每个Worker允许最大同时连接数。 <font | + | ;(2)worker_connections指令:每个Worker允许最大同时连接数。 <font class=code>worker_connections 51200; </font> |
:由此可知,服务器最大连接数为: Client = worker_processes * worker_connections / 2 | :由此可知,服务器最大连接数为: Client = worker_processes * worker_connections / 2 | ||
− | :同时可以设置进程可以打开最大文件句柄数量:<font | + | :同时可以设置进程可以打开最大文件句柄数量:<font class=code> #echo "2390251" > /proc/sys/fs/file-max; sysctl -p </font> |
− | ;(3)worker_rlimit_sigpending指令:<font | + | ;(3)worker_rlimit_sigpending指令:<font class=code> worker_rlimit_sigpending 1024; </font> |
:用于设置Linux 2.6.6版本之后Linux平台的事件信号队列长度上限。它主要影响事件驱动模型中rtsig模型可以保存的最大信号数。 | :用于设置Linux 2.6.6版本之后Linux平台的事件信号队列长度上限。它主要影响事件驱动模型中rtsig模型可以保存的最大信号数。 | ||
;(4)devpoll_changes和devpoll_events指令 | ;(4)devpoll_changes和devpoll_events指令 | ||
第62行: | 第64行: | ||
=第五章 Nginx服务器的Gzip压缩= | =第五章 Nginx服务器的Gzip压缩= | ||
==5.1由ngx_http_gzip_module模块处理的9个指令== | ==5.1由ngx_http_gzip_module模块处理的9个指令== | ||
− | ;(1)gzip 指令: <font | + | ;(1)gzip 指令: <font class=code> gzip on | off; </font> 默认为off,只有该指令设置为on时,下列各指令设置才有效。 |
− | ;(2)gzip_buffers 指令:<font | + | ;(2)gzip_buffers 指令:<font class=code> gzip_buffers 32 4k | 16 8k; </font> 默认情况下 number * size的值为128,其中size为系统一页的大小。为4KB或8KB |
;(3)gzip_comp_level 指令:设置压缩程度,从1到9。1表示压缩程度最低(这也是默认设置),压缩效率最高 | ;(3)gzip_comp_level 指令:设置压缩程度,从1到9。1表示压缩程度最低(这也是默认设置),压缩效率最高 | ||
− | ;(4)gzip_disable 指令:语法为 ''gzip_disable regex ...;'' 如: <font | + | ;(4)gzip_disable 指令:语法为 ''gzip_disable regex ...;'' 如: <font class=code> gzip_disable MSIE [1-6]\.; </font> |
;(5)gzip_http_version 指令:默认为1.1 | ;(5)gzip_http_version 指令:默认为1.1 | ||
− | ;(6)gzip_min_len 指令: 超过该值时启用压缩。默认为20,太小了,建议设置为:<font | + | ;(6)gzip_min_len 指令: 超过该值时启用压缩。默认为20,太小了,建议设置为:<font class=code> gzip_min_len 1024; </font> |
− | ;(7)gzip_proxied 指令:<font | + | ;(7)gzip_proxied 指令:<font class=code> gzip_proxied expired no-cache no-store private auth; </font> |
− | ;(8)gzip_types 指令:<font | + | ;(8)gzip_types 指令:<font class=code> gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; </font> |
;(9)gzip_vary 指令:该指令用于在使用Gzip时是否发送带有“Vary: Accept-Encoding”头域的响应头部。这个头域通知客户端浏览器使用了Gzip压缩(P82)。[http://www.webkaka.com/blog/archives/how-to-set-Vary-Accept-Encoding-header.html 标头“Vary:Accept-Encoding”指定方法及其重要性分析] | ;(9)gzip_vary 指令:该指令用于在使用Gzip时是否发送带有“Vary: Accept-Encoding”头域的响应头部。这个头域通知客户端浏览器使用了Gzip压缩(P82)。[http://www.webkaka.com/blog/archives/how-to-set-Vary-Accept-Encoding-header.html 标头“Vary:Accept-Encoding”指定方法及其重要性分析] | ||
− | :示例<font | + | :示例<font class=code> gzip_vary on; </font> 也可以手动以达到同样的效果:<font class=code>add_header Vary Accept-Encoding gzip; </font> |
:'''注意''':该指令在使用时会存在BUG,会导致IE4以上的浏览器的数据缓存功能失效。 | :'''注意''':该指令在使用时会存在BUG,会导致IE4以上的浏览器的数据缓存功能失效。 | ||
+ | :[[图解HTTP笔记#6.5.8_Vary]] | ||
以下是百度示例: | 以下是百度示例: | ||
[[文件:VaryAcceptEncoding.jpeg|600px|缩略图|居中|VaryAcceptEncoding百度示例]] | [[文件:VaryAcceptEncoding.jpeg|600px|缩略图|居中|VaryAcceptEncoding百度示例]] | ||
第90行: | 第93行: | ||
'''注意:要想使用必须在Nginx程序配置时使用 --with-http_gzip_static_module指令'''。<br /> | '''注意:要想使用必须在Nginx程序配置时使用 --with-http_gzip_static_module指令'''。<br /> | ||
该模块负责经过Gzip预压缩的数据.<br /> | 该模块负责经过Gzip预压缩的数据.<br /> | ||
− | 其中 gzip_static用于开启或关闭该指令:<font | + | 其中 gzip_static用于开启或关闭该指令:<font class=code> gzip_static on | off | always; </font> |
− | 需要注意的是gzip_proxied只支持以下设置:<font | + | 需要注意的是gzip_proxied只支持以下设置:<font class=code> gzip_proxied expired no-cache no-store private auth; </font> |
==5.3由ngx_http_gunzip_module (可选)模块处理的2个指令== | ==5.3由ngx_http_gunzip_module (可选)模块处理的2个指令== | ||
第97行: | 第100行: | ||
需要解压的数据可能来自后端服务器或Nginx服务器预压缩产生。<br /> | 需要解压的数据可能来自后端服务器或Nginx服务器预压缩产生。<br /> | ||
;(1)gunzip指令:当开启时,如果客户端浏览器不支持Gzip处理,Nginx服务器将返回解压后的数据;如果客户端支持Gzip,Nginx则忽略该设置。 | ;(1)gunzip指令:当开启时,如果客户端浏览器不支持Gzip处理,Nginx服务器将返回解压后的数据;如果客户端支持Gzip,Nginx则忽略该设置。 | ||
− | :<font | + | :<font class=code> gunzip_static on | off ; </font> |
;(2)gunzip_buffers指令:用法与 gzip_buffers类似。 | ;(2)gunzip_buffers指令:用法与 gzip_buffers类似。 | ||
第253行: | 第256行: | ||
[http://myhat.blog.51cto.com/391263/1117381/ 利用nginx的proxy_next_upstream实现线路容灾]<br /> | [http://myhat.blog.51cto.com/391263/1117381/ 利用nginx的proxy_next_upstream实现线路容灾]<br /> | ||
[http://blog.csdn.net/defonds/article/details/13003121 Nginx 负载均衡模块 ngx_http_upstream_module 详述]<br /> | [http://blog.csdn.net/defonds/article/details/13003121 Nginx 负载均衡模块 ngx_http_upstream_module 详述]<br /> | ||
+ | |||
+ | |||
+ | 一个请求被重复提交,原因是nginx代理后面挂着2个服务器,请求超时的时候(其实已经处理了),结果nigix发现超时,有把请求转给另外台服务器又做了次处理。<br /> | ||
+ | 配置:proxy_next_upstream:off<br /> | ||
+ | 参考:[https://my.oschina.net/greki/blog/109643 nginx proxy_next_upstream导致的一个重复提交错误]<br /> | ||
+ | |||
===7.3.1反向代理基本设置的21个命令=== | ===7.3.1反向代理基本设置的21个命令=== | ||
第296行: | 第305行: | ||
} | } | ||
</source > | </source > | ||
− | ;(6)proxy_set_header命令: 语法 <font class= | + | ;(6)proxy_set_header命令: 语法 <font class= code> proxy_set_header field value; </font> |
<source lang="yaml" > | <source lang="yaml" > | ||
第325行: | 第334行: | ||
proxy_buffer_size、proxy_buffers、proxy_busy_buffer_size等,它们都是针对每一个请求起作用的,而不是全局概念。 | proxy_buffer_size、proxy_buffers、proxy_busy_buffer_size等,它们都是针对每一个请求起作用的,而不是全局概念。 | ||
− | ;(1)proxy_buffering:是否启用或关闭ProxyBuffer。语法为:<font class= | + | ;(1)proxy_buffering:是否启用或关闭ProxyBuffer。语法为:<font class=code> proxy_buffering on | off ; </font> |
:开启或关闭ProxyBuffer还可以通过在HTTP响应头部的“X-Accel-Buffering”头域设置“yes”或“no”来实现 | :开启或关闭ProxyBuffer还可以通过在HTTP响应头部的“X-Accel-Buffering”头域设置“yes”或“no”来实现 | ||
− | ;(2)proxy_buffers指令: 配置接收一次被代理服务器响应数据的ProxyBuffer个数和每个Buffer的大小。<font class= | + | ;(2)proxy_buffers指令: 配置接收一次被代理服务器响应数据的ProxyBuffer个数和每个Buffer的大小。<font class=code> proxy_buffers 8 4k | 8k; </font> |
− | ;(3)proxy_buffer_size指令:配置从被代理服务器获取第一部分响应数据的大小,默认不4k或8k <font class= | + | ;(3)proxy_buffer_size指令:配置从被代理服务器获取第一部分响应数据的大小,默认不4k或8k <font class=code> proxy_buffer_size 4k | 8k; </font> |
− | ;(4)proxy_busy_buffers_size指令:限制同时处于BUSY状态的ProxyBuffer的总大小。默认为8KB或16KB <font class= | + | ;(4)proxy_busy_buffers_size指令:限制同时处于BUSY状态的ProxyBuffer的总大小。默认为8KB或16KB <font class=code> proxy_buffer_size size; </font> |
− | ;(5)proxy_temp_path指令:示例<font class= | + | ;(5)proxy_temp_path指令:该指令用于配置磁盘上的一个文件路径,该文件路径用于临时存放代理服务器的大体积响应数据。 |
+ | :示例<font class=code> proxy_temp_path /nginx/proxy_web/spool/proxy_temp 1 2; </font> | ||
;(6)proxy_max_temp_file_size指令:默认1024M | ;(6)proxy_max_temp_file_size指令:默认1024M | ||
;(7)proxy_temp_file_write_size指令:配置同时写入临时文件的大小。一般与平台内存页大小相同 | ;(7)proxy_temp_file_write_size指令:配置同时写入临时文件的大小。一般与平台内存页大小相同 | ||
+ | |||
===7.3.3Proxy Cache的配置的12个指令=== | ===7.3.3Proxy Cache的配置的12个指令=== | ||
[http://blog.51yip.com/apachenginx/1018.html nginx利用proxy_cache来缓存文件(这里有一个完整的nginx配置文件)]<br /> | [http://blog.51yip.com/apachenginx/1018.html nginx利用proxy_cache来缓存文件(这里有一个完整的nginx配置文件)]<br /> | ||
第435行: | 第446行: | ||
=第8章 Nginx服务器的缓存机制= | =第8章 Nginx服务器的缓存机制= | ||
+ | [http://blog.csdn.net/u011630575/article/details/48108255 使用nginx的proxy_cache做网站缓存] | ||
==8.2 404错误驱动的Web缓存== | ==8.2 404错误驱动的Web缓存== | ||
+ | 只能缓存200状态下的响应数据 | ||
<source lang= c> | <source lang= c> | ||
... | ... | ||
第453行: | 第466行: | ||
} | } | ||
</source> | </source> | ||
+ | |||
==8.3 资源不存在驱动的Web缓存== | ==8.3 资源不存在驱动的Web缓存== | ||
与404驱动Web缓存大同小异 | 与404驱动Web缓存大同小异 | ||
第474行: | 第488行: | ||
==8.4 基于memcached的缓存机制的6个指令== | ==8.4 基于memcached的缓存机制的6个指令== | ||
+ | |||
+ | ;(1)memcached_pass指令: | ||
+ | ;(2)memcached_connect_timeout 指令:默认60s建议不超75s | ||
+ | ;(3)memcached_read_timeout 指令: | ||
+ | ;(4)memcached_write_timeout 指令: | ||
+ | ;(5)memcached_buffer_size 指令:用于接收memcached服务器响应数据的缓存大小,一般为内存内页的倍数。<font class = code> memcached_buffer_size 4k | 8k; </font> | ||
+ | ;(6)memcached_next_upstream 指令: | ||
+ | <source lang=c> | ||
+ | ... | ||
+ | server { | ||
+ | location / { | ||
+ | ... | ||
+ | set $memcached_key "$uri?$args"; | ||
+ | memcached_pass 192.168.1.4:8080; | ||
+ | error_page 404 502 504 = @fallback; | ||
+ | } | ||
+ | location @fallback { | ||
+ | proxy_pass http://backend; | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | [http://www.open-open.com/lib/view/open1377777147386.html nginx+memcached构建页面缓存应用] | ||
+ | ==8.5 Proxy Cache 缓存机制== | ||
+ | 缺点:不能自动清理磁盘<br /> | ||
+ | |||
+ | [http://blog.51yip.com/apachenginx/1018.html nginx利用proxy_cache来缓存文件(这里有一个完整的nginx配置文件)]<br /> | ||
+ | 以下是示例: | ||
+ | <source lang=c> | ||
+ | ... | ||
+ | http { | ||
+ | proxy_cache_path /myweb/server/proxycache levels=1:2 max_size=30g inactive=1d keys_zone=MYPROXYCACHE:200m; | ||
+ | proxy_temp_path /myweb/server/tmp; #配置响应数据的临时存放目录 | ||
+ | server { | ||
+ | location / { | ||
+ | proxy_pass http://www.myweb.name/; | ||
+ | proxy_cache MYPROXYCACHE; | ||
+ | proxy_cache_valid 200 302 1h; | ||
+ | proxy_cache_vali 301 1d; | ||
+ | proxy_cache_vali any 1m; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> |
2016年11月16日 (三) 05:25的最后版本
目录
相关文章
第2章 Nginx服务器的安装部署
Nginx 之 Location基础配置 及 Location最佳实践
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
第4章 Nginx服务器的高级配置
4.1针对IPv4内核的7个参数优化配置
相应的配置文件在 /etc/sysctl.conf
使用 #/sbin/sysctl -p 命令使修改生效:
#添加: net.core.netdev_max_backlog = 262144 net.core.somaxconn = 262144 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_timestamps = 0 net.ipv4. tcp_synack_retries = 1 net.ipv4. tcp_syn_retries = 1 #修改 net.ipv4.tcp_max_syn_backlog = 262144
4.2针对CPU的Nginx配置优化的2个指令
- worker_processes 设置成内核的倍数。针对2核CPU,建议为2或4
- worker_processes 4;
- worker_cpu_affinity 若是4核CPU,则:
- worker_cpu_affinity 0001 0010 0100 1000;
4.3与网络连接相关的4个指令
- keepallive_timeout
- 如:keepalive_time 60 50;
- send_timeout
- 如:send_timeout 10s; 如果这个时间之后客户端没有任何活动,Nginx服务器会关闭
- client_header_buffer_size
- 如果发现 400 错误,有很大一部分原因是客户端的请求头部过大造成的
- client_header_buffer_size 32k;
- multi_accept
- 配置Nginx尽可能多的接收客户端的连接请求: multi_accept on;
4.4与事件驱动相关的8个指令
- (1)use指令
- use epoll;
- (2)worker_connections指令
- 每个Worker允许最大同时连接数。 worker_connections 51200;
- 由此可知,服务器最大连接数为: Client = worker_processes * worker_connections / 2
- 同时可以设置进程可以打开最大文件句柄数量: #echo "2390251" > /proc/sys/fs/file-max; sysctl -p
- (3)worker_rlimit_sigpending指令
- worker_rlimit_sigpending 1024;
- 用于设置Linux 2.6.6版本之后Linux平台的事件信号队列长度上限。它主要影响事件驱动模型中rtsig模型可以保存的最大信号数。
- (4)devpoll_changes和devpoll_events指令
- 用于设置在/dev/poll事件驱动模型下Nginx服务器可以与内核之间传递事件的数量。前者设置传递给内核的事件数量,后者设置从内核获取的事件数量。默认值为32
- (5)kqueue_changes和kquue_events指令
- 用于设置在kqueue事件驱动模型下Nginx服务器可以与内核之间传递事件的数量。前者设置传递给内核的事件数量,
- 后者设置从内核获取的事件数量。默认值为512.
- (6)epoll_events指令
- 用于设置在epoll事件驱动模型下Nginx服务器可以与内核之间传递事件的数量。默认值为512.
- 注意:与其他事件驱动模型不同,epoll模型下Nginx服务器向内核传递事件的数量和从内核获取的事件数量是相等的。所以,
- 不存在epoll_changes指令。
- (7)rtsig_signo指令
- 用于设置rtsig模式使用的2个信号中的第一个,第二个信号是在第一个信号的编号上加1.默认的第一个信号设置为:
- SIGRTMIN+10
- (8)rtsig_overflow_*指令
- 该指令有3个具体的指令,rtsig_over_events、rtsig_over_test、rtsig_over_threshold指令。这些指令用来控制当rtsig模式中信号队列溢出时Nginx服务器的处理方式。
- rtsig_over_events:指定队列溢出时使用poll库处理的事件数,默认值为16.
- tsig_over_test:指定poll库处理完第几件事后将清空rtsig模型使用的信号队列,默认值为32.
- tsig_over_threshold:指定rtsig模式使用的信号队列中的事件超过多少时就需要清空队列了。该指令只对Linux 2.4.x以下版本有效。
第五章 Nginx服务器的Gzip压缩
5.1由ngx_http_gzip_module模块处理的9个指令
- (1)gzip 指令
- gzip on | off; 默认为off,只有该指令设置为on时,下列各指令设置才有效。
- (2)gzip_buffers 指令
- gzip_buffers 32 4k | 16 8k; 默认情况下 number * size的值为128,其中size为系统一页的大小。为4KB或8KB
- (3)gzip_comp_level 指令
- 设置压缩程度,从1到9。1表示压缩程度最低(这也是默认设置),压缩效率最高
- (4)gzip_disable 指令
- 语法为 gzip_disable regex ...; 如: gzip_disable MSIE [1-6]\.;
- (5)gzip_http_version 指令
- 默认为1.1
- (6)gzip_min_len 指令
- 超过该值时启用压缩。默认为20,太小了,建议设置为: gzip_min_len 1024;
- (7)gzip_proxied 指令
- gzip_proxied expired no-cache no-store private auth;
- (8)gzip_types 指令
- gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
- (9)gzip_vary 指令
- 该指令用于在使用Gzip时是否发送带有“Vary: Accept-Encoding”头域的响应头部。这个头域通知客户端浏览器使用了Gzip压缩(P82)。标头“Vary:Accept-Encoding”指定方法及其重要性分析
- 示例 gzip_vary on; 也可以手动以达到同样的效果:add_header Vary Accept-Encoding gzip;
- 注意:该指令在使用时会存在BUG,会导致IE4以上的浏览器的数据缓存功能失效。
- 图解HTTP笔记#6.5.8_Vary
以下是百度示例:
两核CPU/4G内存的配置示例:
gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]\.";
5.2由ngx_http_gzip_static_module (可选)模块处理的指令
注意:要想使用必须在Nginx程序配置时使用 --with-http_gzip_static_module指令。
该模块负责经过Gzip预压缩的数据.
其中 gzip_static用于开启或关闭该指令: gzip_static on | off | always;
需要注意的是gzip_proxied只支持以下设置: gzip_proxied expired no-cache no-store private auth;
5.3由ngx_http_gunzip_module (可选)模块处理的2个指令
注意:要想使用必须在Nginx程序配置时使用 --with-ngx_http_gunzip_module指令。
需要解压的数据可能来自后端服务器或Nginx服务器预压缩产生。
- (1)gunzip指令
- 当开启时,如果客户端浏览器不支持Gzip处理,Nginx服务器将返回解压后的数据;如果客户端支持Gzip,Nginx则忽略该设置。
- gunzip_static on | off ;
- (2)gunzip_buffers指令
- 用法与 gzip_buffers类似。
第6章 Nginx 服务器的Rewrite功能
域名跳转
... //例1:多域名跳转 server { ... listen 80; server_name jump.myweb.name jump.myweb.info; if ($host ~ myweb\.info) { rewrite ^(.*) http://jump.myweb.name$1 permanent; } ... } //例2:三级域名跳转 server { ... listen 80; server_name jump1.myweb.name jump2.myweb.name; if ($host ~* (.*)\.myweb\.name) { rewrite ^(.*) http://jump.myweb.name$1 permanent; break; } ... }
域名镜像
... server { ... listen 80; server_name mirror1.myweb.name; rewrite ^(.*) http://jump1.myweb.name$1 last; break; } server { ... listen 81; server_name mirror2.myweb.name; rewrite ^(.*) http://jump2.myweb.name$1 last; break; }
如果我们不想整站做镜像,而只为某一个子目录的资源做镜像,我们可以在 location块中配置Rewrite功能
... server { ... listen 80; server_name jump.myweb.name; location ^~ /source1 { ... rewrite ^/source1(.*) http://jump.myweb.name/websrc2$1 last; break; } location ^~ /source2 { ... rewrite ^/source2(.*) http://jump.myweb.name/websrc2$1 last; break; } }
独立域名
server { ... listen 80; server_name bbs.myweb.name; rewrite ^(.*) http://www.myweb.name/bbs$1 last; break; } server { ... listen 81; server_name home.myweb.name; rewrite ^(.*) http://www.myweb.name/home$1 last; break; }
目录自动添加 "/"
server { ... listen 81; server_name www.myweb.name; location ^~ /bbs { ... //这里: -d 目录; -f 文件;-e 文件或目录 if (-d $request_filename) { rewrite ^/(.*)([^/]$ http://$host/$1$2/ permanent; } } }
防盗链
server { ... listen 80; server_name www.myweb.com; location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ { ... valid_refers none blocked server_names *.myweb.name; if ($invalid_referer) { rewrite ^/ http://www.myweb.com/images/forbidden.png; } } }
根据目录实现防盗链:
... location /file/ { ... root /server/file; valid_refers none blocked server_names *.myweb.name; if ($invalid_referer) { rewrite ^/ http://www.myweb.com/images/forbidden.png; } }
第7章 Nginx 服务器的代理服务
Nginx搭建反向代理服务器过程详解
利用nginx的proxy_next_upstream实现线路容灾
Nginx 负载均衡模块 ngx_http_upstream_module 详述
一个请求被重复提交,原因是nginx代理后面挂着2个服务器,请求超时的时候(其实已经处理了),结果nigix发现超时,有把请求转给另外台服务器又做了次处理。
配置:proxy_next_upstream:off
参考:nginx proxy_next_upstream导致的一个重复提交错误
7.3.1反向代理基本设置的21个命令
- (1)proxy_pass命令
upstream proxy_svrs { server http://182.168.1.1:8001/uri/; server http://182.168.1.2:8001/uri/; server http://182.168.1.3:8001/uri/; } server { ...... listen 80; server_name www.myweb.home; location / { proxy_pass proxy_svrs; } }
在不指明http://协议的情况下
upstream proxy_svrs { server 182.168.1.1:8001/uri/; server 182.168.1.2:8001/uri/; server 182.168.1.3:8001/uri/; } server { ...... listen 80; server_name www.myweb.home; location / { proxy_pass http://proxy_svrs; } }
- (6)proxy_set_header命令
- 语法 proxy_set_header field value;
#默认情况下该指令设置为: proxy_set_header Host $proxy_host; proxy_set_header Connect close; #一些实例: proxy_set_header Host $http_host; #将Host头域的值填充�成客户端的地址。 proxy_set_header Host $host; #将location块的server_name指令值填充到Host头域。 proxy_set_header Host $host:$proxy_port; #将location块的server_name指令值和listener指令值一起填充到Host头域。
7.3.2Proxy Buffer的配置的7个命令
proxy_buffer_size 4k; proxy_buffering on; proxy_buffers 4 4k; proxy_busy_buffers_size 8k; proxy_max_temp_file_size 1024m;
proxy_buffer_size、proxy_buffers、proxy_busy_buffer_size等,它们都是针对每一个请求起作用的,而不是全局概念。
- (1)proxy_buffering
- 是否启用或关闭ProxyBuffer。语法为: proxy_buffering on | off ;
- 开启或关闭ProxyBuffer还可以通过在HTTP响应头部的“X-Accel-Buffering”头域设置“yes”或“no”来实现
- (2)proxy_buffers指令
- 配置接收一次被代理服务器响应数据的ProxyBuffer个数和每个Buffer的大小。 proxy_buffers 8 4k | 8k;
- (3)proxy_buffer_size指令
- 配置从被代理服务器获取第一部分响应数据的大小,默认不4k或8k proxy_buffer_size 4k | 8k;
- (4)proxy_busy_buffers_size指令
- 限制同时处于BUSY状态的ProxyBuffer的总大小。默认为8KB或16KB proxy_buffer_size size;
- (5)proxy_temp_path指令
- 该指令用于配置磁盘上的一个文件路径,该文件路径用于临时存放代理服务器的大体积响应数据。
- 示例 proxy_temp_path /nginx/proxy_web/spool/proxy_temp 1 2;
- (6)proxy_max_temp_file_size指令
- 默认1024M
- (7)proxy_temp_file_write_size指令
- 配置同时写入临时文件的大小。一般与平台内存页大小相同
7.3.3Proxy Cache的配置的12个指令
nginx利用proxy_cache来缓存文件(这里有一个完整的nginx配置文件)
user zhangy users; worker_processes 10; error_log /var/vlogs/nginx_error.log crit; pid /var/vlogs/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 65535; events { use epoll; worker_connections 65535; } http { include mime.types; default_type application/octet-stream; #charset gb2312; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 8m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; //============ client_body_buffer_size 512k; proxy_connect_timeout 5; proxy_read_timeout 60; proxy_send_timeout 5; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; proxy_temp_path /usr/local/nginx/proxy_temp; /*levels设置目录层次 keys_zone设置缓存名字和共享内存大小 inactive在指定时间内没人访问则被删除在这里是1天 max_size最大缓存空间*/ proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=content:20m inactive=1d max_size=100m; //============等号中间要加的,关键只要加上proxy_cache_path gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; upstream myselfxtajmd { server 127.0.0.1:10002; server 127.0.0.1:10001 weight=5; } server { listen 10000; server_name localhost; index index.html index.htm index.php; log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; access_log /var/log/test.log access; location / { proxy_cache content; //根keys_zone后的内容对应 proxy_cache_valid 200 304 301 302 10d; //哪些状态缓存多长时间 proxy_cache_valid any 1d; //其他的缓存多长时间 proxy_cache_key $host$uri$is_args$args; //通过key来hash,定义KEY的值 proxy_pass http://myselfxtajmd; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } //动态的放过 location ~ .*\.(php|jsp|cgi)?$ { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://myselfxtajmd; } } }
第8章 Nginx服务器的缓存机制
8.2 404错误驱动的Web缓存
只能缓存200状态下的响应数据
... location / { root /myweb/server/; error_page 404 =200 /errpage$request_uri; } location /errpage/ { #捕获404重定向 ... internal; #该目录不能通过外部直接访问 alias /home/html/; proxy_pass http://backend/; #注意这里未尾的“/”,它将替换掉 “/errpage/”,该技巧参见P108 proxy_set_header Accept-Encoding ""; proxy_store on; proxy_store_access user:rw group:rw all:r; proxy_temp_path /myweb/server/tmp; #/myweb/server/ 在同一个硬盘分区内 }
8.3 资源不存在驱动的Web缓存
与404驱动Web缓存大同小异
... location / { root /home/html/; internal; #该目录不能通过外部直接访问 alias /home/html/; proxy_set_header Accept-Encoding ""; proxy_store on; proxy_store_access user:rw group:rw all:r; proxy_temp_path /myweb/server/tmp; #/myweb/server/ 在同一个硬盘分区内 if ( !-f $request_filename ) #判读请求的资源是否存在 { proxy_pass http://backend/; } }
8.4 基于memcached的缓存机制的6个指令
- (1)memcached_pass指令
- (2)memcached_connect_timeout 指令
- 默认60s建议不超75s
- (3)memcached_read_timeout 指令
- (4)memcached_write_timeout 指令
- (5)memcached_buffer_size 指令
- 用于接收memcached服务器响应数据的缓存大小,一般为内存内页的倍数。 memcached_buffer_size 4k | 8k;
- (6)memcached_next_upstream 指令
... server { location / { ... set $memcached_key "$uri?$args"; memcached_pass 192.168.1.4:8080; error_page 404 502 504 = @fallback; } location @fallback { proxy_pass http://backend; } }
8.5 Proxy Cache 缓存机制
缺点:不能自动清理磁盘
nginx利用proxy_cache来缓存文件(这里有一个完整的nginx配置文件)
以下是示例:
... http { proxy_cache_path /myweb/server/proxycache levels=1:2 max_size=30g inactive=1d keys_zone=MYPROXYCACHE:200m; proxy_temp_path /myweb/server/tmp; #配置响应数据的临时存放目录 server { location / { proxy_pass http://www.myweb.name/; proxy_cache MYPROXYCACHE; proxy_cache_valid 200 302 1h; proxy_cache_vali 301 1d; proxy_cache_vali any 1m; } } }