Nginx 基础配置(二):常见配置
一、常见配置注解
user www www; # 定义运行 nginx 的用户以及用户组
worker_processes 2; # nginx 进程数
#worker角色的工作进程的个数,master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数
#查看CPU核数:grep ^processor /proc/cpuinfo | wc -l,如果开启了 ssl 和 gzip 更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。
#ps -ef | grep nginx,可以看到有一个master进程,多个work进程,work进程数在这里配置
worker_cpu_affinity auto; # 配置 nginx 进程的 CPU 亲缘性
error_log /var/log/nginx/error.log info; # 定义全局错误日志的类型,默认为 error ,错误日志路径
worker_rlimit_nofile 51200; # 一个 worker 进程最多能打开的文件数量
#worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件
pid /var/run/nginx.pid; # 进程文件
#进程号,可用于杀进程重启等,不用ps -ef 查询了。
worker_priority -10; # 在 Linux 系统下资源使用的优先级
worker_shutdown_timeout 30; # 若在 30s 内 Nginx 无法“平滑”退出,则强行关闭进程。
events {
use epoll; # epoll事件模型,用在 Linux 2.6 以上版本内核的高性能网络 I/O 上
#如果是 FreeBSD,则用 kqueue 模型
worker_connections 51200; # 单个进程的最大连接数(整个 Nginx 的最大连接数 = 单个进程的最大连接数 X 进程数)
#worker进程同时打开的最大连接数。系统连接数有限制,所以设置不切实际的高没什么好处,不要超过上面的worker_rlimit_nofile值
}
http {
include mime.types; # 设定mime类型,即文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型
#日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
client_header_buffer_size 1k; # 设置用户请求头所使用的 buffer 的大小
large_client_header_buffers 4 4k; # 当默认的缓冲区大小不够用时,就会使用此参数
server_names_hash_bucket_size 128; # 设置 server_names 散列表的桶的大小,在域名比较多的情况下需要调整这个值
gzip on; # 开启gzip压缩
gzip_comp_level 6; # 设置 gzip 压缩等级,1 最小,但处理速度最快;9 最大,但处理速度最慢(传输快但比较消耗cpu)
gzip_min_length 1k; # 大于1k才压缩
gzip_buffers 4 8k; # 设置系统需要多大的缓存用于存储 gzip 的压缩结果数据流。4 8k代表以8k为单位,原始数据大小以 8k 为单位的 4 倍申请内存。
gzip_types text/plain text/css text/xml text/javascript application/xml application/json;
#匹配mime类型进行压缩,无论是否指定, text/html 类型总是会被压缩的
access_log logs/access.log main; #访问日志路径
sendfile on; # 启用 sendfile() 函数,开启高效文件传输模式
# sendfile 指令指定 nginx 是否调用 sendfile() 函数来输出文件,减少用户空间到内核空间的上下文切换。
# 对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
tcp_nopush on; # 设置调用tcp_cork方法,为了防止网络阻塞,需要开启 sendfile
#在一个数据包里发送所有头文件。tcp_nopush = on 会设置调用tcp_cork方法。
#默认on,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。
#tcp_nodelay on; # 和指令tcp_nopush互斥,不缓存,立刻发送数据包。为了防止网络阻塞,需要开启 sendfile
keepalive_timeout 65; # 长连接超时时间,单位是秒。
# 服务器将在这个超时时间过后关闭链接。所以文件上传超过65s没有成功就失败了。
client_max_body_size 10m; #允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值
client_body_buffer_size 32K; #缓冲区代理缓冲用户端请求的最大字节数
client_body_timeout 60; #设置请求体的超时时间
client_header_timeout 30; #设置请求头的超时时间
server_tokens off; #关闭在错误页面中的nginx版本数字,隐藏版本的bug
send_timeout 10; #用于指定响应客户端的超时时间。
#用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
upstream backend { # upstream块,weight 代表权重
server 192.168.1.12:8081 weight=3;
server 192.168.1.13:8081 weight=2;
# 权重越高,请求的比例越高
}
server {
listen 80;
server_name www.xx.com;
access_log /var/log/nginx/access_log main;
charset koi8-r;
location / {
proxy_pass http://backend;
proxy_redirect off;
proxy_set_header Host $host; #设置header, 内容为host
proxy_set_header X-Real-Ip $remote_addr;
#后端服务器通过 X-Forwarded-For 获取用户的真实 IP 地址
#X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外)代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中
#如果只有一层代理,这两个头的值就是一样的
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 404 /404.html; # 对后端服务器抛出的错误 404 进行页面重定向
location /404.html {
root /spool/www; # 文件路径
}
location ~* \.(jpg|jpeg|gif)$ {
root /spool/www;
expires 30d; # 浏览器保留缓存的时间,如有 CDN,则 CDN 也会进行缓存
}
}
}
二、常见配置技巧
1.user
默认是 nobody,会导致权限问题,一般会使用低于 root 级别的用户(如 www 等),并在 Linux 下禁止用户通过 SSH 登录服务器,以提高安全性。
2.worker_processes
代表 worker 进程数,一般情况下建议和服务器的 CPU 核心数相同;也可以使用 worker_processes auto (Nginx 1.2.5版本之后),它会自动根据 CPU 核心数启动进程。实际应用中,需要考虑服务器的分配,避免因进程启动过多导致过多的上下文切换。
3.worker_cpu_affinity auto
在 1.9.10 中添加,表示可以根据服务器的 CPU 核心数自动设置 CPU 亲缘性,以提升 Nginx 性能。
4.error_log & access_log
关于日志记录的配置。如果将 error_log 配置为 error 级别,可以减少不必要的日志记录;如果是测试环境可以设置为 info 级别。配置日志记录需要考虑硬盘的独立性,不要使用 Linux 的根分区,以避免出现大量 I/O 影响 Linux 服务器的吞吐能力,要单独挂载到一个磁盘上,使用独立 I/O 。
另外,需要注意硬盘的使用寿命,关注 message 的日志,定期检查硬盘(Nginx 在记录日志时是异步处理的,因此不会因为硬盘问题导致请求异常,但会影响日志记录)。
5.worker_priority
配置 Nginx 在 Linux 服务器上使用资源的优先级,作为反向代理服务,Nginx 应该拥有极高的优先级,因此建议配置为 -10.
6.gzip_comp_level
配置压缩等级,等级最高为 9 ,等级越高压缩后的文件越小,但是消耗的 CPU 资源也会越多。经测试,文件压缩等级为 7 和 9时,在文件大小上只有细微的差别,一般用 5 ~ 7 的等级就可以了。
7.upstream 块
配置后端服务器,可以结合 proxy_next_upstream 等指令进行大量优化
8.error_page
对错误进行重定向,在捕获后端服务器错误的状态码后,将请求重定向到其他位置,如友好的提示页面。
9.location & root
通过 root 路径可以读取静态文件,在 Nginx 1.7.11 版本之前,当 Nginx 读取硬盘文件时,都是进行阻塞型操作;后来引入了线程池,为读取硬盘文件提供了非阻塞型的操作,极大的提升了硬盘 I/O 的速度,也提升了 proxy_cache 的缓存能力。
Nginx 的常见配置在使用中有着不同的变化,可以在 Nginx 的官方 Wiki 中查看。