CentOS 安装 Nginx 教程


CentOS 系统下 Nginx 的详尽安装与基础配置指南

引言

在当今互联网技术飞速发展的时代,构建高效、稳定、安全的 Web 服务是至关重要的。Nginx(发音为 "engine-x")作为一款高性能的开源 Web 服务器、反向代理服务器、负载均衡器以及 HTTP 缓存,凭借其卓越的性能、高并发处理能力、低资源消耗和丰富的模块化功能,在全球范围内获得了广泛的应用,成为众多网站和应用的首选 Web 服务器软件之一。CentOS(Community ENTerprise Operating System)则是一个基于 Red Hat Enterprise Linux (RHEL) 源代码编译而成的、免费且开源的企业级 Linux 发行版,以其稳定性、安全性和长周期支持而备受系统管理员和企业的青睐。

将 Nginx 部署在稳定可靠的 CentOS 系统上,无疑是一种强强联合的经典搭配。本文旨在提供一个全面且详尽的教程,一步步指导您如何在 CentOS 系统(涵盖 CentOS 7 及 CentOS Stream/8/9 等较新版本)上成功安装并进行基础配置 Nginx。我们将深入探讨不同的安装方法、服务管理、防火墙设置、基础配置文件的理解以及验证安装等环节,力求让不同经验水平的用户都能顺利完成部署。

一、 环境准备与前提条件

在开始安装 Nginx 之前,请确保满足以下基本条件:

  1. 一台运行 CentOS 的服务器: 您需要拥有一台安装了 CentOS 操作系统的物理服务器、虚拟机或云主机。本教程理论上适用于 CentOS 7 及更新版本。
  2. 具有 Sudo 或 Root 权限的用户: 安装软件包和修改系统配置通常需要管理员权限。您需要能够以 root 用户身份登录,或者使用一个具有 sudo 权限的普通用户账户。在执行需要提升权限的命令时,请在命令前加上 sudo
  3. 稳定的网络连接: 安装过程需要从 CentOS 的官方或第三方软件仓库下载 Nginx 软件包及其依赖项,因此必须确保服务器能够访问互联网。
  4. 熟悉基本的 Linux 命令行操作: 本教程将完全通过命令行界面 (CLI) 进行操作,您需要对 cd, ls, mkdir, vi/nano (文本编辑器), systemctl, firewall-cmd 等基本命令有所了解。
  5. 了解 yumdnf 包管理器: CentOS 7 主要使用 yum 作为包管理器,而 CentOS 8 及更新版本则推荐使用 dnf(它是 yum 的下一代版本,兼容 yum 命令)。本教程将尽量同时提供两种命令,您可以根据您的 CentOS 版本选择使用。

二、 更新系统软件包

在安装任何新软件之前,一个良好的习惯是先更新系统上已安装的所有软件包到最新版本。这有助于确保系统的安全性、稳定性和兼容性。打开您的终端,执行以下命令:

  • 对于 CentOS 7:
    bash
    sudo yum update -y
  • 对于 CentOS 8/Stream/9:
    bash
    sudo dnf update -y
    # 或者,您仍然可以使用 yum 命令,dnf 会自动处理
    # sudo yum update -y

参数 -y 表示在更新过程中自动确认所有提示,无需手动输入 'yes'。这个过程可能需要一些时间,具体取决于您系统上需要更新的软件包数量和网络速度。

三、 安装 Nginx:两种主要方法

在 CentOS 上安装 Nginx 主要有两种推荐的方法:

  1. 使用 CentOS 官方(或 EPEL)软件仓库安装: 这是最简单直接的方法,通常能安装一个稳定但可能不是最新版本的 Nginx。对于 CentOS 7,Nginx 通常位于 EPEL (Extra Packages for Enterprise Linux) 仓库中;对于 CentOS 8+,Nginx 可能已包含在 AppStream 仓库中。
  2. 使用 Nginx 官方软件仓库安装: 这是 Nginx 官方推荐的方法,可以确保您安装到最新、最稳定的 Nginx 版本,或者选择安装最新的主线 (Mainline) 版本(包含最新功能,但可能不如稳定版经过广泛测试)。

方法一:通过 CentOS/EPEL 仓库安装 Nginx

  • 步骤 1: 安装 EPEL 仓库 (主要针对 CentOS 7)
    如果您的 CentOS 7 系统尚未安装 EPEL 仓库,需要先进行安装。CentOS 8+ 通常不需要单独安装 EPEL 来获取 Nginx,因为 Nginx 位于其内置的 AppStream 仓库中。
    bash
    sudo yum install epel-release -y

    安装完成后,可以验证一下 EPEL 仓库是否已启用。

  • 步骤 2: 安装 Nginx
    现在,无论您使用的是 CentOS 7 (已安装 EPEL) 还是 CentOS 8+,都可以使用包管理器来安装 Nginx:

    • 对于 CentOS 7:
      bash
      sudo yum install nginx -y
    • 对于 CentOS 8/Stream/9:
      bash
      sudo dnf install nginx -y
      # 或者
      # sudo yum install nginx -y

      系统会自动解决依赖关系并完成 Nginx 的安装。
  • 步骤 3: 验证安装 (可选)
    安装完成后,您可以检查 Nginx 的版本来确认安装是否成功:
    bash
    nginx -v

    这会输出类似 nginx version: nginx/1.x.x 的信息。

方法二:通过 Nginx 官方仓库安装 Nginx (推荐)

这种方法能让您获得官方维护的最新 Nginx 版本。

  • 步骤 1: 设置 Nginx 官方仓库
    我们需要创建一个 YUM/DNF 仓库配置文件,告诉系统从哪里下载 Nginx 软件包。
    首先,创建一个名为 nginx.repo 的文件在 /etc/yum.repos.d/ 目录下:
    bash
    sudo vi /etc/yum.repos.d/nginx.repo
    # 或者使用 nano 编辑器: sudo nano /etc/yum.repos.d/nginx.repo

    然后,根据您的 CentOS 版本和希望安装的 Nginx 版本(稳定版 Stable 或主线版 Mainline),将以下内容之一粘贴到文件中:

    对于 Nginx 稳定版 (Stable):
    ini
    [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

    对于 Nginx 主线版 (Mainline):
    ini
    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true

    说明:
    * $releasever: 这个变量会自动替换为您的 CentOS 主版本号(如 7, 8, 9)。
    * $basearch: 这个变量会自动替换为您的系统架构(通常是 x86_64)。
    * gpgcheck=1gpgkey: 启用 GPG 签名检查,确保软件包的完整性和来源可靠性。
    * enabled=1: 启用此仓库。
    * 选择 Stable 还是 Mainline? Stable 版本经过更长时间的测试,适合生产环境。Mainline 版本包含最新的功能和改进,更新更频繁,适合需要最新特性的用户或测试环境。通常推荐使用 Stable 版本。

    保存并关闭文件 (在 vi 中按 Esc,然后输入 :wq 回车;在 nano 中按 Ctrl+X,然后按 Y 确认保存,再按回车)。

  • 步骤 2: (重要)处理 CentOS 8+ AppStream 中的 Nginx 模块冲突
    在 CentOS 8/Stream/9 上,系统默认的 AppStream 仓库也可能包含一个 Nginx 包(通常是一个模块化的版本)。为了确保我们安装的是来自 Nginx 官方仓库的版本,而不是系统自带的旧版本,需要先禁用 AppStream 中的 Nginx 模块:
    bash
    sudo dnf module disable nginx -y
    # 或者
    # sudo yum module disable nginx -y

    如果您使用的是 CentOS 7,则可以跳过此步骤。

  • 步骤 3: 安装 Nginx
    现在,您可以像之前一样使用包管理器安装 Nginx。系统会自动优先使用您刚刚添加并启用的 Nginx 官方仓库:

    • 对于 CentOS 7:
      bash
      sudo yum install nginx -y
    • 对于 CentOS 8/Stream/9:
      bash
      sudo dnf install nginx -y
      # 或者
      # sudo yum install nginx -y

      安装过程中,系统可能会提示您导入 Nginx 的 GPG 密钥,输入 y 并按回车确认。
  • 步骤 4: 验证安装
    同样,检查 Nginx 版本以确认安装成功,并查看是否安装了您期望的版本(来自官方仓库的版本号通常比 EPEL/AppStream 中的要新):
    bash
    nginx -v

四、 管理 Nginx 服务

安装完成后,Nginx 服务并不会自动启动。您需要使用 systemd 服务管理器 (systemctl) 来控制 Nginx 进程。

  • 启动 Nginx 服务:
    bash
    sudo systemctl start nginx

    执行此命令后,Nginx 进程将在后台运行。

  • 设置 Nginx 开机自启:
    为了让 Nginx 在服务器重启后自动启动,需要将其设置为开机自启:
    bash
    sudo systemctl enable nginx

    执行后会创建一个符号链接,确保 Nginx 服务在系统引导时被加载。

  • 检查 Nginx 服务状态:
    您可以随时查看 Nginx 服务的运行状态、是否已启用开机自启以及最近的日志信息:
    bash
    sudo systemctl status nginx

    如果 Nginx 正常运行,您应该会看到 Active: active (running) 的状态信息。按 q 退出状态查看。

  • 停止 Nginx 服务:
    如果需要停止 Nginx 服务:
    bash
    sudo systemctl stop nginx

  • 重启 Nginx 服务:
    当您修改了 Nginx 的主要配置文件并且需要让更改生效时,通常需要重启服务:
    bash
    sudo systemctl restart nginx

  • 重新加载 Nginx 配置 (Graceful Reload):
    如果您只是修改了 Nginx 的配置文件(例如添加或修改了一个虚拟主机配置),并且希望在不中断现有连接的情况下应用这些更改,可以使用 reload 命令。这是一种更平滑的方式,Nginx 会启动新的工作进程来处理新配置,并优雅地关闭旧的工作进程:
    bash
    sudo systemctl reload nginx

    或者,您也可以使用 Nginx 命令行工具来发送 reload 信号:
    bash
    sudo nginx -s reload

    强烈建议 在执行 reloadrestart 之前,先检查配置文件的语法是否正确:
    bash
    sudo nginx -t

    如果输出显示 syntax is oktest is successful,则表示配置文件没有语法错误,可以安全地重载或重启。

五、 配置防火墙

默认情况下,CentOS 的防火墙(通常是 firewalld)会阻止外部对 Nginx 使用的端口(HTTP 默认 80,HTTPS 默认 443)的访问。您需要配置防火墙规则以允许这些流量。

  • 检查防火墙状态:
    确保 firewalld 正在运行:
    bash
    sudo firewall-cmd --state

    如果显示 running,则防火墙是活动的。如果不是,您可能需要启动它 (sudo systemctl start firewalld) 并设置为开机自启 (sudo systemctl enable firewalld)。

  • 允许 HTTP (端口 80) 和 HTTPS (端口 443) 流量:
    firewalld 使用 "服务 (services)" 的概念来简化端口管理。Nginx 通常已经预定义了 httphttps 服务。
    ```bash
    # 允许 HTTP 流量 (永久生效)
    sudo firewall-cmd --permanent --add-service=http

    允许 HTTPS 流量 (永久生效)

    sudo firewall-cmd --permanent --add-service=https
    ``--permanent` 标志表示这些规则将在防火墙重新加载或系统重启后依然有效。

  • 重新加载防火墙配置使规则生效:
    添加永久规则后,需要重新加载防火墙配置:
    bash
    sudo firewall-cmd --reload

  • 验证防火墙规则:
    您可以列出当前活动的防火墙规则,确认 httphttps 服务是否已包含在允许的服务列表中:
    bash
    sudo firewall-cmd --list-all

    在输出的 services: 行中,您应该能看到 httphttps

六、 测试 Nginx 安装

现在,Nginx 已经安装、启动并配置了防火墙,是时候验证它是否正常工作了。

  1. 获取服务器的 IP 地址:
    您需要知道您的 CentOS 服务器的公共 IP 地址(如果是云主机)或私有 IP 地址(如果在局域网内访问)。可以使用以下命令之一查找:
    bash
    ip addr show
    # 或者
    hostname -I

    找到与您的主网络接口关联的 IP 地址。

  2. 通过浏览器访问:
    打开您本地计算机上的 Web 浏览器(如 Chrome, Firefox 等),在地址栏输入 http://<您的服务器IP地址>,然后按回车。

  3. 查看 Nginx 欢迎页面:
    如果一切配置正确,您应该能看到 Nginx 的默认欢迎页面。这个页面通常会显示 "Welcome to nginx!" 或类似的信息。这表明 Nginx 已成功安装并正在监听 HTTP 请求。

    • 如果无法访问:
      • 检查 Nginx 服务状态: sudo systemctl status nginx,确保它是 active (running)
      • 检查防火墙配置: sudo firewall-cmd --list-all,确认 http 服务已添加且防火墙已 reload
      • 检查 IP 地址: 确保您使用的是正确的服务器 IP 地址,并且您的本地计算机与服务器之间的网络是通畅的(例如,没有其他网络防火墙或路由问题)。
      • 检查 Nginx 错误日志: Nginx 的错误日志通常位于 /var/log/nginx/error.log。查看是否有任何明显的错误信息。

七、 理解 Nginx 配置文件结构

Nginx 的强大之处在于其灵活的配置系统。了解其基本结构对于后续定制至关重要。

  • 主配置文件: /etc/nginx/nginx.conf
    这是 Nginx 的核心配置文件。它定义了全局设置,例如工作进程数 (worker_processes)、错误日志路径 (error_log)、进程 ID 文件路径 (pid) 等。它还包含一个 http 块,用于定义 HTTP 相关的全局设置。

  • HTTP 配置块 (http block):
    nginx.conf 文件内部,http { ... } 块是配置 Web 服务功能的主要区域。它包含诸如 include, default_type, log_format, access_log, sendfile, keepalive_timeout 等指令。

  • 包含其他配置文件 (include directive):
    为了保持配置的模块化和易于管理,nginx.conf 通常使用 include 指令来加载其他目录下的配置文件。一个非常常见的做法是在 http 块内包含:
    ```nginx
    http {
    # ... 其他 http 配置 ...

    include /etc/nginx/conf.d/*.conf;
    # 有些配置可能还包含 sites-enabled 目录
    # include /etc/nginx/sites-enabled/*;
    
    # ... 其他 http 配置 ...
    

    }
    ``
    这意味着所有位于
    /etc/nginx/conf.d/目录下且以.conf结尾的文件都会被加载到http` 配置块中。这是放置您的 服务器块 (Server Blocks) / 虚拟主机 (Virtual Hosts) 配置的推荐位置。

  • 服务器块 (server block):
    每个 server { ... } 块定义了一个虚拟主机,用于处理特定域名或 IP 地址的请求。您可以在 /etc/nginx/conf.d/ 目录下为每个网站创建一个单独的 .conf 文件(例如 mywebsite.conf)。一个典型的 server 块包含:

    • listen: 指定 Nginx 监听的端口(如 listen 80; for HTTP, listen 443 ssl; for HTTPS)。
    • server_name: 定义此服务器块响应的域名(如 server_name example.com www.example.com;)或 IP 地址。
    • root: 指定该虚拟主机的网站文件根目录(如 root /var/www/mywebsite;)。
    • index: 定义默认的索引文件(如 index index.html index.htm;)。
    • location: 定义如何处理特定 URL 路径的请求(例如,处理静态文件、代理到后端应用等)。
  • 默认服务器块:
    Nginx 安装后通常会有一个默认的服务器块配置文件,例如 /etc/nginx/conf.d/default.conf。这就是您之前通过 IP 地址访问时看到欢迎页面的原因。您可以修改或禁用这个默认配置,并创建您自己的服务器块。

八、 基础 Nginx 配置示例:托管静态网站

让我们通过一个简单的例子来演示如何配置 Nginx 托管一个静态 HTML 网站。

  1. 创建网站根目录和示例文件:
    ```bash
    # 创建网站文件的存放目录
    sudo mkdir -p /var/www/my_static_site/html

    创建一个简单的 HTML 首页

    sudo bash -c 'echo "My Static Site

    Hello from Nginx!

    " > /var/www/my_static_site/html/index.html'

    设置正确的权限(让 Nginx 进程可以读取文件)

    通常 Nginx 工作进程以 'nginx' 用户运行

    sudo chown -R nginx:nginx /var/www/my_static_site
    sudo chmod -R 755 /var/www/my_static_site
    ```

  2. 创建 Nginx 服务器块配置文件:
    /etc/nginx/conf.d/ 目录下创建一个新的配置文件,例如 my_static_site.conf
    bash
    sudo vi /etc/nginx/conf.d/my_static_site.conf

    将以下内容粘贴到文件中:
    ```nginx
    server {
    listen 80;
    listen [::]:80; # 同时监听 IPv6 地址

    server_name your_domain_or_ip; # 将 'your_domain_or_ip' 替换为您的域名或服务器 IP 地址
    
    root /var/www/my_static_site/html;
    index index.html index.htm;
    
    location / {
        try_files $uri $uri/ =404; # 尝试查找文件,然后目录,最后返回 404
    }
    
    access_log /var/log/nginx/my_static_site.access.log;
    error_log /var/log/nginx/my_static_site.error.log;
    

    }
    ``
    * 将
    your_domain_or_ip替换为您服务器的实际 IP 地址或您已解析到该服务器的域名。
    *
    root指令指向我们刚刚创建的网站目录。
    *
    index指定了默认文件。
    *
    location / { ... }是最基本的 location 块,try_files` 指令用于处理请求,确保能正确找到文件。
    * 指定了该站点的访问日志和错误日志文件。

    保存并关闭文件。

  3. (可选)禁用默认服务器块:
    如果您不希望默认的 Nginx 欢迎页面响应请求(例如,当通过 IP 地址访问时),您可以重命名或删除默认的配置文件 /etc/nginx/conf.d/default.conf,或者更好地,编辑它并注释掉 listen 指令或整个 server 块。如果将其重命名为 .conf 以外的扩展名,Nginx 将不会加载它:
    bash
    sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled

  4. 测试 Nginx 配置:
    在应用新配置之前,务必进行语法检查:
    bash
    sudo nginx -t

    确保输出显示 syntax is oktest is successful

  5. 重新加载 Nginx 配置:
    bash
    sudo systemctl reload nginx

  6. 再次测试:
    现在,再次使用浏览器访问 http://<您的服务器IP地址或域名>。您应该能看到您创建的 "Hello from Nginx!" 页面,而不是之前的默认欢迎页。

九、 总结与后续步骤

恭喜您!至此,您已经在 CentOS 系统上成功安装了 Nginx,学会了如何管理其服务,配置了防火墙允许访问,理解了基本的配置文件结构,并成功托管了一个简单的静态网站。

这仅仅是 Nginx 功能的冰山一角。从这里开始,您可以探索更多高级功能:

  • 配置 HTTPS: 使用 Let's Encrypt 或其他 CA 颁发的 SSL/TLS 证书为您的网站启用 HTTPS 加密,提高安全性。
  • 设置多个 Server Blocks: 在同一台服务器上托管多个不同的网站或域名。
  • 反向代理: 将 Nginx 配置为反向代理服务器,将请求转发给后端的应用服务器(如 Node.js, Python/Django/Flask, PHP-FPM, Java/Tomcat 等),实现负载均衡、缓存和安全防护。
  • 负载均衡: 将流量分发到多个后端服务器,提高可用性和性能。
  • HTTP 缓存: 缓存静态和动态内容,减少后端负载,加快响应速度。
  • 性能调优: 根据服务器硬件和应用负载调整 Nginx 的 worker_processes, worker_connections 等参数。
  • 安全加固: 配置 Nginx 以防止常见的 Web 攻击,如限制请求速率、添加安全头等。

Nginx 是一个极其强大和灵活的工具。持续学习和实践 Nginx 的配置,将极大地提升您构建和管理现代 Web 服务的能力。希望本篇详尽的教程能为您在 CentOS 上使用 Nginx 打下坚实的基础。


THE END