Nginx 完全指南:安装、配置与优化 – wiki词典


Nginx 完全指南:安装、配置与优化

Nginx (发音为 “engine-x”) 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。它以其卓越的性能、稳定性、丰富的功能集、简单的配置以及低资源消耗而闻名。无论是作为 Web 服务器、反向代理、负载均衡器还是 HTTP 缓存,Nginx 都是现代 Web 架构中不可或缺的组件。

本指南将带您深入了解 Nginx 的安装、基本配置,并提供一些优化建议,帮助您充分发挥 Nginx 的潜力。

第一部分:Nginx 的安装

Nginx 可以在多种操作系统上安装,包括 Linux (Debian/Ubuntu, CentOS/RHEL)、macOS 和 Windows。推荐在 Linux 环境下部署 Nginx,以获得最佳性能和稳定性。

1. Linux (Debian/Ubuntu)

对于 Debian 或 Ubuntu 系统,安装 Nginx 非常简单:

“`bash

更新软件包列表

sudo apt update

安装 Nginx

sudo apt install nginx

检查 Nginx 服务状态

sudo systemctl status nginx
“`

安装完成后,Nginx 服务通常会自动启动。您可以通过浏览器访问 http://localhost 或服务器的 IP 地址,应该能看到 Nginx 的欢迎页面。

2. Linux (CentOS/RHEL)

对于 CentOS 或 RHEL 系统,您需要先启用 EPEL 仓库:

“`bash

安装 EPEL 仓库

sudo yum install epel-release -y

安装 Nginx

sudo yum install nginx -y

启动 Nginx 服务

sudo systemctl start nginx

设置 Nginx 开机自启

sudo systemctl enable nginx

检查 Nginx 服务状态

sudo systemctl status nginx

如果启用了防火墙,需要放行 HTTP/HTTPS 端口

sudo firewall-cmd –permanent –add-service=http
sudo firewall-cmd –permanent –add-service=https
sudo firewall-cmd –reload
“`

3. 从源码编译安装 (适用于所有 Linux)

如果您需要最新的 Nginx 版本或特定的模块,可以从源码编译安装。这需要一些额外的依赖。

“`bash

安装编译依赖 (以 Debian/Ubuntu 为例)

sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

下载 Nginx 源码 (访问 Nginx 官网获取最新稳定版链接)

wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

配置编译选项 (可以根据需要添加更多模块,如 –with-http_stub_status_module)

./configure –prefix=/usr/local/nginx –with-http_ssl_module –with-http_gzip_static_module

编译并安装

make
sudo make install

创建软链接到 /usr/local/bin (可选,方便直接运行 nginx 命令)

sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

手动启动 Nginx

sudo /usr/local/nginx/sbin/nginx

关闭 Nginx

sudo /usr/local/nginx/sbin/nginx -s stop

重载配置

sudo /usr/local/nginx/sbin/nginx -s reload
“`

提示: 源码安装后,您需要手动创建 Systemd 服务文件 (/etc/systemd/system/nginx.service) 来管理 Nginx 服务。

第二部分:Nginx 的配置

Nginx 的主要配置文件是 /etc/nginx/nginx.conf (对于包管理器安装) 或 /usr/local/nginx/conf/nginx.conf (对于源码安装)。这个文件通常会包含一个 include 指令,用于加载 /etc/nginx/conf.d/*.conf/etc/nginx/sites-enabled/* 目录下的其他配置文件,以便更好地组织配置。

1. 主要配置结构

Nginx 配置主要由几个块组成:

“`nginx

全局块:配置影响 Nginx 服务器整体运行的参数,如 worker 进程数、错误日志等

user nginx; # Nginx 运行的用户
worker_processes auto; # worker 进程数量,推荐设置为 CPU 核心数或 auto

error_log /var/log/nginx/error.log warn; # 错误日志路径和级别
pid /var/run/nginx.pid; # Nginx master 进程的 PID 文件

events {
# events 块:配置 Nginx 进程与连接相关的设置,如最大连接数、事件模型等
worker_connections 1024; # 每个 worker 进程允许的最大并发连接数
# use epoll; # 在 Linux 系统上推荐使用 epoll 事件模型
}

http {
# http 块:HTTP 服务器的核心配置,包括 MIME 类型、日志、gzip 压缩、虚拟主机等
include /etc/nginx/mime.types; # 包含 MIME 类型定义
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; # 启用 sendfile 零拷贝,提高文件传输效率
#tcp_nopush     on; # 与 sendfile 配合使用,在一个包中发送响应头和第一个数据块

keepalive_timeout  65; # 保持连接的超时时间

gzip  on; # 启用 gzip 压缩
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

# server 块:定义一个虚拟主机,处理特定域名或端口的请求
server {
    listen       80; # 监听 80 端口
    server_name  example.com www.example.com; # 绑定的域名

    # location 块:定义如何处理匹配特定 URI 模式的请求
    location / {
        root   /usr/share/nginx/html; # 静态文件根目录
        index  index.html index.htm; # 默认索引文件
    }

    error_page   500 502 503 504  /50x.html; # 错误页面配置
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # 反向代理示例
    # location /api/ {
    #     proxy_pass http://backend_server: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;
    # }
}

# 另一个 server 块,可以用于配置 HTTPS 或其他域名
# server {
#     listen 443 ssl;
#     server_name secure.example.com;
#     ssl_certificate /etc/nginx/ssl/server.crt;
#     ssl_certificate_key /etc/nginx/ssl/server.key;
#     # ... 其他 SSL 配置
# }

}
“`

2. 常用配置场景

a. 静态文件服务器

这是 Nginx 最基本的用途。只需配置 rootindex 指令:

“`nginx
server {
listen 80;
server_name your_domain.com;

location / {
    root /var/www/html/your_site; # 网站文件存放路径
    index index.html index.htm;
    try_files $uri $uri/ =404; # 尝试查找文件或目录,如果找不到则返回 404
}

}
“`

b. 反向代理

将请求转发到后端应用服务器,实现负载均衡、隐藏后端服务等。

“`nginx
upstream backend_pool {
server backend1.example.com:8080;
server backend2.example.com:8080;
# 可以添加权重、备用服务器等
# server backend3.example.com:8080 weight=5;
# server backup.example.com:8080 backup;
}

server {
listen 80;
server_name your_app.com;

location / {
    proxy_pass http://backend_pool; # 将请求转发到 upstream 定义的后端池
    proxy_set_header Host $host; # 转发原始请求的 Host 头
    proxy_set_header X-Real-IP $remote_addr; # 转发客户端真实 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发客户端 IP 列表
    proxy_set_header X-Forwarded-Proto $scheme; # 转发客户端使用的协议 (http/https)
}

# 对于 WebSocket 代理,需要特殊配置
location /ws {
    proxy_pass http://backend_pool;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

}
“`

c. SSL/TLS 配置 (HTTPS)

为网站启用 HTTPS 是现代 Web 的最佳实践。这需要您有 SSL 证书和私钥 (可以从 Let’s Encrypt 免费获取)。

“`nginx
server {
listen 80;
server_name your_domain.com;
return 301 https://$host$request_uri; # 将所有 HTTP 请求重定向到 HTTPS
}

server {
listen 443 ssl http2; # 监听 443 端口,启用 SSL 和 HTTP/2
server_name your_domain.com;

ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem; # 您的 SSL 证书
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem; # 您的 SSL 私钥

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"; # 推荐的加密套件
ssl_prefer_server_ciphers on;

# HSTS (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

location / {
    root /var/www/html/your_site;
    index index.html;
    try_files $uri $uri/ =404;
}

}
“`

3. 测试和重载配置

在修改 Nginx 配置文件后,务必测试配置文件的语法,然后重载 Nginx 服务。

“`bash

测试配置语法

sudo nginx -t

如果语法无误,重载 Nginx 服务

sudo systemctl reload nginx # 或 sudo service nginx reload
“`

第三部分:Nginx 的优化

Nginx 的默认配置已经很高效,但通过一些调整,可以进一步提升其性能、安全性和稳定性。

1. 性能优化

  • worker_processes: 设置为 auto 或 CPU 核心数,可以充分利用多核处理器。
    nginx
    worker_processes auto;
  • worker_connections: 增加每个 worker 进程的最大并发连接数。根据服务器内存和打开文件限制进行调整。
    nginx
    events {
    worker_connections 4096; # 例如
    }
  • sendfile on;: 启用零拷贝技术,减少 CPU 开销。
  • tcp_nopush on;: 配合 sendfile 使用,在发送响应头和第一个数据块时,尽可能在一个 TCP 包中完成。
  • tcp_nodelay on;: 在 keepalive 连接上禁用 Nagle 算法,减少小数据包延迟。
  • keepalive_timeout: 适当延长 keepalive_timeout 可以减少 TCP 连接建立的开销,但过长会占用资源。通常 15-30 秒是合理的。
  • gzip on;: 启用 gzip 压缩,减少传输数据量,但会增加 CPU 负载。
    • gzip_types: 仅压缩文本类型文件。
    • gzip_comp_level: 压缩级别 (1-9),6 是一个很好的平衡点。
  • 缓存静态文件: 利用 expiresadd_header Cache-Control 设置浏览器缓存。
    nginx
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d; # 缓存 30 天
    log_not_found off; # 不记录找不到的日志
    }
  • 开启 HTTP/2: 启用 HTTP/2 协议可以提高加载速度,特别是在 HTTPS 环境下。
    nginx
    listen 443 ssl http2;
  • 使用 try_files 替代 if (-f $request_filename): try_files 更高效。

2. 安全优化

  • 隐藏 Nginx 版本信息: 避免攻击者了解您的 Nginx 版本。
    nginx
    http {
    server_tokens off; # 全局设置
    }
  • 最小权限运行: Nginx 应该以非 root 用户运行 worker 进程。
    nginx
    user nginx; # 在全局块中设置
  • 限制请求方法: 如果不需要,限制只允许 GET, HEAD, POST
    nginx
    location / {
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 405;
    }
    # ...
    }
  • 拒绝恶意 User-Agent: 阻止一些已知的爬虫或扫描工具。
    nginx
    if ($http_user_agent ~* (badbot1|badbot2)) {
    return 403;
    }
  • 防止目录遍历: 确保 autoindex off; 禁用目录列表。
  • 限制 IP 访问: 针对特定路径或整个网站限制访问。
    nginx
    location /admin {
    allow 192.168.1.0/24; # 允许特定 IP 段访问
    deny all; # 拒绝其他所有
    }
  • 强大的 SSL/TLS 配置: 使用最新的协议 (TLSv1.2, TLSv1.3) 和强加密套件。
  • HSTS (HTTP Strict Transport Security): 强制浏览器始终通过 HTTPS 访问网站。

3. 稳定性与日志管理

  • 日志轮转: 配置 logrotate 来管理 Nginx 的访问日志和错误日志,防止日志文件过大。
    • 通常包管理器安装的 Nginx 会自动配置。
  • 限制并发连接数和请求速率: 防止 DDoS 攻击或滥用。
    “`nginx
    # 在 http 块中定义
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    limit_req_zone $binary_remote_addr zone=req:10m rate=1r/s; # 每秒1个请求

    server {
    # …
    location / {
    limit_conn addr 10; # 每个 IP 最多 10 个并发连接
    limit_req zone=req burst=5 nodelay; # 每个 IP 每秒最多 1 个请求,允许突发 5 个
    # …
    }
    }
    ``
    * **错误页面**: 配置友好的自定义错误页面。
    * **监控**: 结合 Prometheus, Grafana 等工具监控 Nginx 的运行状态和性能指标。Nginx 提供了
    stub_status` 模块来获取基本状态信息。

总结

Nginx 是一个功能强大且灵活的服务器,通过正确的安装、精心的配置和持续的优化,可以显著提升 Web 服务的性能、安全性和稳定性。本指南涵盖了 Nginx 的核心概念和实践,希望能够帮助您更好地驾驭这个强大的工具。随着您的需求增长,您还可以探索 Nginx 更多的功能,如流媒体代理、地理位置模块等,以构建更强大的 Web 基础设施。


滚动至顶部