OS:CentOS 7
一、准备工作
1.1、安装编译器及支持库
sudo yum install -y gcc gcc-c++ pcre-devel zlib-devel openssl-devel libxml2-devel libxslt-devel gd-devel
1.2、内核参数优化(/etc/sysctl.conf)
fs.file-max = 9999
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keeplive_time = 60
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 61000
net.ipv4.tcp_rmem = 4096 32768 262142
net.ipv4.tcp_wmem = 4096 32768 262142
net.core.netdev_max_backlog = 8096
net.core.rmem.default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn.backlog = 1024
二、安装
wget -q http://nginx.org/download/nginx-1.15.0.tar.gz
tar -zxvf nginx-1.15.0.tar.gz
cd nginx-1.15.0
./configure --prefix=/app/nginx-1.15.0 \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module \
--with-http_image_filter_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module
make && make install
三、配置项
3.1、部分配置项
worker_process number worker进程数量
worker进程数量大于CPU内核数会增大进程间切换带来的消耗,如果有可能出现阻塞式调用,则需要稍多一些worker进程。
worker_cpu_affinity cpumask[cpumask...] 绑定worker进程到指定的CPU内核
示例:
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
ssl_engine device SSL硬件加速
worker_priority nice 设置Nginx worker进程的nice优先级
-20 ~ 19 不建议比内核进程的nice值(-5)更小。
3.2、.conf 文件配置说明
(1)listen
default:默认虚拟主机。
backlog=num:TCP中backlog大小,如果backlog队列满,则客户端试图通过TCP三次握手建立连接会失败。
rcvbuf=size:设置监听句柄的SO_RCVBUF参数。
sndbuf=size:设置监听句柄的SO_SNDBUF参数。
deferred:在设置此参数后,若用户发起建立连接请求,并且完成三次握手,内核也不会为这次连接调度worker进程来处理,只有用户真正发送数据时,内核才会唤醒worker进程处理这个连接。
bind:绑定当前端口/地址对,只有同时对一个端口监听多个地址才会生效。
ssl:在当前监听的端口上建立的连接必须基于ssl协议。
(2)server_name name['''];
host匹配优先级:
1、完全匹配
2、通配符在前
3、通配符在后
4、正则表达式
(3)server_name_in_redirect on|off
需要配合server_name使用,on:重定向请求时使用server_name中的第一个主机名代替原先请求中的host头部;off:在重定向请求时使用本身的host头部。
(4)location [ = | ~ | ~ * | ^ ~ | @ ] / uri / { ... }
location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择location{}块中的配置来处理请求。
匹配规则:
1、“=”表示把URI作为字符串,以便与参数中的uri做完全匹配。
2、“~” 表示匹配URI时是字母大小写敏感的。
3、“~*”表示匹配URI时忽略字母大小写问题。
4、“^~”表示匹配URI时只需要其前半部分与uri参数匹配即可。
5、“@”表示仅用于Nginx服务内部请求之间的重定向,带有@的不直接处理用户请求。
6、“/”表示匹配所有请求。
(5)root path;
配置块:http、server、location、if
定义资源文件相对于HTTP请求的根目录。
(6)alias path;
配置块:location
区别root示例:
location /conf {
alias /usr/local/nginx/conf; #丢弃location 后面的 /conf;
root /usr/local/nginx/; #紧跟location后面的 /conf;
}
(7)error_page code [ code ... ] [ = | = answer-code ] uri | @named_location
当对于某个请求返回错误码时,如果匹配上erroe_page中设置的code,则重定向到新的URI中。
*注:用户可以通过“=”来更改返回的错误码,示例:
error_page 404 =200 /empty.gif;
如果不想修改URI,只想让这样的请求重定向到另一个location中进行处理,可以设置:
location / {
error_page 404 @fallback;
}
location @fallback {
proxy_pass http://backend;
}
(8)try_files path1 [ path2 ] uri;
配置块:server、location
必须紧跟若干路径,而且最后必须要有URI参数。尝试按照顺序访问每一个path,如果可以读取,直接向用户返回文件,如果所有的path都找不到有效的文件,就重定向到最后的参数uri上。
· 内存及磁盘资源分配
(9)client_body_in_single_buffer on | off
配置块:http、server、location
用户请求中的HTTP包体一律存储到内存buffer中,超过client_body_buffer_size设置的值,还是会写入到磁盘文件中。
(10)client_header_buffer_size size;
配置块:http、server
正常情况下Nginx接受用户请求HTTPheader部分时分配的内存buffer大小。超出大小时large_client_header_buffers number size;
(11)connection_pool_size size(默认:256);
配置块:http、server
Nginx对于每个建立的成功的TCP连接会预先分配一个内存池。
(12)request_pool_size size(默认:4K)
Nginx开始处理HTTP请求时,将会为每个HTTP请求分配一个内存池。
·网络连接相关设置
(13)client_header_timeout time(默认:60s)
配置块:http、server、location
客户端与服务器建立连接后将开始接收HTTP头部。超时返回(“Request timed out”)响应。
(14)client_body_timeout time(默认:60)
读取HTTP包体超时时间。
(15)send_timeout time(默认:60s)
发送响应超时时间。
(16)reset_timeout_connection on|off (默认off)
连接超时后通过向客户端发送RST包来直接重置连接。选项打开后,超时时不再等待用户应答,避免产生许多处于FIN_WAIT_!、FIN_WAIT_2、TIME_WAIT状态的TCP连接。
(17)keepalive_disable [ msie6 | safari | none ] ... (默认:msie6 safari)
HTTP请求中的keepalive功能是为了让多个请求复用一个HTTP长连接,这个功能对服务器的性能提高很有帮助。某些浏览器对于使用keepalive功能的POST请求处理有功能性问题。
(18)keepalive_timeout time(默认:75s)
配置块:http、server、location
一个keepalive连接在闲置超过一定时间后,服务器与浏览器都会主动关闭这个连接。
(19)keepalive_request n(默认:100)
配置块:http、server、location
一个keepalive连接上默认最多能发送100个连接。
(20)tcp_nodelay on|off (默认:on)
配置块:http、server、location
确认keepalive连接是否使用TCP_NODELAY选项。
(21)tcp_nopush on|off (默认 off)
打开tcp_nopush时,将会在发送响应时把整个响应包头放在一个TCP包中发送。
·对客户端请求的限制
(22)limit_except method ... {...}
配置块 location
示例:
limit_except GET{
allow 192.168.1.0/24;
deny all;
}
注意:允许GET方法就意味着也允许HEAD方法。
(23)client_max_body_size size (默认1M)
允许最大的HTTP包体值。通过HTTP头部的Content-Length字段来确定值,可以不用等Nginx接收完所有HTTP包体就告诉用户请求过大不被接受。返回413(“Request Entity Too Large”)响应。
(24)limit_rate speed (默认:0)
配置块:http、server、location、if
对客户端请求限制每秒传输的字节数。
示例:server{
if($slow){
set $limit_rate 4k;
}
}
(24)limit_rate_after (默认1m)
此配置表示Nginx向客户端发送的响应长度超过limit_rate_affter 后才开始限速。
·文件操作的优化
(25)sendfile on|off(默认:off)
可以启用Linux内核上的sendfile系统调用来发送文件,它减少了内核态和用户态之间的两次内存复制,这样就会从磁盘中读取文件后直接在内核态发送到网卡设备,提高了发送文件的效率。