手把手教你在CentOS安装Nginx Web服务器
手把手教你在 CentOS 上安装 Nginx Web 服务器(超详细版)
Nginx (发音为 "engine-x") 是一款高性能的 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3 代理服务。以其稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。本文将详细指导您如何在 CentOS 系统上安装和配置 Nginx,从基础安装到高级配置,力求全面且易于理解。
适用范围: 本教程适用于 CentOS 7、CentOS 8 以及较新的衍生版本(如 AlmaLinux, Rocky Linux)。虽然不同版本间可能存在细微差异,但总体步骤是相同的。
先决条件:
- 一台运行 CentOS 的服务器(可以是虚拟机或物理机)。
- 具有
sudo
权限的用户帐户。 - 服务器已连接到互联网。
- (可选)已配置好域名解析,将域名指向服务器 IP 地址。
第一部分:基础安装与配置
步骤 1:更新系统软件包
在安装任何新软件之前,最佳实践是确保您的系统软件包是最新的。打开终端并运行以下命令:
bash
sudo yum update -y
这条命令会更新所有已安装的软件包到最新版本。-y
标志会自动确认所有提示,无需手动干预。
步骤 2:安装 Nginx
CentOS 的默认软件仓库中通常包含 Nginx,但可能不是最新版本。为了安装最新稳定版的 Nginx,我们将使用官方的 Nginx 仓库。
-
安装 EPEL 仓库 (如果尚未安装): EPEL (Extra Packages for Enterprise Linux) 仓库提供了许多额外的软件包,包括一些 Nginx 的依赖。
bash
sudo yum install epel-release -y -
添加 Nginx 官方仓库:
创建一个 Nginx 仓库配置文件:
bash
sudo nano /etc/yum.repos.d/nginx.repo将以下内容复制并粘贴到文件中(根据您的 CentOS 版本选择):
对于 CentOS 7:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1对于 CentOS 8/9 (以及 AlmaLinux, Rocky Linux):
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
*$releasever
会自动替换为您的 CentOS 主版本号(例如 8 或 9)。
*gpgcheck=0
禁用了 GPG 签名检查。虽然通常建议启用 GPG 检查以确保软件包的完整性,但在某些情况下(例如测试环境),可以暂时禁用。如果您想启用 GPG 检查,可以将gpgcheck=0
改为gpgcheck=1
,并导入 Nginx GPG 密钥:sudo rpm --import https://nginx.org/keys/nginx_signing.key
保存并关闭文件 (Ctrl+O, Enter, Ctrl+X)。
-
安装 Nginx:
bash
sudo yum install nginx -y
步骤 3:启动并启用 Nginx
-
启动 Nginx 服务:
bash
sudo systemctl start nginx -
设置 Nginx 开机自启:
bash
sudo systemctl enable nginx -
检查 Nginx 服务状态:
bash
sudo systemctl status nginx如果 Nginx 正常运行,您应该看到类似以下的输出:
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since ...
...
Active: active (running)
表示 Nginx 正在运行。
步骤 4:配置防火墙 (如果已启用)
如果您的 CentOS 服务器启用了防火墙 (firewalld),您需要允许 HTTP (端口 80) 和 HTTPS (端口 443) 流量通过。
-
允许 HTTP 和 HTTPS 流量:
bash
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https -
重新加载防火墙配置:
bash
sudo firewall-cmd --reload
步骤 5:测试 Nginx
现在,在您的 Web 浏览器中输入服务器的 IP 地址或域名。如果一切顺利,您应该看到 Nginx 的默认欢迎页面。这表明 Nginx 已成功安装并正在运行。
第二部分:配置 Nginx 虚拟主机(多站点)
如果您计划在同一台服务器上托管多个网站,您需要配置 Nginx 虚拟主机(也称为服务器块)。每个虚拟主机定义了一个独立的网站配置。
步骤 1:创建网站目录
为您的每个网站创建一个目录来存储网站文件。例如,如果您要托管两个网站 example.com
和 test.com
:
bash
sudo mkdir -p /var/www/example.com/html
sudo mkdir -p /var/www/test.com/html
-p
选项会创建所有必要的父目录(如果它们不存在)。
步骤 2:创建示例 HTML 文件
在每个网站目录中创建一个简单的 index.html
文件,用于测试:
bash
sudo nano /var/www/example.com/html/index.html
添加以下内容 (您可以根据需要修改):
```html
This is example.com
```
对 test.com
也执行相同的操作:
bash
sudo nano /var/www/test.com/html/index.html
```html
This is test.com
```
步骤 3:创建虚拟主机配置文件
Nginx 的虚拟主机配置文件通常位于 /etc/nginx/conf.d/
目录中。为每个网站创建一个单独的配置文件。
-
创建
example.com.conf
:bash
sudo nano /etc/nginx/conf.d/example.com.conf添加以下配置:
```nginx
server {
listen 80;
listen [::]:80;server_name example.com www.example.com; root /var/www/example.com/html; index index.html index.htm; location / { try_files $uri $uri/ =404; }
}
```listen 80;
和listen [::]:80;
: 指定监听的端口。80 是 HTTP 的标准端口。server_name
: 指定与此虚拟主机匹配的域名。root
: 指定网站文件的根目录。index
: 指定默认索引文件的名称。location /
: 定义对根 URL (/
) 的请求的处理方式。try_files
指令会依次尝试查找请求的文件,如果找不到,则返回 404 错误。
-
创建
test.com.conf
:bash
sudo nano /etc/nginx/conf.d/test.com.conf添加以下配置(类似于
example.com.conf
,但更改域名和根目录):```nginx
server {
listen 80;
listen [::]:80;server_name test.com www.test.com; root /var/www/test.com/html; index index.html index.htm; location / { try_files $uri $uri/ =404; }
}
```
步骤 4:禁用默认虚拟主机 (可选)
Nginx 默认包含一个虚拟主机配置文件 (/etc/nginx/conf.d/default.conf
或 /etc/nginx/nginx.conf
中的 server
块)。如果您不需要它,可以将其删除或重命名以禁用它:
```bash
sudo rm /etc/nginx/conf.d/default.conf
或者
sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
``
/etc/nginx/nginx.conf
或者,您也可以直接注释掉中的默认
server`块。
步骤 5:检查 Nginx 配置并重新加载
-
检查配置语法:
bash
sudo nginx -t如果配置正确,您应该看到类似以下的输出:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
如果有错误,请仔细检查配置文件,确保没有拼写错误或语法问题。 -
重新加载 Nginx:
bash
sudo systemctl reload nginx
重新加载会应用新的配置,而无需中断现有的连接。
步骤 6: 设置文件权限
确保 Nginx 用户 (通常是 nginx
或 www-data
) 对网站目录具有读取权限。
bash
sudo chown -R nginx:nginx /var/www/example.com
sudo chown -R nginx:nginx /var/www/test.com
sudo chmod -R 755 /var/www/
这些命令设置了目录和文件的所有者和权限。
步骤 7:测试虚拟主机
现在,在您的 Web 浏览器中输入每个网站的域名 (例如 example.com
和 test.com
)。如果一切配置正确,您应该看到您在每个网站的 index.html
文件中定义的相应内容。
第三部分:高级配置与优化
1. 启用 HTTPS (SSL/TLS)
为了保护您的网站和用户数据,强烈建议启用 HTTPS。您可以使用 Let's Encrypt 免费获取 SSL 证书。
-
安装 Certbot: Certbot 是一个用于自动获取和安装 Let's Encrypt 证书的工具。
bash
sudo yum install certbot python3-certbot-nginx -y -
获取并安装证书:
bash
sudo certbot --nginx -d example.com -d www.example.com -d test.com -d www.test.com这条命令会为
example.com
、www.example.com
、test.com
和www.test.com
获取证书,并自动配置 Nginx。按照 Certbot 的提示进行操作。Certbot 会自动更新您的 Nginx 配置文件以使用 HTTPS,并设置证书自动续期。
2. 配置缓存
Nginx 可以缓存静态内容(如图像、CSS 和 JavaScript 文件),以减少服务器负载并提高网站速度。
在您的虚拟主机配置文件中 (例如 /etc/nginx/conf.d/example.com.conf
),添加以下配置:
nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; # 缓存 30 天
add_header Cache-Control "public";
}
这将告诉浏览器缓存这些文件类型 30 天。您可以根据需要调整 expires
值。
3. 启用 Gzip 压缩
Gzip 压缩可以减小 HTML、CSS 和 JavaScript 文件的大小,从而加快页面加载速度。
在您的 nginx.conf
文件中 (通常是 /etc/nginx/nginx.conf
),找到 http
块,并添加或修改以下配置:
```nginx
http {
...
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 6; #压缩等级,1-9,数字越大压缩率越高,也越耗费CPU
gzip_min_length 1000; #不压缩小于这个大小的文件
...
}
``
gzip on;
*启用 Gzip 压缩。
gzip_types
*指定要压缩的文件类型。
gzip_comp_level
*设置压缩级别。
gzip_min_length`设置最小文件大小,小于该大小的文件不会被压缩。
*
4. 配置反向代理
Nginx 经常被用作反向代理,将客户端请求转发到后端服务器(如 Node.js、Python 或 Java 应用程序)。
在您的虚拟主机配置文件中,使用 proxy_pass
指令将请求转发到后端服务器:
```nginx
server {
...
location / {
proxy_pass http://localhost:3000; # 将请求转发到本地 3000 端口
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_set_header X-Forwarded-Proto $scheme;
}
}
```
proxy_pass
: 指定后端服务器的地址和端口。proxy_set_header
: 设置 HTTP 请求头,以便后端服务器可以获取客户端的真实 IP 地址和其他信息。
5. 日志配置
Nginx 会记录访问日志和错误日志。默认情况下,这些日志位于 /var/log/nginx/
目录中。
- access.log: 记录每个客户端请求的详细信息。
- error.log: 记录 Nginx 遇到的错误。
您可以在 nginx.conf
文件中或虚拟主机配置文件中自定义日志文件的位置和格式。 例如, 在http
或者server
块中:
access_log /var/log/nginx/access.log combined;
error_log /var/log/nginx/error.log warn;
combined
是一种常用的日志格式。warn
设置error.log记录warning及以上级别的日志。
6. 限制连接数和请求速率
Nginx 提供了限制连接数和请求速率的功能,可以防止恶意攻击或过载。
-
限制连接数:
在
http
块中定义一个limit_conn_zone
:nginx
http {
...
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
}在
server
或location
块中使用limit_conn
指令:nginx
server {
...
location / {
limit_conn addr 10; # 允许每个 IP 地址最多 10 个并发连接
...
}
} -
限制请求速率:
在
http
块中定义一个limit_req_zone
:nginx
http {
...
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
}在
server
或location
块中使用limit_req
指令:nginx
server {
...
location / {
limit_req zone=one burst=5 nodelay; # 允许每秒 1 个请求,突发 5 个请求
...
}
}
rate=1r/s
表示每秒允许 1 个请求。burst=5
允许最多 5 个请求的突发,nodelay
表示立即处理突发请求。
第四部分:故障排除
如果在安装或配置 Nginx 过程中遇到问题,请参考以下常见问题和解决方法:
-
Nginx 无法启动:
- 检查错误日志 (
/var/log/nginx/error.log
),查看详细的错误信息。 - 使用
sudo nginx -t
检查配置文件语法是否正确。 - 确保没有其他程序占用了 Nginx 使用的端口 (80 或 443)。可以使用
sudo netstat -tulpn | grep :80
或sudo ss -tulpn | grep :80
查看端口占用情况。
- 检查错误日志 (
-
无法访问网站:
- 检查防火墙设置,确保允许 HTTP (80) 和 HTTPS (443) 流量通过。
- 检查 DNS 解析是否正确,确保域名指向服务器的 IP 地址。
- 检查 Nginx 虚拟主机配置,确保
server_name
指令与您的域名匹配,root
指令指向正确的网站目录。 - 检查网站目录的文件权限,确保 Nginx 用户具有读取权限。
-
502 Bad Gateway 错误:
- 这通常表示 Nginx 无法连接到后端服务器。
- 检查后端服务器是否正在运行,并且监听正确的端口。
- 检查 Nginx 虚拟主机配置文件中的
proxy_pass
指令是否正确配置。
-
403 Forbidden 错误:
- 检查对应目录以及文件的权限,确保nginx的运行用户可以访问。
-
404 Not Found 错误:
- 检查请求的url在root指定的目录中是否存在。
- 检查是否配置了正确的
index
指令。
总结
本文详细介绍了在 CentOS 上安装、配置和优化 Nginx Web 服务器的各个方面。从基础安装到虚拟主机配置,再到 HTTPS、缓存、Gzip 压缩、反向代理和安全加固等高级主题,希望能够帮助您构建一个高性能、安全可靠的 Web 服务器。请记住,这只是 Nginx 众多功能的冰山一角,您可以根据自己的需求进一步探索和定制 Nginx。 建议您阅读 Nginx 官方文档 (https://nginx.org/en/docs/) 以获取更深入的了解。