Linux 系统安装部署 Nginx 完全指南
Nginx(发音同 engine x)是一款高性能的 HTTP 和反向代理服务,同时也支持 IMAP/POP3/SMTP 协议。它以轻量、高并发、低内存著称,被广泛应用于 Web 服务器、负载均衡、静态资源服务、SSL 终结等场景。本指南将以实操方式带你从零完成 Nginx 的安装、配置、启动、优化与排错。
一、Nginx 核心特性概览
- 事件驱动架构:基于 epoll/kqueue 的高并发模型,单机可承载数万连接。
- 模块化设计:HTTP、Stream、Mail 模块灵活组合。
- 反向代理与负载均衡:内置 round-robin、ip_hash、least_conn、weighted 等策略。
- 高可用:支持 Master-Worker 多进程模型,热加载配置不中断服务。
- 丰富的生态:OpenResty、Nginx Unit、Tengine 等衍生方案。
二、安装方式选择
Linux 上安装 Nginx 主要有三种方式:
| 方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 发行版官方仓库 | 生产环境首选 | 稳定、易维护 | 版本偏旧 |
| Nginx 官方仓库 | 需要较新版本 | 版本新、文档全 | 需额外配置源 |
| 源码编译 | 需要自定义模块/最小化 | 灵活可控 | 维护成本高 |
三、基于发行版仓库安装
3.1 CentOS / RHEL / Rocky / AlmaLinux
# 安装 EPEL 源(Nginx 在 EPEL 中)
sudo yum install -y epel-release
sudo yum install -y nginx
# 启动并设置开机自启
sudo systemctl enable --now nginx
# 检查状态
sudo systemctl status nginx
3.2 Ubuntu / Debian
sudo apt update
sudo apt install -y nginx
sudo systemctl enable --now nginx
sudo systemctl status nginx
验证安装:浏览器访问
http://服务器IP,看到 Nginx 欢迎页即成功。
四、基于 Nginx 官方仓库安装(较新版本)
CentOS/RHEL
sudo tee /etc/yum.repos.d/nginx.repo <<'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
sudo yum install -y nginx
Ubuntu/Debian
# 添加 GPG 密钥
sudo curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
# 添加源(以 Ubuntu 22.04 为例)
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu jammy nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
sudo apt update
sudo apt install -y nginx
五、源码编译安装(进阶)
# 安装依赖
sudo yum install -y gcc pcre-devel zlib-devel openssl-devel # CentOS
# sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev # Ubuntu
# 下载源码
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# 配置编译选项
./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/var/run/nginx.pid \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--with-http_stub_status_module
make && sudo make install
# 创建 systemd 服务
sudo tee /etc/systemd/system/nginx.service <<'EOF'
[Unit]
Description=nginx - high performance web server
After=network.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $(cat /var/run/nginx.pid)
ExecStop=/bin/kill -s TERM $(cat /var/run/nginx.pid)
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now nginx
六、目录结构与配置文件解析
/etc/nginx/
├── nginx.conf # 主配置
├── mime.types # MIME 类型映射
├── conf.d/ # 站点配置目录
├── sites-available/ # 站点配置(Debian 系)
├── sites-enabled/ # 启用的站点软链接
└── ssl/ # SSL 证书目录(自建)
/var/log/nginx/ # 日志目录
├── access.log # 访问日志
└── error.log # 错误日志
/usr/share/nginx/html/ # 默认 Web 根目录
主配置 nginx.conf 示例
user nginx;
worker_processes auto; # 根据 CPU 核心自动设置
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 10240; # 单 worker 最大并发
use epoll;
multi_accept on;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
server_tokens off; # 隐藏版本号
# 日志格式
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;
# gzip 压缩
gzip on;
gzip_min_length 1k;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml;
include /etc/nginx/conf.d/*.conf;
}
七、配置一个站点(反向代理 + SSL)
# /etc/nginx/conf.d/example.conf
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/ssl/example.com/fullchain.pem;
ssl_certificate_key /etc/ssl/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
proxy_pass http://127.0.0.1:8080;
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;
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
root /var/www/static;
expires 30d;
add_header Cache-Control "public, immutable";
}
# 状态页(仅内网访问)
location /nginx_status {
stub_status;
access_log off;
allow 127.0.0.1;
deny all;
}
}
负载均衡示例
upstream backend {
least_conn; # 最少连接策略
server 10.0.0.11:8080 weight=3;
server 10.0.0.12:8080;
server 10.0.0.13:8080 backup;
keepalive 32;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
八、常用运维命令
# 语法检查(强烈推荐每次修改后执行)
sudo nginx -t
# 重新加载配置(热加载,不中断服务)
sudo nginx -s reload
# 或:sudo systemctl reload nginx
# 平滑关闭
sudo nginx -s quit
# 立即关闭
sudo nginx -s stop
# 查看版本与编译参数
nginx -V
# 实时分析访问日志
sudo tail -f /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20
九、性能优化关键参数
| 参数 | 说明 | 推荐值 |
|---|---|---|
worker_processes |
工作进程数 | auto |
worker_connections |
单 worker 连接数 | 10240+ |
sendfile on; |
零拷贝发送文件 | on |
tcp_nopush on; |
等待数据包满再发送 | on |
keepalive_timeout |
长连接超时 | 65 |
open_file_cache |
文件描述符缓存 | max=10000 inactive=20s; |
client_max_body_size |
上传最大体 | 视业务 |
gzip |
压缩 | on, level 4-6 |
系统层面配合优化:
# 文件描述符上限
ulimit -n 65535
echo "* soft nofile 65535" >> /etc/security/limits.conf
# TCP 参数
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
十、常见问题排错
1. nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
说明 80 端口被占用:
sudo lsof -i :80
sudo systemctl stop httpd # 若 Apache 冲突
2. SELinux 拦截导致 502
sudo getenforce
sudo setsebool -P httpd_can_network_connect 1
# 或为特定端口
sudo semanage port -a -t http_port_t -p tcp 8080
3. Permission denied 写日志/文件
确保 nginx 用户对 /var/log/nginx 与 Web 根目录有读写权限:
sudo chown -R nginx:nginx /var/www
sudo chmod 755 /var/www
4. 防火墙未放行
# CentOS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
# Ubuntu
sudo ufw allow 'Nginx Full'
5. 413 Request Entity Too Large
上传文件过大:
client_max_body_size 100m;
十一、安全加固建议
- 关闭版本号:
server_tokens off; - 限制请求方法:
if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; } - 防止目录穿越:避免使用
root配合用户输入。 - 启用 HSTS:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; - 隐藏敏感路径:
location ~ /\.\(git|svn|env) { deny all; } - 限制并发与速率:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; limit_conn_zone $binary_remote_addr zone=addr:10m; location / { limit_req zone=one burst=20 nodelay; limit_conn addr 10; }
十二、总结
至此,你已经掌握了在主流 Linux 发行版上安装、配置、优化与排错 Nginx 的完整流程。建议在生产环境使用前:
- 始终运行
nginx -t检查配置; - 使用 Let's Encrypt 或商业 CA 部署 HTTPS;
- 监控 access/error 日志与
/nginx_status; - 定期备份
/etc/nginx/目录。
后续可进一步探索 OpenResty(Lua 扩展)、Nginx Unit、Tengine、Ingress-Nginx(Kubernetes)等生态,构建更复杂的流量治理体系。
参考资料:Nginx 官方文档、各发行版官方仓库。