CentOS 安装 Nginx 教程 – wiki基地


CentOS 系统上安装和配置 Nginx 的详细教程

引言

在当今互联网应用架构中,高性能的 Web 服务器扮演着至关重要的角色。Nginx(发音为 “engine-x”)作为其中的佼佼者,以其高性能、高并发处理能力、低内存占用以及强大的反向代理、负载均衡和缓存功能而闻名。它被广泛应用于静态资源服务、API 网关、微服务路由等场景,是许多大型网站和应用的首选 Web 服务器软件。

CentOS,作为基于 Red Hat Enterprise Linux (RHEL) 源代码构建的免费操作系统,因其稳定性、安全性和企业级支持(尽管 CentOS Linux 已停止更新,但 CentOS Stream 或 Rocky Linux/AlmaLinux 作为其后续版本依然流行,安装步骤类似),长期以来一直是部署服务器应用的流行选择。

本篇文章将为您提供一个在 CentOS 系统(包括 CentOS 7 和 CentOS Stream 8/9)上安装和配置 Nginx 的详细教程。我们将介绍不同的安装方法,涵盖安装过程中的关键步骤、服务管理、防火墙配置、SELinux 考虑以及基本的 Nginx 配置和验证。无论您是系统管理员、开发人员还是对部署 Web 服务感兴趣的普通用户,这篇教程都将帮助您顺利地在 CentOS 上搭建起 Nginx 环境。

前提条件

在开始安装之前,请确保您具备以下条件:

  1. 一台运行 CentOS 7 或 CentOS Stream 8/9 的服务器或虚拟机:确保您拥有该系统的 root 权限或可以通过 sudo 命令执行管理操作。
  2. 稳定的互联网连接:安装过程需要从软件仓库下载 Nginx 软件包。
  3. 基本的 Linux 命令行知识:熟悉使用终端、执行命令、编辑文件等操作。

安装 Nginx 的方法

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

  1. 使用 CentOS/EPEL 官方软件仓库:这是最简单的方法,直接通过 yumdnf 包管理器安装。优点是操作简便、兼容性好、更新和维护由系统负责;缺点是仓库中提供的 Nginx 版本可能不是最新的稳定版或主线版。
  2. 使用 Nginx 官方提供的软件仓库:这种方法允许您安装最新版本的 Nginx,包括稳定版(Stable)和主线版(Mainline),通常包含更多新特性和性能优化。优点是版本新、功能全;缺点是需要手动添加仓库配置。

我们将详细介绍这两种方法,您可以根据自己的需求选择合适的一种。通常,对于生产环境,如果需要最新特性或特定模块,建议使用 Nginx 官方仓库;如果对版本要求不高,追求稳定和简便,使用 CentOS 仓库即可。

方法一:使用 CentOS/EPEL 软件仓库安装 Nginx

这种方法利用 CentOS 及其扩展仓库 EPEL (Extra Packages for Enterprise Linux) 来安装 Nginx。EPEL 仓库提供了许多在官方 CentOS 仓库中找不到的常用软件包。

步骤 1:更新系统

在安装任何新软件包之前,强烈建议更新系统,以确保所有现有软件包都是最新的,并应用最新的安全补丁。

“`bash
sudo yum update -y

或者对于 CentOS Stream 8/9:

sudo dnf update -y

“`

yum (Yellowdog Updater, Modified) 是 CentOS 7 及早期版本中使用的包管理器,而 dnf (Dandified Yum) 是 CentOS Stream 8/9 及更高版本中推荐的包管理器。大多数命令在两者之间是相似的。

步骤 2:安装 EPEL 仓库

Nginx 在 CentOS 官方仓库中可能不可用,或者版本较旧。通常它包含在 EPEL 仓库中。如果您的系统尚未安装 EPEL 仓库,需要先安装它。

“`bash

对于 CentOS 7:

sudo yum install epel-release -y

对于 CentOS Stream 8/9:

sudo dnf install epel-release -y
“`

安装完成后,EPEL 仓库的配置文件会被添加到 /etc/yum.repos.d/ 目录下。

步骤 3:安装 Nginx

EPEL 仓库安装成功后,您就可以直接使用包管理器安装 Nginx 了。

“`bash

对于 CentOS 7:

sudo yum install nginx -y

对于 CentOS Stream 8/9:

sudo dnf install nginx -y
“`

包管理器会自动解析依赖关系并下载安装 Nginx 软件包。

步骤 4:启动 Nginx 服务

安装完成后,Nginx 服务并不会自动启动。您需要使用 systemctl 命令来启动它。

bash
sudo systemctl start nginx

步骤 5:设置 Nginx 开机自启

为了确保服务器重启后 Nginx 服务能够自动启动,您需要使用 systemctl 命令启用开机自启功能。

bash
sudo systemctl enable nginx

创建符号链接 /etc/systemd/system/multi-user.target.wants/nginx.service -> /usr/lib/systemd/system/nginx.service

步骤 6:检查 Nginx 服务状态

您可以使用 systemctl status 命令来检查 Nginx 服务的运行状态。

bash
sudo systemctl status nginx

如果一切正常,您应该会看到输出显示 active (running)

优点:

  • 安装过程极其简单。
  • 由 CentOS/EPEL 社区维护,与系统集成度高。
  • 依赖关系处理自动化。

缺点:

  • Nginx 版本可能不是最新的,缺少一些新特性或性能优化。
  • 更新频率不如 Nginx 官方仓库快。

方法二:使用 Nginx 官方软件仓库安装 Nginx

如果您需要安装最新版本的 Nginx,包括稳定版或主线版,推荐使用 Nginx 官方提供的软件仓库。Nginx 官方为基于 RHEL 的系统(包括 CentOS、Rocky Linux、AlmaLinux)提供了预编译好的 RPM 包。

步骤 1:确定您的 CentOS 版本

Nginx 官方仓库的配置会根据您的 CentOS/RHEL 版本有所不同。您可以使用以下命令查看版本信息:

“`bash
cat /etc/redhat-release

或者

rpm -E %centos

或者

hostnamectl

“`

您需要知道是 CentOS 7 还是 CentOS Stream 8 或 9。

步骤 2:创建 Nginx 仓库配置文件

/etc/yum.repos.d/ 目录下创建一个新的 .repo 文件来定义 Nginx 官方仓库。例如,创建一个名为 nginx.repo 的文件:

bash
sudo vi /etc/yum.repos.d/nginx.repo

然后根据您的 CentOS 版本,将相应的配置内容复制粘贴到文件中。

对于 CentOS 7:

ini
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

对于 CentOS Stream 8:

ini
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/8/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

对于 CentOS Stream 9:

ini
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/9/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

  • [nginx]:定义仓库的名称,方括号内是仓库 ID。
  • name=nginx repo:对仓库的人类可读描述。
  • baseurl=:指定软件包的下载地址。注意 $basearch 会自动被您的系统架构(如 x86_64)替换。请确保 URL 是正确的。
  • gpgcheck=1:启用 GPG 密钥检查,确保软件包的完整性和来源可靠性。
  • enabled=1:启用此仓库。
  • gpgkey=:指定用于验证软件包签名的 GPG 密钥的 URL。

注意: Nginx 官方仓库默认提供的是稳定版 (Stable)。如果您想要安装主线版 (Mainline),可以将 baseurl 中的 /centos/X/ 替换为 /centos-mainline/X/ (其中 X 是您的 CentOS 版本号),并在 gpgkey 中使用相同的密钥。例如,对于 CentOS 8 Mainline:

ini
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/centos-mainline/8/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

请根据需要选择稳定版或主线版仓库配置,并确保您只启用其中一个。通常推荐稳定版用于生产环境。

保存并关闭文件。

步骤 3:清理 yum/dnf 缓存 (推荐)

在添加新仓库后,清理一下包管理器缓存是个好习惯,确保它能识别新的仓库配置。

“`bash
sudo yum clean all

或者对于 CentOS Stream 8/9:

sudo dnf clean all

“`

步骤 4:安装 Nginx

现在您可以使用包管理器从新添加的 Nginx 官方仓库安装 Nginx 了。

“`bash
sudo yum install nginx -y

或者对于 CentOS Stream 8/9:

sudo dnf install nginx -y

“`

包管理器会从 Nginx 官方仓库下载并安装最新版本的 Nginx。

步骤 5、6、7:启动服务、设置开机自启、检查状态

接下来的步骤与使用 CentOS/EPEL 仓库安装方法相同:

  • 启动 Nginx 服务:
    bash
    sudo systemctl start nginx
  • 设置开机自启:
    bash
    sudo systemctl enable nginx
  • 检查 Nginx 服务状态:
    bash
    sudo systemctl status nginx

优点:

  • 可以安装最新版本的 Nginx,享受新特性和性能改进。
  • 直接获取 Nginx 官方发布的软件包,更新及时。

缺点:

  • 需要手动添加仓库配置。
  • 与系统自带软件仓库的管理方式略有不同(尽管差别很小)。

无论您选择哪种安装方法,一旦 systemctl status nginx 显示服务正在运行,Nginx 就已经在您的 CentOS 系统上安装并启动成功了。

防火墙配置

在 CentOS 系统上,默认通常启用了 FirewallD 防火墙。如果您不配置防火墙规则,外部用户将无法访问您的服务器上运行的 Nginx 服务(默认监听 80 和 443 端口)。您需要打开 HTTP (80) 和 HTTPS (443) 端口。

步骤 1:检查 FirewallD 状态

bash
sudo systemctl status firewalld

如果显示 active (running),说明防火墙正在运行。

步骤 2:开放 HTTP 和 HTTPS 服务

FirewallD 允许按服务名称或端口号开放访问。开放 HTTP (80) 和 HTTPS (443) 服务的标准命令如下:

“`bash

开放 HTTP (80) 端口

sudo firewall-cmd –permanent –zone=public –add-service=http

开放 HTTPS (443) 端口

sudo firewall-cmd –permanent –zone=public –add-service=https
“`

  • --permanent:使规则永久生效,即使防火墙重启也不会丢失。
  • --zone=public:将规则添加到公共区域,这是大多数服务器默认使用的区域。
  • --add-service=http:允许 HTTP 服务的流量通过。
  • --add-service=https:允许 HTTPS 服务的流量通过。

步骤 3:重新加载 FirewallD 配置

添加永久规则后,需要重新加载防火墙配置使规则立即生效。

bash
sudo firewall-cmd --reload

步骤 4:验证规则

您可以列出公共区域的规则来验证是否已成功添加 HTTP 和 HTTPS 服务。

bash
sudo firewall-cmd --zone=public --list-services

您应该看到 httphttps 出现在输出列表中。

现在,外部用户应该能够通过 HTTP 和 HTTPS 协议访问您的 Nginx 服务器了。

SELinux 配置

SELinux (Security-Enhanced Linux) 是 CentOS 中一个重要的安全增强机制,它通过强制访问控制(MAC)来限制进程和用户对系统资源的访问。有时候,SELinux 可能会阻止 Nginx 正常工作,例如阻止它访问网站文件所在的目录,或者阻止它绑定到特定的端口。

默认情况下,Nginx 安装包通常已经配置了合适的 SELinux 上下文,允许它监听标准的 HTTP/HTTPS 端口并访问默认的 Web 根目录 (/usr/share/nginx/html)。然而,如果您更改了 Nginx 的默认配置,例如将网站根目录设置在非标准位置(如 /home/user/website/var/www/html),或者使用非标准的端口,SELinux 可能会阻止 Nginx 访问这些资源。

理解 SELinux 模式:

  • Enforcing (强制):SELinux 策略生效并强制执行,违反策略的操作会被阻止并记录。
  • Permissive (许可):SELinux 策略生效但不强制执行,违反策略的操作会被记录但不阻止。
  • Disabled (禁用):SELinux 完全禁用,不执行任何策略。

检查 SELinux 状态:

bash
getenforce

输出会显示当前的 SELinux 模式。

临时设置为 Permissive 模式 (用于排查问题):

bash
sudo setenforce 0

这将临时将 SELinux 设置为许可模式,直到系统重启或再次执行 setenforce 1 (设置为强制模式)。请注意:在生产环境中临时禁用 SELinux 进行故障排除后,务必将其重新设置为 Enforcing 模式,并找到正确的 SELinux 解决方案,而不是长期禁用。

检查 SELinux 日志:

当 SELinux 阻止某个操作时,相关信息会被记录在 /var/log/audit/audit.log/var/log/messages 中。您可以使用 ausearch 工具来过滤 SELinux 相关的拒绝日志:

bash
sudo ausearch -c "nginx" --raw | audit2allow -a

这个命令会查找与 “nginx” 相关的 audit 日志,并通过 audit2allow 工具尝试生成允许这些操作的 SELinux 策略模块定义。这对于了解哪些操作被阻止非常有帮助。

常见 SELinux 问题及其解决方案:

  1. Nginx 无法访问非标准 Web 根目录:
    如果您的网站文件不在 /usr/share/nginx/html,而是在其他目录,您需要为该目录设置正确的 SELinux 上下文(Type)。标准的 Web 内容文件类型是 httpd_sys_content_t

    • 查看目录的 SELinux 上下文:
      bash
      ls -Zd /path/to/your/website

      例如:ls -Zd /var/www/html
    • 修改目录的 SELinux 上下文:
      使用 semanage fcontext 命令设置文件的默认上下文,然后使用 restorecon 命令应用更改。
      bash
      sudo semanage fcontext -a -t httpd_sys_content_t "/path/to/your/website(/.*)?"
      sudo restorecon -Rv /path/to/your/website

      替换 /path/to/your/website 为您的实际路径。(/.*)? 确保子目录和文件也应用相同的上下文。
  2. Nginx 作为反向代理无法连接网络资源:
    默认情况下,出于安全考虑,Nginx 可能被阻止进行网络连接(作为客户端连接到后端服务器)。如果您的 Nginx 用作反向代理、FastCGI 或 uWSGI 网关,需要允许它发起网络连接。
    您需要启用 httpd_can_network_connect 这个 SELinux boolean 值。

    • 检查 boolean 值状态:
      bash
      getsebool httpd_can_network_connect
    • 启用 boolean 值 (永久生效):
      bash
      sudo setsebool -P httpd_can_network_connect on

      -P 参数确保更改在重启后依然有效。

处理 SELinux 问题可能比较复杂,最佳实践是理解策略,设置正确的上下文和 boolean 值,而不是简单地禁用 SELinux。

验证 Nginx 安装

在 Nginx 安装并启动成功,并且防火墙规则已经设置好后,您可以通过以下方式验证安装:

1. 本地验证:

在服务器上直接使用 curl 命令访问本地主机。

bash
curl http://localhost/

或者

bash
curl 127.0.0.1

如果 Nginx 正在运行并监听默认端口 80,您应该会看到 Nginx 默认的欢迎页面 HTML 内容。默认的欢迎页面文件通常位于 /usr/share/nginx/html/index.html

2. 远程验证 (通过浏览器):

在您的本地计算机上打开 Web 浏览器,输入您的 CentOS 服务器的公共 IP 地址或域名。

http://您的服务器IP地址或域名/

如果一切配置正确(Nginx 运行,防火墙开放了 80 端口),您应该能在浏览器中看到 Nginx 的欢迎页面,通常显示 “Welcome to nginx!”。

如果您看不到欢迎页面,请检查以下几点:
* Nginx 服务是否正在运行 (sudo systemctl status nginx)。
* 防火墙是否开放了 80 端口 (sudo firewall-cmd --zone=public --list-services)。
* SELinux 是否阻止了访问 (检查 SELinux 日志)。
* 网络连接是否正常。

Nginx 服务管理命令

了解如何管理 Nginx 服务是非常重要的:

  • 启动服务:
    bash
    sudo systemctl start nginx
  • 停止服务:
    bash
    sudo systemctl stop nginx
  • 重启服务: (会先停止再启动,可能会有短暂的服务中断)
    bash
    sudo systemctl restart nginx
  • 重新加载配置: (重新加载配置文件而无需停止服务,不会中断连接)
    bash
    sudo systemctl reload nginx

    在修改 Nginx 配置文件后,使用 reload 是更常用的方式。
  • 查看服务状态:
    bash
    sudo systemctl status nginx
  • 设置开机自启:
    bash
    sudo systemctl enable nginx
  • 禁用开机自启:
    bash
    sudo systemctl disable nginx

Nginx 配置文件结构和基本配置

Nginx 的主要配置文件是 /etc/nginx/nginx.conf。然而,为了更好的组织和管理,Nginx 通常会包含其他配置文件。

  • 主配置文件: /etc/nginx/nginx.conf
    这个文件包含全局配置、events 块和 http 块。http 块是配置 Web 服务器的主要区域,包含 server 块和 location 块。
  • 配置包含目录: /etc/nginx/conf.d/
    nginx.conf 文件通常包含一个 include /etc/nginx/conf.d/*.conf; 的指令。这意味着放在这个目录下的所有以 .conf 结尾的文件都会被 Nginx 在启动或重新加载时加载。这是推荐的添加虚拟主机(server 块)或其他独立配置的方式,可以保持主配置文件简洁。

主配置文件 (/etc/nginx/nginx.conf) 示例片段:

“`nginx
user nginx; # Nginx 工作进程运行的用户
worker_processes auto; # 工作进程数量,auto 根据 CPU 核心数自动设置
error_log /var/log/nginx/error.log; # 错误日志路径
pid /run/nginx.pid; # PID 文件路径

events {
worker_connections 1024; # 每个工作进程的最大连接数
# use epoll; # 使用高效的事件模型 (Linux)
}

http {
include /etc/nginx/mime.types; # 包含 MIME 类型映射
default_type application/octet-stream; # 默认 MIME 类型

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 启用时提高性能
tcp_nodelay on; # 启用 Nagle 算法,降低延迟
keepalive_timeout 65; # keep-alive 连接超时时间
types_hash_max_size 2048; # 增大 types_hash 表大小

# server_tokens off; # 隐藏 Nginx 版本信息 (增强安全性)

# 加载 conf.d 目录下的所有 .conf 文件
include /etc/nginx/conf.d/*.conf;

}
“`

conf.d 中创建一个简单的网站配置文件:

假设您想创建一个简单的虚拟主机来服务您的网站文件,您可以在 /etc/nginx/conf.d/ 目录下创建一个文件,例如 mywebsite.conf

bash
sudo vi /etc/nginx/conf.d/mywebsite.conf

将以下内容添加到文件中(假设您的网站文件放在 /usr/share/nginx/mywebsite/):

“`nginx
server {
listen 80; # 监听 80 端口
server_name example.com www.example.com; # 您的域名或服务器 IP

root /usr/share/nginx/mywebsite; # 网站文件根目录
index index.html index.htm; # 默认首页文件

location / {
    try_files $uri $uri/ =404; # 尝试查找文件或目录,否则返回 404 错误
}

# 可以添加其他 location 块来处理特定路径或文件类型
# location ~ \.php$ {
#     # PHP 处理配置,例如 FastCGI
#     include fastcgi_params;
#     fastcgi_pass unix:/run/php-fpm/www.sock; # 根据您的 PHP-FPM 配置修改
#     fastcgi_index index.php;
#     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# }

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

}
“`

  • server 块:定义一个虚拟主机。
  • listen:指定监听的 IP 地址和端口。
  • server_name:指定与此虚拟主机匹配的域名或 IP 地址。
  • root:指定网站的根目录。
  • index:指定当请求目录时默认查找的文件名。
  • location / 块:处理所有以 / 开头的请求。try_files 指令是 Nginx 处理请求的一个强大方式。

测试 Nginx 配置:

在修改配置文件后,务必先测试配置文件的语法是否正确,避免因配置错误导致 Nginx 启动失败。

bash
sudo nginx -t

如果输出显示 syntax is okconfiguration file test is successful,说明配置文件语法正确。

重新加载 Nginx 配置:

配置文件测试通过后,重新加载 Nginx 服务使其加载新的配置。

bash
sudo systemctl reload nginx

常见问题与故障排除

如果在安装或启动过程中遇到问题,可以参考以下常见问题和排查方法:

  1. Nginx 服务无法启动:

    • 检查服务状态: sudo systemctl status nginx。查看输出的错误信息,通常能提供启动失败的原因。
    • 检查日志文件: 查看 Nginx 的错误日志 /var/log/nginx/error.log,以及系统日志 sudo journalctl -xe,查找与 Nginx 相关的错误信息。
    • 测试配置文件: sudo nginx -t 确保配置文件语法正确。
    • 端口冲突: 确保 80 和 443 端口没有被其他进程占用。可以使用 sudo ss -tulnp | grep :80sudo netstat -tulnp | grep :80 (如果安装了 net-tools) 来检查。
    • SELinux: 如前所述,SELinux 可能会阻止 Nginx 访问文件或绑定端口。检查 SELinux 日志并尝试临时设置为 Permissive 模式 (sudo setenforce 0) 排查。
  2. 无法通过浏览器访问 Nginx 欢迎页面:

    • 检查 Nginx 服务状态: 确保 Nginx 正在运行。
    • 检查防火墙: 确保防火墙(FirewallD)开放了 80 和 443 端口。使用 sudo firewall-cmd --zone=public --list-servicessudo firewall-cmd --zone=public --list-ports 检查。
    • 网络连接: 确保客户端与服务器之间的网络连接正常,没有其他防火墙(如云服务商的安全组)阻止了流量。
    • 服务器 IP/域名是否正确: 确保您在浏览器中输入的地址是服务器的正确地址。
  3. 修改配置后 Nginx 不生效:

    • 测试配置语法: 确保新配置没有语法错误 (sudo nginx -t)。
    • 重新加载服务: 使用 sudo systemctl reload nginxsudo systemctl restart nginx 使新配置生效。
    • 文件权限和 SELinux: 如果您修改了网站根目录或日志目录等,确保 Nginx 运行用户 (nginx) 对这些目录有读取和执行权限,并且 SELinux 上下文正确。

总结与后续步骤

通过本文的详细教程,您应该已经成功地在 CentOS 系统上安装并启动了 Nginx,并了解了如何进行基本的防火墙和 SELinux 配置。Nginx 的安装只是第一步,接下来您可以探索更多高级功能:

  • 虚拟主机配置 (Server Blocks): 搭建多个网站在同一个 Nginx 实例上。
  • SSL/TLS 配置: 为您的网站启用 HTTPS 安全连接,需要获取 SSL 证书。
  • 反向代理 (Reverse Proxy): 将请求转发到后端应用服务器(如 Node.js, Python, Java 应用)。
  • 负载均衡 (Load Balancing): 将流量分发到多个后端服务器,提高可用性和性能。
  • 静态文件服务优化: 配置缓存、压缩等,提高静态资源加载速度。
  • HTTP/2 和 HTTP/3: 配置支持更现代、性能更高的 HTTP 协议。
  • Nginx 模块: 了解并使用 Nginx 的各种模块(如 GeoIP, Image Filter, ngx_http_auth_basic_module 等)。

掌握这些进阶配置将使您能够充分发挥 Nginx 的强大能力,为您的应用程序提供稳定、高效的 Web 服务。希望这篇详细的教程对您有所帮助!祝您使用 Nginx 愉快!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部