人人都会AI编程

19.1 Nginx:安装、基础配置、静态服务、反向代理

更新时间:2026-07-12

Nginx(发音同“engine-x”)是一款轻量级、高性能的 HTTP 和反向代理服务器,同时也可用作邮件代理和通用 TCP/UDP 负载均衡器。它以事件驱动架构著称,能在低内存占用下处理数万并发连接,因此被广泛用于静态资源服务、API 网关和负载均衡等场景。本节将从安装开始,逐步完成一个简单的静态站点和反向代理配置。

1. 安装 Nginx

Ubuntu/Debian 系统

sudo apt update
sudo apt install nginx -y

安装完成后,Nginx 会自动启动并设为开机自启。可以用以下命令查看状态:

sudo systemctl status nginx

如果服务器开启了防火墙(如 ufw),需要允许 HTTP/HTTPS 流量:

sudo ufw allow 'Nginx Full'

CentOS/RHEL 系统

sudo yum install epel-release -y   # 若需启用 EPEL 仓库
sudo yum install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx

防火墙放行:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

安装后,在浏览器访问服务器的 IP 地址,如果出现 Nginx 默认欢迎页面,说明服务已正常运行。

2. 基础配置结构与重要文件

Nginx 的配置主要分布在 /etc/nginx/ 目录下,核心文件为 nginx.conf,通常通过 include 引入其他配置片段。

  • 主配置文件/etc/nginx/nginx.conf
  • 站点配置目录/etc/nginx/sites-available/ 存放可用站点配置,/etc/nginx/sites-enabled/ 存放已启用的符号链接(部分发行版使用 /etc/nginx/conf.d/ 目录)。
  • 全局参数:如 worker_processes(建议设为 CPU 核心数)、worker_connections(每个工作进程的最大连接数),可在 nginx.confevents 块中调整。

一个典型的 nginx.conf 主结构如下:

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # 日志格式与路径
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # 其他通用设置
    sendfile on;
    keepalive_timeout 65;

    # 引入站点配置
    include /etc/nginx/sites-enabled/*;
}

日常操作中,我们通常不在主文件中直接编写站点,而是在 sites-available 下创建独立的配置文件,然后通过符号链接启用。例如:

sudo nano /etc/nginx/sites-available/example
sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/
sudo nginx -t          # 测试配置文件语法
sudo systemctl reload nginx

3. 配置静态网站

假设我们要在 /var/www/mysite 目录下放置静态 HTML 文件,并让域名 www.example.com(或直接通过 IP)访问。

首先创建站点根目录和测试页面:

sudo mkdir -p /var/www/mysite
sudo chown -R $USER:$USER /var/www/mysite
echo '<h1>Hello from Nginx!</h1>' > /var/www/mysite/index.html

接着编写站点配置 /etc/nginx/sites-available/mysite

server {
    listen 80;                         # 监听 IPv4 的 80 端口
    listen [::]:80;                    # 监听 IPv6 的 80 端口

    server_name www.example.com;       # 域名,也可用 _ 匹配所有

    root /var/www/mysite;              # 网站根目录
    index index.html index.htm;        # 默认索引文件

    location / {
        try_files $uri $uri/ =404;     # 按顺序查找文件,不存在则返回 404
    }

    # 可选:自定义日志
    access_log /var/log/nginx/mysite.access.log;
    error_log /var/log/nginx/mysite.error.log;
}

启用站点并重载配置:

sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

现在通过服务器 IP 或域名访问,即可看到 index.html 的内容。如果有多个站点,只需为每个站点创建独立的 server 块,Nginx 会根据 server_namelisten 指令将请求分发到对应的配置。

常用静态服务优化

  • 开启 gzip 压缩:在主配置的 http 块或站点 server 块中添加:
  gzip on;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
  
  • 设置静态资源缓存:针对图片、CSS、JS 等文件单独设置过期时间:
  location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
      expires 30d;
      add_header Cache-Control "public, immutable";
  }
  

4. 反向代理配置

反向代理是 Nginx 最常见的用途之一,它可以将客户端的请求转发给后端应用(如 Node.js、Python、Java 等监听的本地端口),并将响应返回给客户端,从而隐藏后端服务、实现负载均衡或 SSL 终结。

假设后端应用运行在本机的 http://127.0.0.1:3000,我们希望将域名 api.example.com 的请求转发过去。

创建配置 /etc/nginx/sites-available/api

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;   # 后端地址
        proxy_http_version 1.1;

        # 设置头信息,以便后端获取真实客户端 IP 和协议
        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 60s;
        proxy_read_timeout 60s;
    }
}

如果是 WebSocket 应用,还需要在 location / 块中增加以下指令以支持协议升级:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

启用并测试:

sudo ln -s /etc/nginx/sites-available/api /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

现在,所有访问 http://api.example.com 的请求都会被 Nginx 接收并透明地转发给 127.0.0.1:3000。用户只会看到 Nginx 的地址,而无法直接访问后端服务,这既提高了安全性,也为后续横向扩展(增加多个后端做负载均衡)提供了基础。

简单的负载均衡示例(在 proxy_pass 前定义一组后端):

upstream backend_servers {
    server 10.0.0.101:3000 weight=3;   # 权重为 3
    server 10.0.0.102:3000;
    server 10.0.0.103:3000 backup;     # 备用服务器
}

server {
    # …… 省略其他配置
    location / {
        proxy_pass http://backend_servers;
        # ……
    }
}

通过以上配置,Nginx 会默认按轮询(round-robin)方式分发请求到各后端服务器,可配合 weightip_hash 等策略满足不同场景。

5. 测试与排错要点

  • 检查配置文件语法:每次修改后务必运行 sudo nginx -t
  • 查看错误日志:配置出错或后端不可用时,/var/log/nginx/error.log 是最重要的线索来源。
  • 监控连接状态:使用 sudo nginx -s reopen 可重新打开日志文件(配合日志轮替),而 systemctl status nginx 可查看进程运行状态。
  • 常用信号
  • sudo nginx -s reload:平滑重载配置(不中断现有连接)
  • sudo nginx -s stop:快速停止
  • sudo nginx -s quit:优雅停机

Nginx 的强大远不止于此,但掌握了安装、基础配置、静态服务和反向代理四块内容后,你就已经能够用 Nginx 搭建出生产环境中 80% 常见的 Web 服务模型。