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 之前,请确保满足以下基本条件:
- 一台运行 CentOS 的服务器: 您需要拥有一台安装了 CentOS 操作系统的物理服务器、虚拟机或云主机。本教程理论上适用于 CentOS 7 及更新版本。
- 具有 Sudo 或 Root 权限的用户: 安装软件包和修改系统配置通常需要管理员权限。您需要能够以 root 用户身份登录,或者使用一个具有
sudo
权限的普通用户账户。在执行需要提升权限的命令时,请在命令前加上sudo
。 - 稳定的网络连接: 安装过程需要从 CentOS 的官方或第三方软件仓库下载 Nginx 软件包及其依赖项,因此必须确保服务器能够访问互联网。
- 熟悉基本的 Linux 命令行操作: 本教程将完全通过命令行界面 (CLI) 进行操作,您需要对
cd
,ls
,mkdir
,vi
/nano
(文本编辑器),systemctl
,firewall-cmd
等基本命令有所了解。 - 了解
yum
或dnf
包管理器: 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 主要有两种推荐的方法:
- 使用 CentOS 官方(或 EPEL)软件仓库安装: 这是最简单直接的方法,通常能安装一个稳定但可能不是最新版本的 Nginx。对于 CentOS 7,Nginx 通常位于 EPEL (Extra Packages for Enterprise Linux) 仓库中;对于 CentOS 8+,Nginx 可能已包含在 AppStream 仓库中。
- 使用 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 的安装。
- 对于 CentOS 7:
-
步骤 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=1
和gpgkey
: 启用 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
并按回车确认。
- 对于 CentOS 7:
-
步骤 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
强烈建议 在执行reload
或restart
之前,先检查配置文件的语法是否正确:
bash
sudo nginx -t
如果输出显示syntax is ok
和test 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 通常已经预定义了http
和https
服务。
```bash
# 允许 HTTP 流量 (永久生效)
sudo firewall-cmd --permanent --add-service=http允许 HTTPS 流量 (永久生效)
sudo firewall-cmd --permanent --add-service=https
``
--permanent` 标志表示这些规则将在防火墙重新加载或系统重启后依然有效。 -
重新加载防火墙配置使规则生效:
添加永久规则后,需要重新加载防火墙配置:
bash
sudo firewall-cmd --reload -
验证防火墙规则:
您可以列出当前活动的防火墙规则,确认http
和https
服务是否已包含在允许的服务列表中:
bash
sudo firewall-cmd --list-all
在输出的services:
行中,您应该能看到http
和https
。
六、 测试 Nginx 安装
现在,Nginx 已经安装、启动并配置了防火墙,是时候验证它是否正常工作了。
-
获取服务器的 IP 地址:
您需要知道您的 CentOS 服务器的公共 IP 地址(如果是云主机)或私有 IP 地址(如果在局域网内访问)。可以使用以下命令之一查找:
bash
ip addr show
# 或者
hostname -I
找到与您的主网络接口关联的 IP 地址。 -
通过浏览器访问:
打开您本地计算机上的 Web 浏览器(如 Chrome, Firefox 等),在地址栏输入http://<您的服务器IP地址>
,然后按回车。 -
查看 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 配置文件结构
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 网站。
-
创建网站根目录和示例文件:
```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
``` -
创建 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` 指令用于处理请求,确保能正确找到文件。
* 指定了该站点的访问日志和错误日志文件。保存并关闭文件。
-
(可选)禁用默认服务器块:
如果您不希望默认的 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 -
测试 Nginx 配置:
在应用新配置之前,务必进行语法检查:
bash
sudo nginx -t
确保输出显示syntax is ok
和test is successful
。 -
重新加载 Nginx 配置:
bash
sudo systemctl reload nginx -
再次测试:
现在,再次使用浏览器访问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 打下坚实的基础。