Linux 系统安装部署 Nginx 完全指南

刘小猪 发布于 阅读:7 教程

Linux 系统安装部署 Nginx 完全指南

Nginx(发音同 engine x)是一款高性能的 HTTP 和反向代理服务,同时也支持 IMAP/POP3/SMTP 协议。它以轻量、高并发、低内存著称,被广泛应用于 Web 服务器、负载均衡、静态资源服务、SSL 终结等场景。本指南将以实操方式带你从零完成 Nginx 的安装、配置、启动、优化与排错。


一、Nginx 核心特性概览


二、安装方式选择

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;

十一、安全加固建议


十二、总结

至此,你已经掌握了在主流 Linux 发行版上安装、配置、优化与排错 Nginx 的完整流程。建议在生产环境使用前:

  1. 始终运行 nginx -t 检查配置;
  2. 使用 Let's Encrypt 或商业 CA 部署 HTTPS;
  3. 监控 access/error 日志与 /nginx_status;
  4. 定期备份 /etc/nginx/ 目录。

后续可进一步探索 OpenResty(Lua 扩展)、Nginx Unit、Tengine、Ingress-Nginx(Kubernetes)等生态,构建更复杂的流量治理体系。

参考资料:Nginx 官方文档、各发行版官方仓库。

Linux 教程 Nginx 运维

手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

收藏 0