1. Nginx 入门与安装配置
作为一名长期与 Nginx 打交道的运维工程师,我深知 Nginx 在现代 Web 架构中的重要性。Nginx 以其卓越的性能表现著称,单机轻松支持 1-3 万并发连接(某些优化场景下甚至可达 10 万),这得益于其事件驱动的异步架构设计。与传统的 Apache 相比,Nginx 的内存占用更低,扩展性更强,特别适合高并发场景。
1.1 为什么选择 Linux 环境
虽然 Nginx 可以运行在 Windows 上,但我强烈建议在 Linux 系统上部署。Linux 的 epoll 事件机制与 Nginx 的架构完美契合,性能表现通常比 Windows 高出 20-30%。在我的测试环境中(CentOS 7,4 核 8G 内存虚拟机),Nginx 1.16.1 可以稳定处理每秒 8000+ 的静态资源请求。
1.2 安装步骤详解
对于 CentOS/RHEL 系统,推荐使用 yum 安装。首先配置阿里云镜像加速下载:
bash复制# 备份原有 repo
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 下载阿里云镜像配置
sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 安装 EPEL 仓库(包含 Nginx)
sudo yum install -y epel-release
sudo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# 清理并重建缓存
sudo yum clean all
sudo yum makecache
安装 Nginx 及其依赖:
bash复制sudo yum install -y nginx
提示:安装过程中会自动解决依赖关系,包括 PCRE、zlib 等必要组件
1.3 服务管理命令
掌握这些命令是日常运维的基础:
bash复制# 启动服务
sudo systemctl start nginx
# 设置开机自启
sudo systemctl enable nginx
# 检查状态
sudo systemctl status nginx
# 重新加载配置(不中断服务)
sudo systemctl reload nginx
# 完全重启
sudo systemctl restart nginx
1.4 Nginx 核心命令
除了系统服务命令,Nginx 自身提供了一些实用命令:
bash复制# 测试配置文件语法
nginx -t
# 测试并显示完整配置
nginx -T
# 优雅停止(处理完当前请求)
nginx -s quit
# 立即停止(不推荐生产环境使用)
nginx -s stop
# 重新打开日志文件(日志切割时使用)
nginx -s reopen
经验分享:生产环境修改配置后,务必先执行
nginx -t测试语法,确认无误后再reload
2. Nginx 核心配置解析
2.1 配置文件结构
Nginx 的主配置文件通常位于 /etc/nginx/nginx.conf,其结构主要包含:
nginx复制main # 全局配置(worker进程数、错误日志等)
events # 事件模型配置
http # HTTP 相关配置
server # 虚拟主机配置
location # URI 匹配配置
2.2 Server 块配置
一个典型的 server 配置示例:
nginx复制server {
listen 80;
server_name example.com;
root /var/www/html;
location / {
index index.html;
}
}
关键参数说明:
listen: 监听端口,可指定 IP(如listen 192.168.1.100:80)server_name: 域名匹配,支持通配符(*.example.com)和正则root: 站点根目录,会与 URI 拼接形成完整文件路径
2.3 Location 匹配规则
Location 的匹配优先级是新手最容易混淆的地方:
| 匹配模式 | 示例 | 优先级 |
|---|---|---|
| 精确匹配 | location = /path |
1(最高) |
| 前缀匹配 | location ^~ /path |
2 |
| 正则匹配(区分大小写) | location ~ \.php$ |
3 |
| 正则匹配(不区分大小写) | `location ~* .(jpg | png)$` |
| 普通前缀匹配 | location /path |
5 |
| 通用匹配 | location / |
6(最低) |
验证示例:
nginx复制location = /test {
return 200 "精确匹配";
}
location ^~ /test/ {
return 200 "前缀优先匹配";
}
location ~ /test {
return 200 "正则匹配";
}
location /test/ {
return 200 "普通前缀匹配";
}
访问 /test 会返回"精确匹配",而 /test/abc 会返回"前缀优先匹配"
2.4 root 与 alias 的区别
这两个指令经常被混淆,其实有本质区别:
root 示例:
nginx复制location /images/ {
root /var/www;
}
访问 /images/cat.jpg 会映射到 /var/www/images/cat.jpg
alias 示例:
nginx复制location /img/ {
alias /var/images/;
}
访问 /img/cat.jpg 会映射到 /var/images/cat.jpg
关键区别:
- root 会将 location 路径拼接到目录后
- alias 会用定义路径替换 location 路径
- alias 必须以
/结尾时,location 也必须以/结尾
3. 高级配置技巧
3.1 重定向与 rewrite
rewrite 可以实现灵活的 URL 重写:
nginx复制location /old {
rewrite ^/old/(.*)$ /new/$1 permanent;
}
flag 参数说明:
last:停止处理当前 rewrite,重新匹配 locationbreak:停止处理当前 rewriteredirect:302 临时重定向permanent:301 永久重定向
避坑指南:生产环境慎用 301,浏览器会长期缓存。测试阶段先用 302
3.2 try_files 应用
try_files 按顺序检查文件是否存在:
nginx复制location / {
try_files $uri $uri/ @fallback;
}
location @fallback {
proxy_pass http://backend;
}
这个配置会依次检查:
- 请求的文件是否存在($uri)
- 请求的目录是否存在($uri/)
- 都不存在则转发到 @fallback
3.3 内置变量应用
Nginx 提供了丰富的内置变量:
nginx复制location /debug {
return 200 "Host: $host\nURI: $uri\nArgs: $args";
}
常用变量:
$args:查询字符串$http_user_agent:客户端浏览器信息$remote_addr:客户端 IP$request_time:请求处理时间$upstream_response_time:后端响应时间
4. 性能优化配置
4.1 Gzip 压缩配置
合理的 gzip 配置可以显著减少传输体积:
nginx复制gzip on;
gzip_min_length 1k; # 最小压缩文件大小
gzip_comp_level 6; # 压缩级别(1-9)
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_vary on; # 添加 Vary 头
注意事项:图片、PDF 等二进制文件通常已经压缩,再次 gzip 效果不明显且浪费 CPU
4.2 缓存策略配置
合理的缓存策略能极大减轻服务器压力:
nginx复制location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
}
对于带 hash 的前端静态资源,可以使用更激进的缓存:
nginx复制location ~* \.[a-f0-9]{8}\.(css|js)$ {
expires max;
add_header Cache-Control "public, immutable";
}
4.3 日志优化
关闭不必要的日志记录可以提升性能:
nginx复制location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
access_log off;
}
同时建议配置日志轮转:
bash复制# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
5. 安全加固建议
5.1 隐藏版本信息
nginx复制server_tokens off;
5.2 限制 HTTP 方法
nginx复制if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}
5.3 防止目录遍历
nginx复制location ~* \.(php|conf|sh|bak|swp)$ {
deny all;
}
5.4 配置 SSL/TLS
现代安全配置示例:
nginx复制ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
6. 常见问题排查
6.1 502 Bad Gateway
可能原因:
- 后端服务未启动
- 代理配置错误
- 后端响应超时
检查方法:
bash复制# 检查后端服务状态
systemctl status backend-service
# 检查 Nginx 错误日志
tail -n 50 /var/log/nginx/error.log
6.2 403 Forbidden
常见原因:
- 文件权限问题
- 目录索引被禁用
- SELinux 限制
解决方案:
bash复制# 检查文件权限
chown -R nginx:nginx /var/www
chmod -R 755 /var/www
# 临时禁用 SELinux 测试
setenforce 0
6.3 性能瓶颈定位
使用工具分析:
bash复制# 实时监控连接状态
nginx -T | grep active_connections
# 安装 ngxtop 监控
pip install ngxtop
ngxtop
7. 生产环境建议
经过多年实践,我总结出以下经验:
- worker 进程数设置为 CPU 核心数
- 保持 Linux 内核更新以获得更好的 epoll 性能
- 对静态资源使用 CDN 分流
- 定期检查错误日志和访问日志
- 使用配置管理工具(Ansible)维护配置
对于高并发场景,还需要调整系统参数:
bash复制# 增加文件描述符限制
echo "nginx soft nofile 65535" >> /etc/security/limits.conf
echo "nginx hard nofile 65535" >> /etc/security/limits.conf
# 优化内核参数
echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 65535" >> /etc/sysctl.conf
sysctl -p
Nginx 的配置灵活性既是优势也是挑战。建议建立配置标准文档,使用版本控制系统管理配置变更。对于大型部署,可以考虑使用 Nginx Plus 或 OpenResty 获得更多高级功能。