Nginx是一款高性能的Web服务器和反向代理服务器,以高并发、低内存占用、配置灵活著称。目前全球超过40%的网站使用Nginx,是站长必须掌握的工具。本教程将从安装开始,手把手教你Nginx的常用配置。
一、Nginx是什么?
1.1 Nginx简介
Nginx(发音"engine-x")是由俄罗斯程序员Igor Sysoev开发的开源Web服务器,第一个版本发布于2004年。它最初是为了解决C10K问题(同时处理10000个并发连接)而设计的,采用事件驱动的异步非阻塞架构,能在低资源消耗下处理海量并发请求。
Nginx不仅是Web服务器,还可以用作:
- 反向代理服务器:将请求转发到后端服务器(如Node.js、Python、Java应用)
- 负载均衡器:将请求分发到多台后端服务器,提高可用性和性能
- HTTP缓存服务器:缓存静态资源和动态页面,减轻后端压力
- 邮件代理服务器:代理IMAP/POP3/SMTP邮件服务
- 流媒体服务器:支持MP4、FLV等视频流媒体分发
1.2 Nginx vs Apache对比
| 对比项 | Nginx | Apache |
| 架构 | 事件驱动、异步非阻塞 | 进程/线程驱动、阻塞 |
| 并发能力 | 强,可处理数万并发 | 较弱,受进程数限制 |
| 内存占用 | 低(几十MB) | 较高(每个进程几十MB) |
| 静态文件 | 非常快 | 较快 |
| 动态请求 | 需配合后端(PHP-FPM等) | 内置模块直接处理 |
| 配置方式 | 配置文件,简洁 | 配置文件+.htaccess,灵活 |
| .htaccess | 不支持 | 支持 |
| 学习曲线 | 中等 | 较平缓 |
| 市场份额 | 约40%+(增长中) | 约30%(下降中) |
💡 选择建议
对于新手站长,推荐使用Nginx,性能更好、资源占用更低。宝塔面板默认安装的也是Nginx。如果你需要.htaccess功能(如WordPress固定链接),Nginx可以通过配置实现等效功能。
二、Nginx安装
2.1 CentOS/RHEL安装
CentOS 7/8
yum install epel-release -y
yum install nginx -y
systemctl start nginx
systemctl enable nginx
systemctl status nginx
2.2 Ubuntu/Debian安装
Ubuntu 18.04/20.04/22.04
apt update
apt install nginx -y
systemctl start nginx
systemctl enable nginx
systemctl status nginx
2.3 宝塔面板安装(推荐新手)
如果你使用宝塔面板,Nginx会在安装面板时自动安装,无需手动操作。参考我们的宝塔面板安装与使用教程。
💡 验证安装
安装完成后,在浏览器中访问服务器IP地址,如果看到Nginx欢迎页面,说明安装成功。
常用命令:nginx -t(测试配置)、nginx -s reload(重载配置)、nginx -s stop(停止)
三、Nginx配置文件结构
3.1 配置文件位置
| 系统 | 主配置文件 | 站点配置目录 |
| CentOS/RHEL | /etc/nginx/nginx.conf | /etc/nginx/conf.d/ |
| Ubuntu/Debian | /etc/nginx/nginx.conf | /etc/nginx/sites-available/ 和 sites-enabled/ |
| 宝塔面板 | /www/server/nginx/conf/nginx.conf | /www/server/panel/vhost/nginx/ |
3.2 主配置文件结构
nginx.conf 基本结构
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
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;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
gzip on;
include /etc/nginx/conf.d/*.conf;
}
3.3 配置指令层级
Nginx配置文件采用块级结构,指令有明确的层级关系:
main(全局)
└── http
├── server(虚拟主机)
│ ├── location(URL匹配)
│ │ └── if(条件判断)
│ └── upstream(负载均衡)
└── server
└── location
- main块:最外层,配置全局参数(用户、进程数、日志等)
- http块:包含所有HTTP相关配置,只能有一个
- server块:定义一个虚拟主机(网站),http块内可以有多个
- location块:定义URL路径的匹配规则,server块内可以有多个
- upstream块:定义负载均衡后端服务器组
四、虚拟主机配置
虚拟主机允许一台服务器运行多个网站。每个server块就是一个虚拟主机。
4.1 基础虚拟主机配置
/etc/nginx/conf.d/example.com.confserver {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm index.php;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ =404;
}
location ~ /\. {
deny all;
}
}
4.2 PHP网站配置(WordPress/Typecho等)
PHP网站配置server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.php index.html;
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
}
💡 宝塔面板用户
在宝塔面板中添加网站时,会自动生成Nginx配置文件,无需手动编写。需要自定义配置时,在"网站设置" → "配置文件"中修改。
五、反向代理配置
反向代理是Nginx最常用的功能之一,将请求转发到后端应用服务器(如Node.js、Python、Java应用)。
5.1 基础反向代理
反向代理到Node.js应用(端口3000)server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
5.2 常用反向代理参数说明
| 参数 | 说明 |
proxy_pass | 后端服务器地址,如 http://127.0.0.1:3000 |
proxy_set_header Host $host | 传递原始域名给后端 |
proxy_set_header X-Real-IP $remote_addr | 传递用户真实IP |
proxy_set_header X-Forwarded-For | 传递请求链中所有IP |
proxy_connect_timeout 60s | 连接后端超时时间 |
proxy_read_timeout 60s | 读取后端响应超时时间 |
proxy_send_timeout 60s | 发送请求到后端超时时间 |
proxy_buffering on | 启用响应缓冲,提高性能 |
5.3 WebSocket代理
WebSocket代理配置location /ws/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400;
}
六、负载均衡配置
当网站流量增大,一台服务器不够用时,可以用Nginx做负载均衡,将请求分发到多台后端服务器。
6.1 基础负载均衡
轮询模式(默认)
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
6.2 负载均衡策略
| 策略 | 配置 | 说明 |
| 轮询(默认) | 无需配置 | 请求按顺序轮流分配到各服务器 |
| 权重 | weight=5 | 按权重比例分配,性能好的服务器权重高 |
| IP哈希 | ip_hash | 同一IP的请求固定分配到同一服务器,保持会话 |
| 最少连接 | least_conn | 请求分配到当前连接数最少的服务器 |
| URL哈希 | hash $request_uri | 同一URL的请求固定分配到同一服务器,适合缓存 |
权重+健康检查配置示例upstream backend {
server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 backup;
}
七、静态资源缓存与Gzip压缩
7.1 静态资源缓存
静态资源缓存配置
location ~* \.(jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
location ~* \.(css|js)$ {
expires 7d;
add_header Cache-Control "public";
}
location ~* \.(html|htm)$ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
7.2 Gzip压缩
Gzip压缩配置(放在http块中)gzip on;
gzip_vary on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml application/rss+xml application/atom+xml image/svg+xml;
gzip_disable "MSIE [1-6]\.";
💡 压缩效果
Gzip压缩通常能将文本文件(HTML、CSS、JS、JSON)压缩到原来的30%-50%,大幅减少传输数据量,提升网站加载速度。图片、视频等已经压缩过的文件不需要再用Gzip压缩。
八、HTTPS配置
8.1 SSL证书配置
HTTPS配置server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
⚠️ HSTS注意事项
开启HSTS后,浏览器会在max-age时间内强制使用HTTPS访问,如果你的HTTPS配置有问题(如证书过期),用户将无法访问网站。建议先确保HTTPS稳定运行一段时间后再开启HSTS。
九、伪静态与URL重写
9.1 WordPress伪静态
WordPress固定链接配置location / {
try_files $uri $uri/ /index.php?$args;
}
9.2 Typecho伪静态
Typecho伪静态配置if (!-e $request_filename) {
rewrite ^(.*)$ /index.php$1 last;
}
9.3 常用rewrite规则
URL重写示例
server {
listen 80;
server_name old.com;
return 301 https://new.com$request_uri;
}
server {
listen 80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php/$1 last;
}
}
location ~* \.(env|log|sql|bak|ini|sh)$ {
deny all;
return 404;
}
十、安全配置
10.1 基础安全配置
Nginx安全加固
server_tokens off;
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location ~* \.(env|log|sql|bak|ini|conf|sh|py)$ {
deny all;
return 404;
}
client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
10.2 限制访问IP(后台保护)
只允许特定IP访问后台location /admin/ {
allow 192.168.1.100;
allow 10.0.0.0/8;
deny all;
proxy_pass http://127.0.0.1:3000;
}
10.3 限流防CC攻击
限制请求频率(防CC攻击)
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
location / {
limit_req zone=one burst=20 nodelay;
}
十一、Nginx常用命令
| 命令 | 说明 |
nginx -t | 测试配置文件语法是否正确(修改配置后必执行) |
nginx -s reload | 重新加载配置(平滑重启,不中断服务) |
nginx -s stop | 快速停止Nginx |
nginx -s quit | 优雅停止(等待当前请求完成后停止) |
nginx -s reopen | 重新打开日志文件(日志切割后使用) |
nginx -v | 查看Nginx版本 |
nginx -V | 查看Nginx版本和编译参数 |
systemctl status nginx | 查看Nginx运行状态 |
systemctl restart nginx | 重启Nginx(会短暂中断服务) |
⚠️ 重要提醒
修改Nginx配置后,必须先执行 nginx -t 测试配置,确认没有语法错误后再执行 nginx -s reload 重载配置。如果配置有错误直接reload,可能导致Nginx停止服务,网站无法访问!
十二、常见问题FAQ
Q1:Nginx启动失败,提示"address already in use"怎么办?
A:端口被占用。通常是80或443端口被其他程序(如Apache)占用。解决方法:
- 查看占用端口的进程:
netstat -tlnp | grep :80
- 停止占用端口的程序:
systemctl stop httpd(停止Apache)
- 或者修改Nginx监听端口
Q2:访问网站显示403 Forbidden怎么办?
A:403通常是权限问题,检查以下几点:
- 网站根目录权限是否正确(目录755,文件644)
- Nginx运行用户是否有网站目录的读取权限
- 根目录下是否有index.html或index.php等默认首页文件
- 配置文件中root指令指向的路径是否正确
- SELinux是否阻止了访问(CentOS默认开启,可临时关闭测试)
Q3:PHP网站显示"File not found"怎么办?
A:这是PHP-FPM找不到文件的错误,通常是fastcgi_param SCRIPT_FILENAME配置错误。检查:
- root指令是否正确指向网站根目录
- fastcgi_param SCRIPT_FILENAME 是否为 $document_root$fastcgi_script_name
- PHP-FPM运行用户是否有网站文件的读取权限
- PHP文件是否存在于指定路径
Q4:怎么查看Nginx错误日志?
A:错误日志默认位置:
- CentOS:
/var/log/nginx/error.log
- Ubuntu:
/var/log/nginx/error.log
- 宝塔面板:
/www/wwwlogs/
实时查看日志:tail -f /var/log/nginx/error.log
Q5:Nginx和Apache可以同时运行吗?
A:可以,但不能监听同一个端口。常见做法是Nginx监听80端口作为前端反向代理,Apache监听8080端口处理动态请求,Nginx将PHP请求转发给Apache。但对于新手,建议只使用Nginx,避免复杂性。
Q6:怎么实现一个服务器多个网站?
A:通过虚拟主机(server块)实现。每个网站一个server块,用server_name区分域名。在conf.d目录下为每个网站创建一个独立的配置文件,如example.com.conf、test.com.conf。Nginx会根据请求的域名自动匹配对应的server块。
Q7:配置文件修改后不生效怎么办?
A:检查以下几点:
- 是否执行了
nginx -t 测试配置
- 是否执行了
nginx -s reload 重载配置
- 修改的配置文件是否被include引入(检查nginx.conf中的include路径)
- 是否有多个server块匹配了同一个域名,导致使用了错误的配置
- 浏览器缓存问题,尝试强制刷新(Ctrl+F5)或清除缓存
教程文中广告位
十三、总结
Nginx是每个站长必须掌握的工具,本教程涵盖了从安装到常用配置的完整内容。掌握以下核心配置,就能应对90%以上的场景:
- 虚拟主机配置:一个服务器跑多个网站
- PHP网站配置:WordPress、Typecho等PHP程序
- 反向代理:Node.js、Python等应用
- 静态缓存+Gzip:提升网站速度
- HTTPS配置:网站安全必备
- 伪静态规则:URL美化和框架支持
- 安全配置:隐藏版本、禁止敏感文件、限流
修改配置后记住:先 nginx -t 测试,再 nginx -s reload 重载。遇到问题先看错误日志,大部分问题都能在日志中找到答案。
如果你使用宝塔面板,大部分配置都可以在面板中图形化操作,无需手动编写配置文件,但了解Nginx配置原理仍然很有必要,遇到问题时能更快定位和解决。
Nginx
Web服务器
反向代理
负载均衡
HTTPS
新手教程