优化 Nginx worker 过程数
Nginx 有 master 和 worker 两种过程,master 过程用于治理 worker 过程,worker 过程用于 Nginx 服务。
worker 过程数默认为 1 。
worker_processes 1;
worker 过程数应该设置为服务器 CPU 的核数。
[root@localhost ~]# grep -c processor /proc/cpuinfo # 查看CPU核数2[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf # 设置worker过程数worker_processes 2;
worker_processes 这个参数最好是设置成 auto 主动匹配过程数。
绑定 Nginx 过程到不同的 CPU 上
默认状况下,Nginx 的多个过程有可能跑在某一个 CPU 或 CPU 的某一核上,导致 Nginx 过程应用硬件的资源不均,因而绑定 Nginx 过程到不同的 CPU 上是为了充分利用硬件的多 CPU 多核资源。
[root@localhost ~]# grep -c processor /proc/cpuinfo # 查看CPU核数2worker_processes 2; # 2核CPU的配置worker_cpu_affinity 01 10;worker_processes 4; # 4核CPU的配置worker_cpu_affinity 0001 0010 0100 1000; worker_processes 8; # 8核CPU的配置worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000;
优化 Nginx 单个过程容许的最大连接数
管制 Nginx 单个过程容许的最大连接数的参数为 worker_connections ,这个参数要依据服务器性能和内存使用量来调整。
过程的最大连接数受 Linux 零碎过程关上的最大文件数的限度,只有执行了 “ulimit -HSn 65535” 之后,worker_connections 能力失效。
连接数包含代理服务器的连贯、客户端的连贯等,Nginx 总并发连接数 = worker_processes * worker_connections。总数放弃在 3w 左右即可。
worker_processes 2;worker_cpu_affinity 01 10;user nginx nginx;events { use epoll; worker_connections 15000;}
优化 Nginx worker 过程关上的最大文件数
worker_rlimit_nofile 65535; # worker 过程关上的最大文件数,可设置为优化后的 ulimit -HSn 的后果
开启高效文件传输模式
sendfile 参数用于开启文件的高效传输模式,该参数实际上是激活了 sendfile () 性能。
sendfile () 是作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作是在内核之中的,被称为 “零拷贝” 。sendfile 比 read 和 write 函数要高效得多,因为 read 和 write 函数要把数据拷贝到应用层再进行操作。
tcp_nopush 参数用于激活 Linux 上的 TCP_CORK socket 选项,此选项仅仅当开启 sendfile 时才失效,tcp_nopush 参数能够把 http response header 和文件的开始局部放在一个文件里公布,以缩小网络报文段的数量。
http { include mime.types; default_type application/octet-stream; sendfile on; # 开启文件的高效传输模式 tcp_nopush on; # 激活 TCP_CORK socket 抉择 tcp_nodelay on; # 数据在传输的过程中不进缓存 keepalive_timeout 65; include vhosts/*.conf;}
优化 Nginx 连贯的超时工夫
连贯超时的作用
将无用的连贯设置为尽快超时,能够爱护服务器的系统资源(CPU、内存、磁盘)
当连贯很多时,及时断掉那些建设好的但又长时间不做事的连贯,以缩小其占用的服务器资源
如果黑客攻击,会一直地和服务器建设连贯,因而设置连贯超时以避免大量耗费服务器的资源
如果用户申请了动静服务,则 Nginx 就会建设连贯,申请 FastCGI 服务以及后端 MySQL 服务,设置连贯超时,使得在用户容忍的工夫内返回数据
连贯超时存在的问题
服务器建设新连贯是要耗费资源的,因而,连贯超时工夫不宜设置得太短,否则会造成并发很大,导致服务器霎时无奈响应用户的申请。
有些 PHP 站点会心愿设置成短连贯,因为 PHP 程序建设连贯耗费的资源和工夫绝对要少些。
有些 Java 站点会心愿设置成长连贯,因为 Java 程序建设连贯耗费的资源和工夫要多一些,这是由语言的运行机制决定的。
设置超时工夫
keepalive_timeout:用于设置客户端连贯放弃会话的超时工夫,超过这个工夫服务器会敞开该连贯。
client_header_timeout:用于设置读取客户端申请头数据的超时工夫,如果超时客户端还没有发送残缺的 header 数据,服务器将返回 “Request time out (408)” 谬误。
client_body_timeout:用于设置读取客户端申请主体数据的超时工夫,如果超时客户端还没有发送残缺的主体数据,服务器将返回 “Request time out (408)” 谬误。
send_timeout:用于指定响应客户端的超时工夫,如果超过这个工夫,客户端没有任何流动,Nginx 将会敞开连贯。
tcp_nodelay:默认状况下当数据发送时,内核并不会马上发送,可能会期待更多的字节组成一个数据包,这样能够进步 I/O 性能,然而,在每次只发送很少字节的业务场景中,应用 tcp_nodelay 性能,等待时间会比拟长。
http { include mime.types; server_names_hash_bucket_size 512; default_type application/octet-stream; sendfile on; tcp_nodelay on; keepalive_timeout 65; client_header_timeout 15; client_body_timeout 15; send_timeout 25; include vhosts/*.conf;}
限度上传文件的大小
client_max_body_size 用于设置最大的容许客户端申请主体的大小。
在申请头中有 “Content-Length” ,如果超过了此配置项,客户端会收到 413 谬误,即申请的条目过大。
http { client_max_body_size 8m; # 设置客户端最大的申请主体大小为 8 M}
FastCGI 相干参数调优
当 LNMP 组合工作时,用户通过浏览器输出域名申请 Nginx Web 服务:
如果申请的是动态资源,则由 Nginx 解析后间接返回给用户;
如果是动静申请(如 PHP),那么 Nginx 就会把它通过 FastCGI 接口发送给 PHP 引擎服务(即 php-fpm)进行解析,如果这个动静申请要读取数据库数据,那么 PHP 就会持续申请 MySQL 数据库,以读取须要的数据,并最终通过 Nginx 服务把获取的数据返回给用户。
这就是 LNMP 环境的根本申请流程。
在 Linux 中,FastCGI 接口即为 socket ,这个 socket 能够是文件 socket,也能够是 IP socket。
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; fastcgi_connect_timeout 240; # Nginx服务器和后端FastCGI服务器连贯的超时工夫 fastcgi_send_timeout 240; # Nginx容许FastCGI服务器返回数据的超时工夫,即在规定工夫内后端服务器必须传完所有的数据,否则Nginx将断开这个连贯 fastcgi_read_timeout 240; # Nginx从FastCGI服务器读取响应信息的超时工夫,示意连贯建设胜利后,Nginx期待后端服务器的响应工夫 fastcgi_buffer_size 64k; # Nginx FastCGI 的缓冲区大小,用来读取从FastCGI服务器端收到的第一局部响应信息的缓冲区大小 fastcgi_buffers 4 64k; # 设定用来读取从FastCGI服务器端收到的响应信息的缓冲区大小和缓冲区数量 fastcgi_busy_buffers_size 128k; # 用于设置零碎很忙时能够应用的 proxy_buffers 大小 fastcgi_temp_file_write_size 128k; # FastCGI 临时文件的大小# fastcti_temp_path /data/ngx_fcgi_tmp; # FastCGI 临时文件的寄存门路 fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; # 缓存目录 server { listen 80; server_name www.abc.com; location / { root html/www; index index.html index.htm; } location ~ .*\.(php|php5)?$ { root html/www; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; fastcgi_cache ngx_fcgi_cache; # 缓存FastCGI生成的内容,比方PHP生成的动静内容 fastcgi_cache_valid 200 302 1h; # 指定http状态码的缓存工夫,这里示意将200和302缓存1小时 fastcgi_cache_valid 301 1d; # 指定http状态码的缓存工夫,这里示意将301缓存1天 fastcgi_cache_valid any 1m; # 指定http状态码的缓存工夫,这里示意将其余状态码缓存1分钟 fastcgi_cache_min_uses 1; # 设置申请几次之后响应被缓存,1示意一次即被缓存 fastcgi_cache_use_stale error timeout invalid_header http_500; # 定义在哪些状况下应用过期缓存 fastcgi_cache_key http://$host$request_uri; # 定义 fastcgi_cache 的 key } }}
gzip 压缩
Nginx gzip 压缩模块提供了压缩文件内容的性能,用户申请的内容在发送到客户端之前,Nginx 服务器会依据一些具体的策略施行压缩,以节约网站进口带宽,同时放慢数据传输效率,来晋升用户拜访体验。
须要压缩的对象有 html 、js 、css 、xml 、shtml ,图片和视频尽量不要压缩,因为这些文件大多都是曾经压缩过的,如果再压缩可能反而变大。
另外,压缩的对象必须大于 1KB,因为压缩算法的非凡起因,极小的文件压缩后可能反而变大。
http { gzip on; # 开启压缩性能 gzip_min_length 1k; # 容许压缩的对象的最小字节 gzip_buffers 4 32k; # 压缩缓冲区大小,示意申请4个单位为32k的内存作为压缩后果的缓存 gzip_http_version 1.1; # 压缩版本,用于设置辨认HTTP协定版本 gzip_comp_level 9; # 压缩级别,1级压缩比最小但处理速度最快,9级压缩比最高但处理速度最慢 gzip_types text/plain application/x-javascript text/css application/xml; # 容许压缩的媒体类型 gzip_vary on; # 该选项能够让前端的缓存服务器缓存通过gzip压缩的页面,例如用代理服务器缓存通过Nginx压缩的数据}
配置 expires 缓存期限
Nginx expires 的性能就是给用户拜访的动态内容设定一个过期工夫。
当用户第一次拜访这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及当前持续拜访该网站时,浏览器会查看加载曾经缓存在用户浏览器本地的内容,就不会去服务器下载了,直到缓存的内容过期或被革除。
不心愿被缓存的内容:广告图片、网站流量统计工具、更新很频繁的文件。
缓存期限参考:新浪缓存 15 天,京东缓存 25 年,淘宝缓存 10 年。
server { listen 80; server_name www.abc.com abc.com; root html/www; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ # 缓存的对象 { expires 3650d; # 缓存期限为 10 年 }}
配置防盗链
什么是防盗链?
简略地说,就是其它网站未经许可,通过在其本身网站程序里非法调用其余网站的资源,而后在本人的网站上显示这些调用的资源,使得被盗链的那一端耗费带宽资源 。
通过 HTTP referer 实现防盗链。
#第一种,匹配后缀location ~ .*\.(gif|jpg|jpeg|png|bm|swf|flv|rar|zip|gz|bz2)$ { # 指定须要应用防盗链的媒体资源 access_log off; # 不记录日志 expires 15d; # 设置缓存工夫 valid_referers none blocked *.test.com *.abc.com; # 示意仅容许这些域名拜访下面的媒体资源 if ($invalid_referer) { # 如果域名不是下面指定的地址就返回403 return 403 }}#第二种,绑定目录location /images { root /web/www/img; vaild_referers none blocked *.spdir.com *.spdir.top; if ($invalid_referer) { return 403; }}
server 代码块
server 代码块位于 http 代码块外部,每一个 server 都能够用来配置一个虚拟主机。也就是说,每一个 server 代表了一个虚构服务器的配置信息。
能够增加多个 server 来配置多个虚拟主机。
server { listen 80; server_name localhost; #access_log logs/host.access.log main; root "D:/phpStudy/WWW"; location / { index index.html index.htm index.php l.php; autoindex off; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php(.*)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #}}
server 中的次要配置有:
listen 虚拟主机监听的端口
server_name 虚拟主机的域名或 IP 地址,能够配置多个(用空格隔开)
root 虚拟主机的根目录
index 虚拟主机的首页,也能够用 location 代码块来配置
access_log 虚拟主机的拜访日志
error_log 虚拟主机的谬误日志
error_page 谬误页面
location 代码块
location 代码块位于 server 代码块外部。
location 用于配置虚拟主机的 URI,它是一个十分重要的配置。
能够给每一个 server(虚拟主机)配置多个 location。
能够依据不同的 URI 配置不同的 location,来解决不同的申请。
location 的语法格局
location [ = | ~ | ~* | ^~ | @] uri {...}
其中, = | ~ | ~* | ^~ | @ 示意前缀,也叫修饰符,是可选的;uri 示意一般字符串或正则表达式,是必须的。
@ 这个修饰符十分非凡,前面跟一个一般字符串,用于定义非凡的类型,被定义的类型只能被 nginx 外部调用,用于外部的重定向。这个重定向纯碎是 nginx 外部的一个转发行为。
= 字符串残缺匹配。
~ 辨别大小写的正则匹配。
~* 不辨别大小写的正则匹配。
^~ 字符串前缀匹配,只有匹配到了,就不会再匹配其余的正则 location。
如果没有任何修饰符,也示意字符串前缀匹配,即字符串 location。
如果 location 中应用了修饰符~或者~*,那么,这个 location 就是正则 location;否则,就是字符串 location。
多个 location 的匹配程序
多个 location 的匹配程序与 location 的地位程序没有间接关系,匹配程序为:
= 修饰符的优先级最高,示意残缺匹配。如果匹配胜利,则进行匹配其余 location。
字符串 location 的优先级第二;多个字符串 location 的匹配程序为从长到短,也就是说优先选择长度最长的字符串匹配;匹配胜利的字符串 location 如果应用了修饰符 ^~ 或者正好是精准匹配,则不会再去测验正则 location。
正则 location 的优先级低于字符串 location;多个 正则 location 会依照配置文件里的地位程序进行匹配,如果匹配胜利,就进行匹配。
留神: 尽管字符串 location 的优先级高于正则 location。然而,如果匹配胜利的字符串 location 中没有应用修饰符 ^~ ,也不是精准匹配,那么还会持续检测是否有匹配的正则 location。如果匹配到了正则 location,就立刻应用该正则 location 并进行匹配;否则,才会应用字符串 location。
也就是说,匹配到的字符串 location 可能会被正则 location 所笼罩。
匹配胜利的字符串 location,如果不想再持续检测匹配正则 location,有三种实现形式:
应用 = 修饰符,来进行残缺匹配。
应用 ^~ 修饰符,依然还是前缀匹配。
如果字符串匹配正好是精准的前缀匹配,也不会再去检测正则 location。这是一种隐式的实现形式。
匹配模式及其程序
location = /string 字符串残缺匹配,优先级最高。
location ^~ /string 字符串前缀匹配(不检测正则 location)。
location ~ pattern 正则匹配(辨别大小写)。
location ~* pattern 正则匹配(不辨别大小写)。
location /string 不带修饰符的字符串前缀匹配。
location / 默认匹配,如果一个申请没有匹配到其余的 location,就会匹配默认匹配。它相当于 switch 中的 default 。
阐明:对于字符串 location,如果没有 = 修饰符,就都是前缀匹配;而正则 location,可能是前缀匹配、后缀匹配、两头匹配和残缺匹配中的任意一种,这取决于正则表达式自身。
配置默认主页
location / { index index.html index.htm index.php l.php; autoindex off;}
配置反向代理
location / { proxy_pass http://localhost:8888; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
URL 丑化(省略 index.php 入口文件)
location / {
try_files $uri $uri/ /index.php?$query_string;
}
upstream 代码块
upstream 代码块位于 http 代码块外部。
upstream 用于对服务器集群进行负载平衡的配置。
upstream name { ip_hash; server 192.168.1.100:8000; server 192.168.1.100:8001 down; server 192.168.1.100:8002 max_fails=3; server 192.168.1.100:8003 fail_timeout=20s; server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;}
ip_hash:手动指定调度算法。
down:示意该主机暂停服务。
max_fails:示意失败最大次数,超过失败最大次数就会暂停服务。
fail_timeout:示意如果申请受理失败,暂停指定的工夫之后从新发动申请。
配置文件中的全局变量
$args #这个变量等于申请行中的参数。
$content_length #申请头中的 Content-length 字段。
$content_type #申请头中的 Content-Type 字段。
$document_root #以后申请在 root 指令中指定的值。
$host #申请主机头字段,否则为服务器名称。
$http_user_agent #客户端 agent 信息
$http_cookie #客户端 cookie 信息
$limit_rate #这个变量能够限度连贯速率。
$request_body_file #客户端申请主体信息的长期文件名。
$request_method #客户端申请的动作,通常为 GET 或 POST。
$remote_addr #客户端的 IP 地址。
$remote_port #客户端的端口。
$remote_user #曾经通过 Auth Basic Module 验证的用户名。
$request_filename #以后申请的文件门路,由 root 或 alias 指令与 URI 申请生成。
$query_string #与 $args 雷同。
$scheme #HTTP 办法(如 http,https)。
$server_protocol #申请应用的协定,通常是 HTTP/1.0 或 HTTP/1.1。
$server_addr #服务器地址,在实现一次零碎调用后能够确定这个值。
$server_name #服务器名称。
$server_port #申请达到服务器的端口号。
$request_uri #蕴含申请参数的原始 URI,不蕴含主机名,如:”/foo/bar.php?arg=baz”。
$uri #不带申请参数的以后 URI,$uri 不蕴含主机名,如”/foo/bar.html”。
$document_uri #与 $uri 雷同。
源码附件曾经打包好上传到百度云了,大家自行下载即可~
链接: https://pan.baidu.com/s/14G-b...
提取码: yu27
百度云链接不稳固,随时可能会生效,大家放松保留哈。
如果百度云链接生效了的话,请留言通知我,我看到后会及时更新~
开源地址
码云地址:
http://github.crmeb.net/u/defu
Github 地址:
http://github.crmeb.net/u/defu