Nginx配置文件解读
Nginx安装完毕后,会产生相应的安装目录,根据前面的安装路径,Nginx的配置文件路径为/usr/local/nginx/conf,其中nginx.conf为Nginx的主配置文件。这里重点介绍下nginx.conf这个配置文件。
Nginx配置文件默认有五个部分组成:分别是main、events、http、server和location,其中,main部分设置的指令将影响其他所有设置;events部分用来配置影响Nginx服务器或与用户的网络连接;http部分可以嵌套多个server,主要用来配置代理,缓存,自定义日志格式等绝大多数功能和第三方模块的配置,server部分用于配置虚拟主机的相关参数;location部分用于配置请求的处理规则,以及各种页面的处理情况。这五者之间的关系是:main与events平级,一个http中可以有多个server,server继承main,location继承server。
1、Nginx的全局配置项
常用的全局配置项含义如下:
-
user
:指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行,这里指定用www用户和组运行。 -
worker_processes
:设置nginx工作的进程数,一般来说,设置成CPU核的数量即可,这样可以充分利用CPU资源,可通过如下命令查看CPU核数:[root@centos nginx]#grep ^processor /proc/cpuinfo | wc –l
在nginx1.10版本后,worker_processes指令新增了一个配置值auto,它表示nginx会自动检测CPU核数并打开相同数量的worker进程。
-
worker_cpu_affinity
:此指令可将Nginx工作进程与指定CPU核绑定,降低由于多核CPU切换造成的性能损耗。 worker_cpu_affinity使用方法是通过1、0来表示的,CPU有多少个核?就有几位数,1代表内核开启,0代表内核关闭,例如:有一个4核的服务器,那么nginx配置中worker_processes、worker_cpu_affinity的写法如下:
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
上面的配置表示:4核CPU,开启4个进程,每个进程都与CPU的每个核进行绑定。其中,0001表示开启第一个cpu内核,0010表示开启第二个cpu内核,其它含义依次类推。如果是8核CPU,绑定第一个CPU核,可以写成00000001,绑定第二个CPU核,可以写成00000010,依次类推。
worker_cpu_affinity指令一般与worker_processes配合使用,以充分发挥nginx的性能优势。
-
error_log
:用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。 -
pid
:用来指定进程id的存储文件位置。 -
worker_rlimit_nofile
:用于指定一个Nginx进程可以打开的最多文件描述符数目,这里是65535,需要使用命令“ulimit -n 65535
”来设置。 -
events
:设定Nginx的工作模式及连接数上限。其中参数“use”用来指定Nginx的工作模式,Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,对于Linux系统,epoll工作模式是首选。而参数“worker_connections”用于定义Nginx每个进程的最大连接数,默认是1024。在一个纯Nginx(无反向代理应用)应用中,最大客户端连接数由worker_processes和worker_connections决定,即为:max_client=worker_processes*worker_connections。 进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
配置示例
user nginx nginx; # 格式:user [user] [group]
error_log /var/log/nginx/error.log notice; # 格式:error_log [路径] [日志级别]
pid /var/run/nginx.pid; # 存储 master 进程 ID 的文件路径
worker_rlimit_nofile 65535; # 设置 worker 进程能打开的最大文件数
worker_processes auto; # 自动匹配 CPU 核心数
worker_cpu_affinity auto; # 自动绑定(Nginx 1.9.10+ 支持)
# 手动指定、手动绑定(以 4 核 CPU 为例):
# worker_processes 4;
# worker_cpu_affinity 0001 0010 0100 1000;
events {
worker_connections 4096; # 每个 worker 进程的最大并发连接数
use epoll; # Linux 下高效事件模型(默认自动选择)
multi_accept on; # 是否一次接受所有新连接
accept_mutex off; # 是否启用互斥锁(高并发时建议 off)
}
http {
# 其他 http 配置...
}
2、HTTP服务器配置
常用的HTTP配置项含义如下:
include
:是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。类似于Apache中的include方法。default_type
:属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。log_format
:用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。Sendfile on
:用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。keepalive_timeout
:设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。server_names_hash_bucket_size 128
:为了提高快速寻找到相应server name的能力,Nginx使用散列表来存储server name,而server_names_hash_bucket_size就是设置每个散列桶占用的内存大小。client_max_body_size 30m
:用来设置允许客户端请求的最大的单个文件字节数。client_header_buffer_size 32k
:用于指定来自客户端请求头的header buffer大小。对于大多数请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲区大小。这里设置为32K。large_client_header_buffers 4 128k
:用来指定客户端请求中较大的消息头的缓存最大数量和大小, “4”为个数,“128K”为大小,最大缓存量为4个128K。
配置示例
http {
include /etc/nginx/mime.types; # 加载外部配置文件(定义 MIME 类型,如 text/css、image/png 等)
default_type application/octet-stream; # 设置默认的 MIME 类型(当无法识别文件类型时使用)
# 定义访问日志的格式(变量说明见注释)
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 /var/log/nginx/access.log main; # 启用访问日志,使用名为 "main" 的日志格式
sendfile on; # 启用高效文件传输(零拷贝技术,减少 CPU 占用)
tcp_nopush on; # 仅在发送完整数据包时传输(减少网络包碎片,需配合 sendfile)
tcp_nodelay on; # 禁用 Nagle 算法,立即发送小数据包(降低延迟)
keepalive_timeout 65; # 设置客户端长连接的超时时间为 65 秒
server_names_hash_bucket_size 128; # 设置 server_name 哈希表中每个桶的内存大小为 128 字节(避免长域名冲突)
large_client_header_buffers 4 128k; # 设置大请求头的缓冲区:4 个 128KB 的缓冲区
client_header_buffer_size 32k; # 设置普通请求头的缓冲区大小为 32KB
client_max_body_size 30m; # 限制客户端上传文件的最大大小为 30MB
# 定义一个虚拟主机(server 块)
server {
listen 80; # 监听 80 端口(HTTP 默认端口)
server_name example.com; # 设置虚拟主机的域名
root /var/www/html; # 设置网站的根目录路径
index index.html; # 设置默认索引文件(按顺序查找)
}
}
关键变量说明(log_format
)
$remote_addr
:客户端 IP 地址。$remote_user
:HTTP Basic Auth 认证的用户名(若无则为-
)。$time_local
:本地时间(格式为[day/month/year:hour:minute:second zone]
)。$request
:请求方法、路径和协议(如GET /index.html HTTP/1.1
)。$status
:HTTP 响应状态码(如 200、404)。$body_bytes_sent
:发送给客户端的响应体大小(字节)。$http_referer
:请求来源页面的 URL(若无则为-
)。$http_user_agent
:客户端浏览器标识(如Mozilla/5.0
)。$http_x_forwarded_for
:代理服务器传递的客户端 IP(若无则为-
)。
3、HttpGzip模块配置
常用的HttpGzip配置项含义如下:
gzip on
:用于设置开启或者关闭gzip模块,“gzip on”表示开启GZIP压缩,实时压缩输出数据流。gzip_min_length 1k
:设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。gzip_buffers 4 16k
:表示申请4个单位为16K的内存作为压缩结果流缓存,默认是申请与原始数据大小相同的内存空间来存储gzip压缩结果。gzip_http_version 1.1
:用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。gzip_comp_level 2
:用来指定GZIP压缩比,1表示压缩比最小,处理速度最快;9表示压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源。gzip_types text/plain application/x-javascript text/css application/xml
:用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的。gzip_vary on;
是一个用于优化 HTTP 压缩(Gzip)的指令。它的作用是告诉 Nginx 在响应头中添加Vary: Accept-Encoding
,以帮助缓存服务器(如 CDN、代理服务器)正确处理压缩后的内容。在启用 Gzip 压缩时,建议始终开启此选项。
配置示例
http {
gzip on; # 启用 Gzip 压缩(默认 off,建议开启)
gzip_min_length 1k; # 设置触发压缩的最小文件大小(小于 1KB 的文件不压缩)
gzip_buffers 4 16k; # 设置 Gzip 压缩缓冲区数量和大小(4 个 16KB 的缓冲区)
gzip_http_version 1.1; # 设置支持 Gzip 压缩的最低 HTTP 协议版本(1.1 支持持久连接)
gzip_comp_level 2; # 设置 Gzip 压缩级别(1-9,2 为低压缩率,平衡 CPU 和带宽)
# 指定需要压缩的 MIME 类型(文本、JS、CSS、XML)
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on; # 添加 Vary: Accept-Encoding 响应头
server {
# 其他 server 块配置...
}
}
4、server虚拟主机配置
常用的server配置项含义如下:
server
:定义虚拟主机开始的关键字。listen
:用于指定虚拟主机的服务端口。server_name
:用来指定IP地址或域名,多个域名之间用空格分开。index
:用于设定访问的默认首页地址。root
:用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。access_log
:用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。error_page
指令可以定制各种错误信息的返回页面。在默认情况下,Nginx会在主目录的html目录中查找指定的返回页面,特别需要注意的是,这些错误信息的返回页面的大小一定要超过512K,否者会被IE浏览器替换为IE默认的错误页面。
多虚拟主机的含义
在 Nginx 中,**多虚拟主机(Multi-Virtual Host)**是指通过配置多个 server
块,让一台服务器(或同一个 IP 地址)能够同时托管多个不同的网站或服务。每个虚拟主机独立处理自己域名的请求,拥有独立的配置(如根目录、日志、错误页面等),互不干扰。
为什么需要多虚拟主机?
- 资源隔离
- 每个虚拟主机可以独立管理文件、日志和配置,避免不同项目之间的冲突。
- 例如:
example.com
和test.com
的文件分别存储在/var/www/example.com
和/var/www/test.com
。
- 节省成本
- 一台服务器可以托管多个域名,无需为每个网站单独购买服务器或 IP 地址。
- 例如:共享 IP 的多个网站通过
server_name
区分请求。
- 灵活配置
- 不同虚拟主机可以配置不同的 PHP 版本、SSL 证书、访问控制等。
- 例如:
example.com
使用 PHP 8.2,而legacy.com
使用 PHP 7.4。
- 测试与生产环境隔离
- 可以在同一台服务器上运行生产环境和测试环境(如
prod.example.com
和test.example.com
)。
- 可以在同一台服务器上运行生产环境和测试环境(如
多虚拟主机的实现原理
Nginx 通过以下机制实现多虚拟主机:
server_name
匹配- 当客户端发起请求时,Nginx 根据请求头中的
Host
字段(域名)匹配对应的server
块。 - 例如:请求
http://example.com
会匹配server_name example.com;
的配置。
- 当客户端发起请求时,Nginx 根据请求头中的
- 默认服务器(Default Server)
- 如果没有匹配的
server_name
,请求会由default_server
处理。 - 例如:未列出的域名(如
unknown.com
)会被listen 80 default_server;
捕获。
- 如果没有匹配的
- 端口复用
- 多个虚拟主机可以共享同一个端口(如 80 或 443),通过域名区分。
配置示例
模拟多虚拟主机:
http {
# 全局配置(如 Gzip、日志格式等)...
# 第一个虚拟主机:处理 example.com 的请求
server {
listen 80; # 监听 80 端口(HTTP 默认端口)
server_name example.com www.example.com; # 设置虚拟主机的主域名(支持通配符和正则)
root /var/www/example.com/html; # 设置网站的根目录路径
index index.html index.php; # 设置默认索引文件(按顺序查找)
access_log /var/log/nginx/example.com.access.log; # 自定义访问日志路径(默认使用 HTTP 块的 access_log)
# 定义错误页面(如 404、500)
error_page 404 /404.html; # 自定义 404 错误页面,这里的/根目录指的是root /var*/*html目录
error_page 500 502 503 504 /50x.html; # 自定义 500、502、503、504 错误页面
# 处理静态文件请求(匹配所有路径)
location / {
try_files $uri $uri/ =404; # 按顺序尝试查找文件或目录,不存在则返回 404
}
# 处理 PHP 请求(匹配以 .php 结尾的路径,需 PHP-FPM 支持)
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # 将 PHP 请求转发到本地的 PHP-FPM 服务(默认端口 9000)
include fastcgi_params; # 加载 PHP-FPM 所需的通用参数(如 SCRIPT_FILENAME)
}
}
# 第二个虚拟主机:处理 test.com 的请求
server {
listen 80;
server_name test.com www.test.com;
root /var/www/test.com/html;
index index.html;
access_log /var/log/nginx/test.com.access.log;
error_page 404 /custom_404.html;
location / {
try_files $uri $uri/ =404;
}
}
# 可选:默认服务器块(匹配未列出的域名)
server {
listen 80 default_server;
server_name _;
return 444; # 直接关闭连接(或重定向到其他页面)
}
}
5、Nginx通用配置模板
# 全局配置
user nginx; # 运行用户(根据系统调整)
worker_processes auto; # 自动根据 CPU 核心数分配进程
worker_rlimit_nofile 65535; # 单进程最大文件描述符数(需配合系统 ulimit)
pid /var/run/nginx.pid; # PID 文件路径
# 事件模块配置(高并发核心)
events {
use epoll; # Linux 高效事件模型(必选)
worker_connections 4096; # 单进程最大连接数(根据内存调整)
multi_accept on; # 一次接受所有新连接(减少系统调用)
accept_mutex off; # 高并发下关闭互斥锁(提升多核性能)
}
# HTTP 模块配置
http {
include /etc/nginx/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"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
# 发送文件优化
sendfile on; # 启用高效文件传输
tcp_nopush on; # 减少网络包数量(需配合 sendfile)
tcp_nodelay on; # 禁用 Nagle 算法(低延迟场景)
# 连接超时设置
keepalive_timeout 65; # 长连接超时时间(秒)
keepalive_requests 1000; # 单长连接最大请求数
# 缓冲区优化
client_body_buffer_size 16k; # 请求体缓冲区大小
client_header_buffer_size 1k; # 请求头缓冲区大小
large_client_header_buffers 4 8k; # 大请求头缓冲区
# Gzip 压缩(节省带宽)
gzip on;
gzip_disable "MSIE [1-6]\."; # 禁用旧版 IE 的 gzip
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 虚拟主机配置示例
server {
listen 80;
server_name example.com www.example.com;
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; # 缓存 30 天
add_header Cache-Control "public";
}
# 根目录配置
root /usr/share/nginx/html;
index index.html index.htm;
# 错误页面
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
# 反向代理示例(如需)
location /api/ {
proxy_pass http://backend_server; # 将匹配 /api/ 的请求转发到http://backend_server
proxy_set_header Host $host; # 设置转发给后端服务器的请求头 Host(保持原始域名),作用:避免后端服务因 Host 头丢失而无法正确处理请求(如多租户系统)。
proxy_set_header X-Real-IP $remote_addr; # 设置转发给后端服务器的请求头 X-Real-IP(传递客户端真实 IP),作用:后端服务可以通过 X-Real-IP 记录或验证客户端 IP(如日志记录、限流、风控)。
}
}
}