Nginx
开源项目网站: http://nginx.org/
商业化项目网站: https://nginx.com/
中文商业化项目网站: https://www.nginx-cn.net/
Tengine 官网 https://tengine.taobao.org/
下载页面: https://nginx.org/en/download.html
安装源配置页面: https://nginx.org/en/linux_packages.html
nginx数据流向
1 客户端(client)发起 HTTP/HTTPS 请求到 Nginx。
2 Nginx 的 Worker 进程通过多路复用技术接收请求,根据请求类型和配置,使用相应模块(如ht_proxy、ht_fastcgi 等)进行处理。
3 如果请求需要与后端服务器(Backend)交互,Worker 进程通过指定协议(HTTP、FastCGI 等)将请求转发给后端服务器。
4 后端服务器处理请求后返回响应,Nginx 的 Worker 进程接收响应,若配置了 Proxy Cache,会根据缓存策略决定是否缓存响应,最后将响应返回给客户端。
文件描述符相关扩展
1 整个系统可打开的文件描述符总数上限
[root@ubuntu ~]# cat /proc/sys/fs/file-max
9223372036854775807
2 单个进程能打开的文件描述符最大数量
[root@ubuntu ~]# cat /proc/sys/fs/nr_open
1048576
3 每个进程都有软限制,界定当前进程可打开文件描述符数量上限
[root@ubuntu ~]# ulimit -n
1024
4 硬限制是软限制能达到的最大值,普通用户无法自行提高,需 root 权限修改。
[root@ubuntu ~]# ulimit -Hn
1048576
Nginx安装
Ubuntu系统软件安装
查看软件
root@ubuntu24:~# apt list nginx -a
root@ubuntu24:~# apt install nginx -y
注意:
默认情况下会安装 nginx-common软件包,所以我们需要额外安装 nginx-core fcgiwrap nginx-doc
推荐安装命令
root@ubuntu24:~# apt install nginx nginx-core fcgiwrap nginx-doc
查看服务状态
root@ubuntu24:~# systemctl is-active nginx
active
root@ubuntu24:~# netstat -tnulp | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5516/nginx: master
tcp6 0 0 :::80 :::* LISTEN 5516/nginx: master
配置文件目录
root@ubuntu24:~# ls /etc/nginx/
默认首页
root@ubuntu24:~# ls /var/www/html/
查看版本信息
root@ubuntu24:~# nginx -V
注意:
如果无法正常访问web页面的话,那么有可能是防火墙导致的
root@ubuntu24:~# systemctl disable --now ufw.service
Rocky/CentOS系列系统安装
查看软件
[root@rocky9 ~]# yum list nginx
软件安装
[root@rocky9 ~]# yum install nginx nginx-core -y
注意:
默认情况下,会安装依赖包nginx-core、nginx-filesystem、rocky-logos-httpd
查看nginx的状态
[root@rocky9 ~]# systemctl is-active nginx
设置为开机自启动
[root@rocky9 ~]# systemctl enable --now nginx
配置文件目录
Rocky系统
[root@rocky9 ~]# ls /etc/nginx/
默认首页
[root@rocky9 ~]# ls /usr/share/nginx/html/
源码编译安装(Ubuntu示例)
编译环境准备
apt install build-essential gcc g++ libc6 libc6-dev libpcre3 libpcre3-dev libssl-dev libsystemd-dev zlib1g-dev
apt install libxml2 libxml2-dev libxslt1-dev php-gd libgd-dev geoip-database libgeoip-dev
注意:
第二条编译环境内容是 默认二进制环境开启功能所依赖的库环境
如果是CentOS/Rocky系列系统,需要安装如下编译所需软件
rocky9系统
yum install gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-
devel systemd-devel zlib-devel
yum install libxml2 libxml2-devel libxslt libxslt-devel php-gd gd-devel
创建运行用户
root@ubuntu24:~# useradd -r -s /usr/sbin/nologin nginx
下载最新版源码并解压
root@ubuntu24:~# wget https://nginx.org/download/nginx-1.22.1.tar.gz
定制配置
root@ubuntu24:~# tar xf nginx-1.22.1.tar.gz
root@ubuntu24:~# cd nginx-1.22.1/
root@ubuntu24:nginx-1.22.1# ./configure --prefix=/data/server/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
编译安装
root@ubuntu24:nginx-1.22.1# make && make install
确认效果
修改目录属主属组并查看
root@ubuntu24:nginx-1.22.1# chown -R nginx:nginx /data/server/nginx/
查看目录结构
root@ubuntu24:nginx-1.22.1# ls -l /data/server/nginx/
total 16
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 conf #配置文件目录
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 html #网站文件根目录
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 logs #日志文件目录
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 sbin #二进制程序目录
创建软链接
root@ubuntu24:nginx-1.22.1# ln -sv /data/server/nginx/sbin/nginx /usr/sbin/nginx
查看版本
root@ubuntu24:nginx-1.22.1# nginx -v
nginx version: nginx/1.22.1
定制专属管理
创建PID 目录
root@ubuntu24:~# mkdir /data/server/nginx/run
root@ubuntu24:~# chown -R nginx:nginx /data/server/nginx/run
修改配置文件,设置pid文件路径
root@ubuntu24:~# cat /data/server/nginx/conf/nginx.conf
pid /data/server/nginx/run/nginx.pid;
定制服务文件 - 注意:如果pid文件路径不一样,会导致nginx服务无法启动
创建nginx服务脚本
root@ubuntu24:~# cat /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/data/server/nginx/run/nginx.pid
ExecStart=/data/server/nginx/sbin/nginx -c /data/server/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
重载服务脚本
root@ubuntu24:~# systemctl daemon-reload
用服务启动
root@ubuntu24:~# systemctl start nginx
查看状态
root@ubuntu24:~# systemctl status nginx.service
Nginx命令
root@ubuntu24:~# nginx -h
nginx version: nginx/1.24.0 (Ubuntu)
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
[-e filename] [-c filename] [-g directives]
常用选项
v #显示版本信息
t #检查并测试配置文件
一般选项
?|-h #显示帮助信息
V #显示版本信息和编译项
T #检查并测试配置文件,且输出配置文件内容
q #在配置文件测试期间禁止显示非错误消息
s signal #发送信号 stop|quit|reopen|reload
p prefix #指定运行目录,默认是 /usr/share/nginx/
c filename #指定配置文件,默认是 /etc/nginx/nginx.conf
g directive #启动时指定一些全局配置项,而不用修改配置文件,格式为 k v
信号说明
stop #立即停止,没处理完的请求也会被立即断开,相当于信号 SIGTERM,SIGINT
quit # 优雅退出,不再接收新的请求,但己建立的连接不受影响,相当于信号 SIGQUIT
reopen #重开一个新的日志文件,日志内容写新文件,相当于信号 SIGUSR1
reload #重新加载配置文件,重新生成worker 进程,不中断正在处理的请求,
#己建立的连接按旧配置处理,新连接用新配置处理
#同 systemctl reload nginx
SIGUSR2 #平滑升级二进制文件,适用于版本升级
SIGWINCH #优雅的停止工作进程,适用于版本升级
Nginx配置
默认配置
root@ubuntu24:~# grep -Ev '#|^$' /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf; # 查看扩展的配置项
events {
worker_connections 768; # 每个worker可以维持768个连接
# 默认开启两个worker,并发数为 768*2
}
http {
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
启动效果
root@ubuntu24:~# ps aux | grep nginx
root 2823 0.0 0.0 11156 1716 ? Ss 13:05 0:00 nginx: master
process /usr/sbin/nginx -g daemon on; master_process on;
www-data 2824 0.0 0.1 12936 4532 ? S 13:05 0:00 nginx: worker
process
www-data 2825 0.0 0.1 12936 4404 ? S 13:05 0:00 nginx: worker
process
结果显示:
默认启动了两个进程
root@ubuntu24:~# pstree -p | grep nginx
|-nginx(2823)-+-nginx(2824)
| `-nginx(2825)
配置文件格式
- 配置文件由指令与指令块构成
- 每条指令以 ; 分号结尾,指令与值之间以空格符号分隔
- 可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
- 指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
- include 语句允许组合多个配置文件以提升可维护性
- 使用 # 号添加注释,提高可读性
- 使用 $ 符号使用变量
- 变量分为 Nginx 内置变量和自定义变量,自定义变量用 set 指令定义
- 部分指令的参数支持正则表达式
nginx配置完整结构
# --- 全局配置段 ---
user ...;
worker_processes ...;
...
# --- 事件驱动相关的配置 ---
events {
...;
}
# --- http/https 协议相关配置段 ---
http {
...;
server {
...;
location {
...;
}
}
}
# --- mail 协议相关配置段,默认被注释 ---
mail {
server {
...;
}
}
# --- stream 协议相关配置 ---
stream {
...;
}
nginx7层负载配置示例
http{
...
upstream app_servers{
server ip1:port1;
server ip2:port2;
server ip3:port3;
}
server {
...
location / {
proxy_pass http://app_servers;
}
}
}
Nginx配置优化
cpu亲和性,将worker_cpu_affinity 参数设为auto
零拷贝,内核拷贝数据 sendfile on
gzip压缩优化
expires缓存
网络IO事件模型优化 epoll
隐藏软件名称和版本号
防盗链优化
禁止恶意域名解析
禁止通过IP地址访问网站
HTTP请求方法优化
防DOS攻击单IP并发连接的控制,与连接速率控制
严格设置web站点目录的权限
将nginx进程以及站点运行于监牢模式
通过robot协议以及HTTP_USER_AGENT防爬虫优化
配置错误页面根据错误码指定网页反馈给用户
nginx日志相关优化访问日志切割轮询,不记录指定元素日志、最小化日志目录权限
限制上传到资源目录的程序被访问,防止木马入侵系统破坏文件
FastCGI参数buffer和cache配置文件的优化
php.ini和php-fpm.conf配置文件的优化
有关web服务的Linux内核方面深度优化(网络连接、IO、内存等)
nginx加密传输优化(SSL)
web服务器磁盘挂载及网络文件系统的优化
使用nginx cache
https配置优化
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
打开文件缓存
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
优化配置参考
1. worker_processes 8;
nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。
2. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
为每个进程分配cpu,上例中将8 个进程分配到8 个cpu,当然可以写多个,或者将一个进程分配到多个cpu。
3. worker_rlimit_nofile 65535;
这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。 这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
4. use epoll
5. worker_connections 65535
每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections。
6. keepalive_timeout 60;
7. client_header_buffer_size 4k;
客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k
8. open_file_cache max=65535 inactive=60s;
这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
9. open_file_cache_valid 80s;
这个是指多长时间检查一次缓存的有效信息。
10. open_file_cache_min_uses 1;
open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。
Nginx处理location区块顺序
location = / {
# = 等号配置符,只匹配 / 这个路由
}
location /data {
# 留空配置,会匹配有 /data 开始的路由,后续有匹配会往下匹配。
}
location ^~ /img/ {
# 注意 ^~ 配置,这里匹配到 /img/ 开始的话,直接就返回了。
}
location ~* .(png|gif|ico|jpg|jpeg)$ {
# 匹配以 png, gif, ico, jpg or jpeg 结尾的请求;这个通常用来设置图片的请求响应。
}作者:于浩 创建时间:2025-05-28 11:59
最后编辑:于浩 更新时间:2026-07-12 22:32
最后编辑:于浩 更新时间:2026-07-12 22:32