查看“Nginx高性能Web服务器详解笔记”的源代码
←
Nginx高性能Web服务器详解笔记
跳转至:
导航
、
搜索
因为以下原因,你没有权限编辑本页:
该页面已被保护以防止编辑和其他操作。
您可以查看并复制此页面的源代码:
=第2章 Nginx服务器的安装部署= [http://www.tuicool.com/articles/Jr63qy Nginx 之 Location基础配置 及 Location最佳实践]<br /> 首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。 <br /> =第4章 Nginx服务器的高级配置= [http://blog.chinaunix.net/uid-28266791-id-5692804.html NGINX高性能Web服务器详解(读书笔记) ] ==4.1针对IPv4内核的7个参数优化配置== 参考:[[高并发情况下Linux服务器内核配置]]<br /> 相应的配置文件在 '''/etc/sysctl.conf'''<br /> 使用 <font style="background:lightgray">#/sbin/sysctl -p</font> 命令使修改生效: <nowiki> #添加: 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 </nowiki> ==4.2针对CPU的Nginx配置优化的2个指令== ;worker_processes 设置成内核的倍数。针对2核CPU,建议为2或4 :<font style="background:lightgray">worker_processes 4;</font> ;worker_cpu_affinity 若是4核CPU,则: :<font style="background:lightgray">worker_cpu_affinity 0001 0010 0100 1000;</font> ==4.3与网络连接相关的4个指令== ;keepallive_timeout:如:<font style="background:lightgray">keepalive_time 60 50; </font> ;send_timeout:如:<font style="background:lightgray">send_timeout 10s; </font> 如果这个时间之后客户端没有任何活动,Nginx服务器会关闭 ;client_header_buffer_size: 如果发现 400 错误,有很大一部分原因是客户端的请求头部过大造成的 :<font style="background:lightgray">client_header_buffer_size 32k; </font> ;multi_accept:配置Nginx尽可能多的接收客户端的连接请求: <font style="background:lightgray">multi_accept on; </font> ==4.4与事件驱动相关的8个指令== ;(1)use指令: <font style="background:lightgray">use epoll; </font> ;(2)worker_connections指令:每个Worker允许最大同时连接数。 <font style="background:lightgray">worker_connections 51200; </font> :由此可知,服务器最大连接数为: Client = worker_processes * worker_connections / 2 :同时可以设置进程可以打开最大文件句柄数量:<font style="background:lightgray"> #echo "2390251" > /proc/sys/fs/file-max; sysctl -p </font> ;(3)worker_rlimit_sigpending指令:<font style="background:lightgray"> worker_rlimit_sigpending 1024; </font> :用于设置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 指令: <font style="background:lightgray"> gzip on | off; </font> 默认为off,只有该指令设置为on时,下列各指令设置才有效。 ;(2)gzip_buffers 指令:<font style="background:lightgray"> gzip_buffers 32 4k | 16 8k; </font> 默认情况下 number * size的值为128,其中size为系统一页的大小。为4KB或8KB ;(3)gzip_comp_level 指令:设置压缩程度,从1到9。1表示压缩程度最低(这也是默认设置),压缩效率最高 ;(4)gzip_disable 指令:语法为 ''gzip_disable regex ...;'' 如: <font style="background:lightgray"> gzip_disable MSIE [1-6]\.; </font> ;(5)gzip_http_version 指令:默认为1.1 ;(6)gzip_min_len 指令: 超过该值时启用压缩。默认为20,太小了,建议设置为:<font style="background:lightgray"> gzip_min_len 1024; </font> ;(7)gzip_proxied 指令:<font style="background:lightgray"> gzip_proxied expired no-cache no-store private auth; </font> ;(8)gzip_types 指令:<font style="background:lightgray"> 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”指定方法及其重要性分析] :示例<font style="background:lightgray"> gzip_vary on; </font> :'''注意''':该指令在使用时会存在BUG,会导致IE4以上的浏览器的数据缓存功能失效。 以下是百度示例: [[文件:VaryAcceptEncoding.jpeg|600px|缩略图|居中|VaryAcceptEncoding百度示例]] 两核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指令'''。<br /> 该模块负责经过Gzip预压缩的数据.<br /> 其中 gzip_static用于开启或关闭该指令:<font style="background:lightgray"> gzip_static on | off | always; </font> 需要注意的是gzip_proxied只支持以下设置:<font style="background:lightgray"> gzip_proxied expired no-cache no-store private auth; </font> ==5.3由ngx_http_gunzip_module (可选)模块处理的2个指令== '''注意:要想使用必须在Nginx程序配置时使用 --with-ngx_http_gunzip_module指令'''。<br /> 需要解压的数据可能来自后端服务器或Nginx服务器预压缩产生。<br /> ;(1)gunzip指令:当开启时,如果客户端浏览器不支持Gzip处理,Nginx服务器将返回解压后的数据;如果客户端支持Gzip,Nginx则忽略该设置。 :<font style="background:lightgray"> gunzip_static on | off ; </font> ;(2)gunzip_buffers指令:用法与 gzip_buffers类似。 =第6章 Nginx 服务器的Rewrite功能= ===域名跳转=== <source lang= c> ... //例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; } ... } </source> ===域名镜像=== <source lang= c> ... 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; } </source> 如果我们不想整站做镜像,而只为某一个子目录的资源做镜像,我们可以在 location块中配置Rewrite功能 <source lang= c> ... 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; } } </source> ===独立域名=== <source lang= c> 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; } </source> ===目录自动添加 "/"=== <source lang= c> server { ... listen 81; server_name www.myweb.name; location ^~ /bbs { ... //这里: -d 目录; -f 文件;-e 文件或目录 if (-d $request_filename) { rewrite ^/(.*)([^/]$ http://$host/$1$2/ permanent; } } } </source> ===防盗链=== <source lang= c> 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; } } } </source> 根据目录实现防盗链: <source lang= c> ... location /file/ { ... root /server/file; valid_refers none blocked server_names *.myweb.name; if ($invalid_referer) { rewrite ^/ http://www.myweb.com/images/forbidden.png; } } </source> =第7章 Nginx 服务器的代理服务= [http://www.cnblogs.com/xingzc/p/5753030.html Nginx搭建反向代理服务器过程详解]<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 /> 一个请求被重复提交,原因是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个命令=== ;(1)proxy_pass命令: <source lang="yaml" > 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; } } </source > 在不指明http://协议的情况下 <source lang="yaml" > 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; } } </source > ;(6)proxy_set_header命令: 语法 <font class= lightgray> proxy_set_header field value; </font> <source lang="yaml" > #默认情况下该指令设置为: 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头域。 </source > ===7.3.2Proxy Buffer的配置的7个命令=== [http://www.ttlsa.com/nginx/nginx-proxy-buffer-explain/ nginx proxy buffer 解释]<br /> <source lan = yaml> proxy_buffer_size 4k; proxy_buffering on; proxy_buffers 4 4k; proxy_busy_buffers_size 8k; proxy_max_temp_file_size 1024m; </source> [http://www.frostsky.com/2015/10/nginx-proxy-buffer/ nginx proxy_buffers相关配置解释]<br /> proxy_buffer_size、proxy_buffers、proxy_busy_buffer_size等,它们都是针对每一个请求起作用的,而不是全局概念。 ;(1)proxy_buffering:是否启用或关闭ProxyBuffer。语法为:<font class=lightgray> proxy_buffering on | off ; </font> :开启或关闭ProxyBuffer还可以通过在HTTP响应头部的“X-Accel-Buffering”头域设置“yes”或“no”来实现 ;(2)proxy_buffers指令: 配置接收一次被代理服务器响应数据的ProxyBuffer个数和每个Buffer的大小。<font class=lightgray> proxy_buffers 8 4k | 8k; </font> ;(3)proxy_buffer_size指令:配置从被代理服务器获取第一部分响应数据的大小,默认不4k或8k <font class=lightgray> proxy_buffer_size 4k | 8k; </font> ;(4)proxy_busy_buffers_size指令:限制同时处于BUSY状态的ProxyBuffer的总大小。默认为8KB或16KB <font class=lightgray> proxy_buffer_size size; </font> ;(5)proxy_temp_path指令:示例<font class=lightgray> proxy_temp_path /nginx/proxy_web/spool/proxy_temp 1 2; </font> ;(6)proxy_max_temp_file_size指令:默认1024M ;(7)proxy_temp_file_write_size指令:配置同时写入临时文件的大小。一般与平台内存页大小相同 ===7.3.3Proxy Cache的配置的12个指令=== [http://blog.51yip.com/apachenginx/1018.html nginx利用proxy_cache来缓存文件(这里有一个完整的nginx配置文件)]<br /> <source lang= c> 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; } } } </source> =第8章 Nginx服务器的缓存机制= [http://blog.csdn.net/u011630575/article/details/48108255 使用nginx的proxy_cache做网站缓存] ==8.2 404错误驱动的Web缓存== 只能缓存200状态下的响应数据 <source lang= c> ... 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/ 在同一个硬盘分区内 } </source> ==8.3 资源不存在驱动的Web缓存== 与404驱动Web缓存大同小异 <source lang= c> ... 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/; } } </source> ==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 = lightgray> 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 缓存机制==
返回
Nginx高性能Web服务器详解笔记
。
导航菜单
个人工具
创建账户
登录
命名空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
相关站点
站长博客
分类
DB
WEB
iOS
Android
深度学习
技术收集
素材收集
历史
常用网址
导航
首页
最近更改
随机页面
帮助
常用管理页面
五笔字根表
工具
链入页面
相关更改
特殊页面
页面信息