Nginx
作为web server
热门项目,有着高性能、简单配置以及跨平台,越来越多的企业选择使用它,我们这篇博客来说一下如何优化Nginx
最精简编译安装Nginx
我们经常安装软件就会发现,有些东西我们并不需要,我们最小安装,等以后需要了再安装扩展就可以,Nginx
也是一样的道理
./configure
"--prefix=/App/nginx"
"--with-http_stub_status_module"
"--without-http_auth_basic_module"
"--without-http_autoindex_module"
"--without-http_browser_module"
"--without-http_empty_gif_module"
"--without-http_geo_module"
"--without-http_limit_conn_module"
"--without-http_limit_req_module"
"--without-http_map_module"
"--without-http_memcached_module"
"--without-http_proxy_module"
"--without-http_referer_module"
"--without-http_scgi_module"
"--without-http_split_clients_module"
"--without-http_upstream_ip_hash_module"
"--without-http_upstream_keepalive_module"
"--without-http_upstream_least_conn_module"
"--without-http_userid_module"
"--without-http_uwsgi_module"
"--without-mail_imap_module"
"--without-mail_pop3_module"
"--without-mail_smtp_module"
"--without-poll_module"
"--without-select_module"
"--with-cc-opt='-O2'"
大家可以根据业务需要安装模块,关于最后的"--with-cc-opt='-O2'"
,这个属于GCC
的优化,可选的,GCC
提供了多种级别的优化,因为我们打包也有 release
、dev
包嘛,release
包肯定都是最优的。
Nginx配置文件调优
应用服务器的性能优化主要在合理使用CPU
、内存
、磁盘IO
和网络IO
四个方面,现在我们从Nginx
配置文件 nginx.conf
入手进行优化:
Nginx进程数
在不清楚系统其他信息的情况下,这个可以设置为你的CPU的核心数、或者是核心数*2,如果ecs
不是你买的,你可以执行cat /proc/cpuinfo | grep processor | wc -l
来查看核心数
worker_processes 4;
Nginx运行CPU亲和力
目前的服务器一般为多核CPU
,当并发很大时,服务器各个CPU
的使用率可能出现严重不均衡的局面,这时候可以考虑使用CPU
绑定,以达到CPU
使用率相对均匀的状态,充分发挥多核CPU
的优势。
比如4核配置:
代码语言:javascript复制worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000
比如8核配置:
代码语言:javascript复制worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;
worker_processes
最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
打开文件数限制
执行 ulimit -n
查看最多打开文件数,与这个一致即可,一般都是 65535
worker_rlimit_nofile 65535;
event配置
代码语言:javascript复制events {
use epoll;
worker_connections 65535;
multi_accept on;
}
- use
定义了Nginx
设置用于复用客户端线程的轮询方法(也可称多路复用网络IO模型)。这自然是选择效率更高的优先,Linux 2.6
内核推荐使用epoll
,FreeBSD
推荐使用kqueue
,安装时Nginx
会自动选择。
- worker_connections
连接数,该参数值不能超过 worker_rlimit_nofile
值,所以建议设置成和 worker_rlimit_nofile
值相等。一般来说是 65535
- accept_mutex
如果 accept_mutex
指令值为 on
启用,那么将轮流唤醒一个工作进程接收处理新的连接,其余工作进程继续保持睡眠;如果值为 off
关闭,那么将唤醒所有工作进程,由系统通过use
指令指定的网络IO模型调度决定由哪个工作进程处理,未接收到连接请求的工作进程继续保持睡眠,这就是所谓的“惊群问题
”。Web
服务器Apache
的进程数很多,成百上千也是时有的事,“惊群问题
”也尤为明显。Nginx
为了稳定,参数值保守的设置为 on
开启状态。可以将其设置成Off
提高性能和吞吐量,但这样也会带来上下文切换增多或者负载升高等等其它资源更多消耗的后果。
隐藏Nginx版本
代码语言:javascript复制server_tokens off;
关闭显示响应头的版本号,防止针对性攻击
Gzip压缩
使用gzip
压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点。
Nginx
启用压缩功能需要你来ngx_http_gzip_module
模块,apache使用的是mod_deflate
。
一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash什么的不压缩,这玩意上传就应该处理好,同时也要注意,我们使用gzip
的功能是需要消耗CPU
的!
gzip on;
gzip_min_length 2k;
gzip_buffers 4 32k;
gzip_comp_level 6;
gzip_typestext/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml;
- gzip_min_length:设置允许压缩的页面最小字节数,页面字节数从
header
头的Content-
Length
中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K
,如果小与1K
可能会越压越大。 - gzip_buffers:压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
- gzip_comp_level:压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源,一般采用折中。
- gzip_types:用来指定压缩的类型,Nginx配置目录 conf 下的 mime.types 文件存放了Nginx支持的文件类型,推荐配置:
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml rss text/javascript
浏览器缓存
设置HTTP应答中的Expires
和Cache-Control
头标。Expires
一般结合Last-Modified
使用。当设置了合理的expires
配置时,浏览器第一次访问Web
页面元素,会下载页面中的的静态文件到本机临时缓存目录下。第二次及之后再次访问相同URL时将发送带头标识If-Modified-Since
和本地缓存文件时间属性值的请求给服务器,服务器比对服务器本地文件时间属性值,如果未修改,服务器直接返回http 304
状态码,浏览器直接调用本地已缓存的文件;如果时间属性值修改了,重新发送新文件。这样就避免了从服务器再次传送文件内容,减小了服务器压力,节省了带宽,同时也提高了用户访问速度,一举三得。指令后接数字加时间单位,即为缓存过期时间;-1 表示永远过期,不缓存。强烈建议添加expires
配置,过期时间的选择具体分析。我们公司的部分Nginx配置如下:
location ~ . .(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ . .(js|css|xml|javascript|txt|csv)$
{
expires 30d;
}
防盗链
防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,那么我们的解决办法由几种:
- 水印,品牌宣传,你的带宽,服务器足够;
- 防火墙,直接控制,前提是你知道IP来源;
- 防盗链策略下面的方法是直接给予404的错误提示。
这个一般可以在设置CDN
的时候配置,自己配置也行
location ~*^. .(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers noneblocked www.aoppp.com aoppp.com;
if($invalid_referer) {
return 404;
break;
}
access_log off;
}
- none:意思是不存在的Referer头(表示空的,也就是直接访问,比如直接在浏览器打开一个图片)。
- blocked:意为根据防火墙伪装Referer头,如:“Referer:XXXXXXX”。
fastcig调优
代码语言:javascript复制fastcgi_pass localhost:9000; # fastcgi连接
fastcgi_connect_timeout 600; # 设置连接超时
fastcgi_send_timeout 600; # 传送请求超时时间
fastcgi_read_timeout 600; # 接收FastCGI应答的超时时间。
fastcgi_buffer_size 64k; # 缓冲区大小
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k; # 建议设置为fastcgi_buffers的两倍,繁忙时候的buffer
fastcgi_temp_file_write_size 128k; # 在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,该数值设置小时若负载上来时可能报502BadGateway
fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp; # 缓存临时目录
fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;
- fastcgi_buffers:指定本地需要用多少和多大的缓冲区来缓冲
FastCGI
的应答请求,如果一个php
脚本所产生的页面大小为256KB,那么会分配4个64KB的缓冲区来缓存,如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp_path
指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于磁盘。一般这个值应该为站点中php脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“8 32K”、“4 64k”等。 - fastcgi_cache_path:
fastcgi_cache
缓存目录,可以设置目录层级,比如1:2会生成16*256个子目录,cache_fastcgi
是这个缓存空间的名字,cache
是用多少内存(这样热门的内容nginx直接放内存,提高访问速度),inactive
表示默认失效时间,如果缓存数据在失效时间内没有被访问,将被删除,max_size
表示最多用多少硬盘空间。
Nginx配置模版
代码语言:javascript复制user nginx nginx;
worker_processes auto;
error_log logs/error.log error;
pid logs/nginx.pid;
worker_rlimit_nofile 65536;
events
{
use epoll;
accept_mutex off;
worker_connections 65536;
}
http
{
include mime.types;
default_type text/html;
charset UTF-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
open_file_cache max=65536 inactive=60s;
open_file_cache_valid 80s;
open_file_cache_min_uses 1;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
server_tokens off;
fastcgi_temp_path /tmp/fastcgi_temp;
fastcgi_cache_path /tmp/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128m inactive=30m max_size=1g;
fastcgi_cache_key $request_method://$host$request_uri;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout http_500 http_503 invalid_header;
keepalive_timeout 60;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 64k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml rss text/javascript;
server
{
listen 80;
server_name localhost;
index index.html;
root /App/web;
location ~ . .(php|php5)$
{
fastcgi_pass unix:/tmp/php.sock;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_cache cache_fastcgi;
}
location ~ . .(gif|jpg|jpeg|png|bmp|swf|txt|csv|doc|docx|xls|xlsx|ppt|pptx|flv)$
{
expires 30d;
}
location ~ . .(js|css|html|xml)$
{
expires 30d;
}
location /nginx-status
{
stub_status on;
allow 192.168.1.0/24;
allow 127.0.0.1;
deny all;
}
}
}
希望大家配置出适合自己项目的最优Nginx
,博客借鉴于: http://www.ttlsa.com/nginx/web-server-nginx-optimization/