Linux 环境下 Nginx 的安装与配置 – wiki基地

Linux 环境下 Nginx 的安装与配置

1. 引言

Nginx (发音为 “engine-x”) 是一款高性能的开源 HTTP 服务器、反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器。它以其卓越的性能、稳定性、丰富的功能集以及低资源消耗而闻名,在现代 Web 架构中扮演着关键角色。Nginx 采用事件驱动的异步非阻塞处理模型,能够轻松处理高并发场景,同时保持极低的内存消耗,这使其成为负载均衡器、反向代理服务器或静态内容服务器的理想选择。

本文将详细介绍在 Linux 环境下安装和配置 Nginx 的过程,包括基本安装、服务管理、基础配置以及反向代理、负载均衡和 SSL/TLS 等高级配置示例。

2. 前提条件

在开始安装 Nginx 之前,请确保您的 Linux 服务器满足以下条件:

  • 操作系统: 本文将涵盖 Ubuntu/Debian (基于 apt 包管理器) 和 CentOS/RHEL (基于 yumdnf 包管理器) 系列发行版。
  • 用户权限: 拥有 sudo 权限的非 root 用户或 root 用户。
  • 域名 (可选): 如果计划配置 SSL/TLS 或虚拟主机,建议拥有一个指向服务器 IP 地址的注册域名。
  • 防火墙配置: 确保服务器防火墙允许 HTTP (80 端口) 和 HTTPS (443 端口) 流量。
    • Ubuntu/Debian (UFW):
      bash
      sudo ufw allow 'Nginx HTTP'
      sudo ufw allow 'Nginx HTTPS' # 如果需要HTTPS
      sudo ufw enable
    • CentOS/RHEL (firewalld):
      bash
      sudo firewall-cmd --permanent --add-service=http
      sudo firewall-cmd --permanent --add-service=https # 如果需要HTTPS
      sudo firewall-cmd --reload

3. Nginx 安装

Nginx 可以通过包管理器或从源代码编译安装。对于大多数用户,推荐使用包管理器,因为它更简单且易于维护。

3.1 使用包管理器安装 (推荐)

a. 在 Ubuntu/Debian 系统上安装:

  1. 更新包索引:
    bash
    sudo apt update
  2. 安装 Nginx:
    bash
    sudo apt install nginx

b. 在 CentOS/RHEL 系统上安装:

  1. CentOS 7/8: 首先需要安装 EPEL (Extra Packages for Enterprise Linux) 仓库,因为 Nginx 在默认仓库中可能不是最新版本或不可用。
    bash
    sudo yum install epel-release -y
    sudo yum install nginx -y
  2. RHEL 8/9, CentOS Stream, AlmaLinux, Rocky Linux (使用 dnf):
    bash
    sudo dnf install nginx -y

3.2 从源代码编译安装 (可选,适用于高级用户)

从源代码安装可以提供对 Nginx 模块和编译选项的更精细控制,但过程更复杂。

  1. 安装构建依赖:
    “`bash
    # Ubuntu/Debian
    sudo apt update
    sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

    CentOS/RHEL

    sudo yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
    2. **下载 Nginx 源代码**: 访问 Nginx 官方网站下载最新稳定版或主线版的源代码包。bash
    wget http://nginx.org/download/nginx-1.2x.x.tar.gz # 替换为最新版本
    tar -zxvf nginx-1.2x.x.tar.gz
    cd nginx-1.2x.x
    3. **配置编译选项**:bash
    ./configure –prefix=/usr/local/nginx –with-http_ssl_module –with-pcre –with-zlib –with-http_realip_module # 根据需要添加模块
    * `--prefix=/usr/local/nginx`: 指定 Nginx 的安装路径。
    * `--with-http_ssl_module`: 启用 SSL/TLS 支持。
    * `--with-pcre`: 启用 PCRE 正则表达式支持。
    * `--with-zlib`: 启用 zlib 压缩库支持。
    4. **编译并安装**:
    bash
    make
    sudo make install
    5. **创建 Systemd 服务文件 (如果从源代码安装)**:
    为了方便管理,建议为自编译的 Nginx 创建一个 systemd 服务文件 `/etc/systemd/system/nginx.service`。
    ini
    [Unit]
    Description=The Nginx HTTP and reverse proxy server
    After=syslog.target network.target remote-fs.target nss-lookup.target

    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStartPre=/usr/local/nginx/sbin/nginx -t
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true

    [Install]
    WantedBy=multi-user.target
    然后重新加载 systemd 配置并启用服务:bash
    sudo systemctl daemon-reload
    sudo systemctl enable nginx
    “`

4. 管理 Nginx 服务

安装完成后,Nginx 服务通常会自动启动。您可以使用 systemctl 命令来管理 Nginx 服务。

  • 启动 Nginx:
    bash
    sudo systemctl start nginx
  • 停止 Nginx:
    bash
    sudo systemctl stop nginx
  • 重启 Nginx: (会断开所有当前连接)
    bash
    sudo systemctl restart nginx
  • 重新加载配置: (平滑重启,不会断开当前连接,推荐在修改配置后使用)
    bash
    sudo systemctl reload nginx
  • 检查 Nginx 状态:
    bash
    sudo systemctl status nginx
  • 设置 Nginx 开机自启:
    bash
    sudo systemctl enable nginx
  • 禁用 Nginx 开机自启:
    bash
    sudo systemctl disable nginx
  • 测试 Nginx 配置文件的语法: (在重新加载或重启前务必执行此命令)
    bash
    sudo nginx -t

    如果语法正确,会显示 syntax is oktest is successful

5. Nginx 基础配置

Nginx 的主配置文件通常位于 /etc/nginx/nginx.conf。此外,为了更好地组织配置,通常会在 /etc/nginx/sites-available/ 目录中为每个网站创建单独的配置文件,并通过符号链接将其启用至 /etc/nginx/sites-enabled/ 目录。

Nginx 配置由指令 (directives) 组成,这些指令通常组织在不同的块 (blocks) 中,例如 http 块、server 块和 location 块。

  • http: 定义全局 HTTP 服务器配置,例如 MIME 类型、日志格式、连接设置等。
  • server: 定义虚拟主机,用于处理特定域名或 IP 地址的请求。
  • location: 定义如何处理特定 URL 路径的请求。

5.1 默认网站和静态文件服务

安装完成后,Nginx 会有一个默认的 server 块,通常监听 80 端口,并从 /var/www/html 目录提供静态文件。

您可以访问服务器的 IP 地址或域名来验证 Nginx 是否正常运行。

5.2 配置虚拟主机 (Server Blocks)

虚拟主机 (在 Nginx 中称为 Server Blocks) 允许您在同一台服务器上托管多个网站或应用程序。

以下是配置虚拟主机的步骤:

  1. 创建网站根目录:
    bash
    sudo mkdir -p /var/www/your_domain/html

    your_domain 替换为您的实际域名。
  2. 创建示例 index.html 文件:
    bash
    sudo nano /var/www/your_domain/html/index.html

    添加以下内容:
    html
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to Your Domain!</title>
    <style>
    body {
    width: 35em;
    margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif;
    }
    </style>
    </head>
    <body>
    <h1>Success! Your Nginx server block for your_domain is working!</h1>
    <p>This is a test page.</p>
    </body>
    </html>
  3. 设置文件权限:
    bash
    sudo chown -R www-data:www-data /var/www/your_domain/html # Ubuntu/Debian
    sudo chown -R nginx:nginx /var/www/your_domain/html # CentOS/RHEL
    sudo chmod -R 755 /var/www/your_domain
  4. 创建 Nginx Server Block 配置文件:
    bash
    sudo nano /etc/nginx/sites-available/your_domain

    添加以下配置:
    “`nginx
    server {
    listen 80;
    listen [::]:80; # 监听 IPv6

    server_name your_domain www.your_domain; # 替换为您的域名
    
    root /var/www/your_domain/html;
    index index.html index.htm index.nginx-debian.html; # 默认索引文件
    
    access_log /var/log/nginx/your_domain.access.log; # 访问日志
    error_log /var/log/nginx/your_domain.error.log warn; # 错误日志
    
    location / {
        try_files $uri $uri/ =404; # 尝试查找文件,否则返回404
    }
    

    }
    5. **启用 Server Block**: 创建从 `sites-available` 到 `sites-enabled` 的符号链接。bash
    sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
    6. **测试 Nginx 配置并重新加载**:bash
    sudo nginx -t
    sudo systemctl reload nginx
    “`

现在,当您访问 your_domain 时,Nginx 将会显示您创建的 index.html 页面。

6. Nginx 高级配置示例

6.1 反向代理 (Reverse Proxy)

Nginx 作为反向代理服务器,可以将客户端请求转发到后端服务器 (如 Node.js 应用、Python Flask/Django 应用、Apache 等),并将后端服务器的响应返回给客户端。这有助于隐藏后端服务器的真实 IP、提供负载均衡、SSL 卸载等功能。

以下是一个简单的反向代理配置示例,将所有请求转发到运行在 http://127.0.0.1:8080 的后端应用:

  1. 编辑您的 Server Block 配置文件 (例如 /etc/nginx/sites-available/your_domain):
    “`nginx
    server {
    listen 80;
    server_name your_domain www.your_domain;

    location / {
        proxy_pass http://127.0.0.1:8080; # 后端应用地址
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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_cache_bypass $http_upgrade;
    }
    

    }
    * `proxy_pass`: 指定后端服务器的地址。
    * `proxy_set_header`: 转发客户端请求头到后端服务器,这对于后端应用获取客户端真实 IP 和主机名非常重要。
    2. **测试配置并重新加载 Nginx**:
    bash
    sudo nginx -t
    sudo systemctl reload nginx
    “`

6.2 负载均衡 (Load Balancing)

Nginx 可以作为高效的 HTTP 负载均衡器,将流量分发到多个后端应用实例,以优化资源利用、提高吞吐量、减少延迟并确保容错配置。

Nginx 支持多种负载均衡算法:

  • Round Robin (默认): 请求按顺序均匀分发到后端服务器。
  • Least Connections: 将请求发送到当前活动连接数最少的服务器。
  • IP Hash: 根据客户端 IP 地址的哈希值将请求分发到后端服务器,确保同一客户端的请求始终发送到同一台服务器。

以下是一个使用 Round Robin 算法的负载均衡配置示例:

  1. http 块内定义 upstream: 通常在 /etc/nginx/nginx.conf 或一个单独的包含文件中。
    “`nginx
    http {
    # … 其他http配置 …

    upstream backend_servers {
        server 192.168.1.100:8080; # 后端服务器1
        server 192.168.1.101:8080; # 后端服务器2
        server 192.168.1.102:8081 weight=3; # 后端服务器3,权重为3,接收更多请求
        # least_conn; # 如果要使用最少连接算法,取消注释
        # ip_hash;    # 如果要使用IP哈希算法,取消注释
    }
    
    server {
        listen 80;
        server_name your_domain www.your_domain;
    
        location / {
            proxy_pass http://backend_servers; # 转发到 upstream 定义的服务器组
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    

    }
    * `upstream backend_servers`: 定义一个名为 `backend_servers` 的服务器组。
    * `server`: 列出后端服务器的 IP 地址和端口。
    * `weight`: 可选参数,指定服务器的权重,权重越高的服务器将接收更多的请求。
    * `proxy_pass http://backend_servers;`: 将请求转发到 `backend_servers` 组中的服务器。
    2. **测试配置并重新加载 Nginx**:
    bash
    sudo nginx -t
    sudo systemctl reload nginx
    “`

6.3 SSL/TLS 配置 (HTTPS)

为您的网站启用 HTTPS 是保护用户数据和提高网站信任度的关键。这通常涉及获取 SSL/TLS 证书并配置 Nginx 使用它。

最常见的方法是使用 Let’s Encrypt 提供的免费证书和 Certbot 工具。

  1. 安装 Certbot (Ubuntu/Debian):
    bash
    sudo apt update
    sudo apt install certbot python3-certbot-nginx

    安装 Certbot (CentOS/RHEL):
    bash
    sudo yum install certbot python3-certbot-nginx -y
  2. 获取并安装 SSL 证书:
    Certbot 会自动为您获取证书并修改 Nginx 配置。
    bash
    sudo certbot --nginx -d your_domain -d www.your_domain

    Certbot 会提示您输入电子邮件地址、同意服务条款,并询问是否将所有 HTTP 请求重定向到 HTTPS。建议选择重定向。
  3. 手动配置 SSL/TLS (如果 Certbot 不适用或您有自己的证书):
    • 将您的 SSL 证书文件 (fullchain.pem.crt) 和私钥文件 (privkey.pem.key) 上传到服务器的安全位置 (例如 /etc/nginx/ssl/)。
    • 编辑您的 Server Block 配置文件 (例如 /etc/nginx/sites-available/your_domain):
      “`nginx
      server {
      listen 80;
      listen [::]:80;
      server_name your_domain www.your_domain;
      return 301 https://$server_name$request_uri; # 将HTTP重定向到HTTPS
      }

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

      ssl_certificate /etc/nginx/ssl/fullchain.pem; # 您的证书文件路径
      ssl_certificate_key /etc/nginx/ssl/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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
      ssl_prefer_server_ciphers on;
      
      root /var/www/your_domain/html;
      index index.html;
      
      location / {
          try_files $uri $uri/ =404;
      }
      

      }
      4. **测试配置并重新加载 Nginx**:bash
      sudo nginx -t
      sudo systemctl reload nginx
      “`
      现在您的网站应该可以通过 HTTPS 访问了。

7. 故障排除

  • 配置语法错误: 始终使用 sudo nginx -t 命令检查配置文件的语法。如果存在错误,Nginx 会指出错误所在的行和文件。
  • Nginx 服务未运行: 使用 sudo systemctl status nginx 检查服务状态。如果服务未启动或失败,查看日志以获取更多信息。
  • 无法访问网站:
    • 检查防火墙是否允许 80/443 端口的流量。
    • 确保域名正确解析到服务器 IP 地址。
    • 检查 Nginx 错误日志 (/var/log/nginx/error.log) 和访问日志 (/var/log/nginx/access.log) 以获取详细错误信息。
  • 权限问题: 确保 Nginx 进程 (通常是 www-datanginx 用户) 对网站文件和目录具有读取权限。

8. 总结

通过本文,您应该已经掌握了在 Linux 环境下安装和配置 Nginx 的基本知识。从简单的静态文件服务到复杂的反向代理和负载均衡,Nginx 提供了强大的功能来满足各种 Web 服务需求。持续学习 Nginx 的高级特性和优化技巧,将帮助您构建更健壮、高性能的 Web 架构。

滚动至顶部