CentOS Nginx 安装教程:从入门到精通
前言
Nginx(发音为 “engine-x”)是一个高性能的HTTP和反向代理服务器,同时也可以作为邮件代理服务器和通用的TCP/UDP代理服务器。因其高并发处理能力、低内存占用和丰富的功能,Nginx 在 Web 服务器领域占据了主导地位,广泛应用于负载均衡、反向代理、静态文件服务等场景。本教程将引导您在 CentOS 系统上从零开始安装和配置 Nginx,从基础入门到掌握其高级特性。
适用系统版本
本教程主要适用于 CentOS 7 和 CentOS 8。
准备工作
在开始安装之前,请确保您的 CentOS 服务器满足以下条件:
- 操作系统: CentOS 7 或 CentOS 8。
- 网络连接: 服务器可以访问互联网以下载软件包。
- 用户权限: 拥有 root 用户权限或 sudo 权限的用户。
步骤一:系统更新与安装依赖
首先,更新您的系统软件包到最新版本,并安装一些必要的工具和依赖。
bash
sudo yum update -y
sudo yum install -y curl policycoreutils-python-utils
yum update -y:更新所有已安装的软件包。curl:一个传输数据的命令行工具。policycoreutils-python-utils:处理 SELinux 策略的工具,如果您的系统开启了 SELinux,这会很有用。
步骤二:安装 Nginx
Nginx 官方仓库通常提供最新版本的 Nginx,相比 CentOS 自带的仓库,功能更全面,修复了更多 Bug。因此,我们推荐使用 Nginx 官方仓库进行安装。
方式一:通过 Nginx 官方仓库安装 (推荐)
-
创建 Nginx 仓库配置文件:
创建一个名为nginx.repo的文件在/etc/yum.repos.d/目录下。-
对于 CentOS 7:
bash
sudo vi /etc/yum.repos.d/nginx.repo
在文件中添加以下内容:
“`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[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
* **对于 CentOS 8:**bash
sudo vi /etc/yum.repos.d/nginx.repo
在文件中添加以下内容:ini
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/8/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/8/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
``nginx-stable
* **说明:**
*:稳定版仓库,推荐用于生产环境。nginx-mainline
*:最新主线版仓库,包含最新特性和改进,可能不如稳定版经过充分测试。默认enabled=0,如果需要安装主线版,可以将其改为1`。
-
-
安装 Nginx:
bash
sudo yum install -y nginx
方式二:通过 CentOS 官方仓库安装 (版本可能较旧)
如果您对 Nginx 版本要求不高,或者遇到官方仓库安装问题,可以使用 EPEL (Extra Packages for Enterprise Linux) 仓库。
-
安装 EPEL 仓库:
- 对于 CentOS 7:
bash
sudo yum install -y epel-release - 对于 CentOS 8:
bash
sudo dnf install -y epel-release
sudo dnf config-manager --set-enabled PowerTools # CentOS 8 需要
- 对于 CentOS 7:
-
安装 Nginx:
bash
sudo yum install -y nginx
步骤三:管理 Nginx 服务
安装完成后,Nginx 服务并不会自动启动,您需要手动启动并设置开机自启。
-
启动 Nginx 服务:
bash
sudo systemctl start nginx -
设置 Nginx 开机自启:
bash
sudo systemctl enable nginx -
检查 Nginx 服务状态:
bash
sudo systemctl status nginx
如果服务正常运行,您会看到active (running)的字样。 -
重新加载配置:
当您修改 Nginx 配置文件后,无需重启服务,只需重新加载配置即可。
bash
sudo systemctl reload nginx -
停止 Nginx 服务:
bash
sudo systemctl stop nginx
步骤四:配置防火墙
CentOS 默认开启了 firewalld 防火墙,Nginx 默认监听 80 端口 (HTTP) 和 443 端口 (HTTPS)。您需要开放这些端口以允许外部访问。
-
开放 HTTP (80) 和 HTTPS (443) 端口:
bash
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https -
重新加载防火墙规则:
bash
sudo firewall-cmd --reload
现在,您可以在浏览器中输入您的服务器 IP 地址或域名,应该能看到 Nginx 的欢迎页面(”Welcome to Nginx!”)。
步骤五:Nginx 基础配置
Nginx 的主配置文件位于 /etc/nginx/nginx.conf。其他网站或应用相关的配置通常放在 /etc/nginx/conf.d/ 目录下,以 .conf 结尾的文件会被主配置文件自动包含。
配置文件结构概述
一个典型的 Nginx 配置文件结构如下:
“`nginx
全局配置
user nginx; # 运行 Nginx 进程的用户
worker_processes auto; # 工作进程数量,通常设置为 CPU 核心数或 auto
error_log /var/log/nginx/error.log warn; # 错误日志路径和级别
pid /var/run/nginx.pid; # Nginx 主进程的 PID 文件
events {
worker_connections 1024; # 每个工作进程的最大连接数
}
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; # 开启高效文件传输模式
#tcp_nopush on; # 配合 sendfile 提高传输效率
keepalive_timeout 65; # 长连接超时时间
#gzip on; # 开启 Gzip 压缩
include /etc/nginx/conf.d/*.conf; # 包含 /etc/nginx/conf.d/ 目录下的所有 .conf 文件
}
“`
配置您的第一个网站 (虚拟主机)
我们将创建一个简单的虚拟主机来服务静态内容。
-
创建网站根目录:
bash
sudo mkdir -p /var/www/html/example.com -
创建简单的 HTML 文件:
bash
echo "<h1>Welcome to Example.com!</h1>" | sudo tee /var/www/html/example.com/index.html -
设置目录权限:
bash
sudo chown -R nginx:nginx /var/www/html/example.com
sudo chmod -R 755 /var/www/html/example.com -
创建 Nginx 虚拟主机配置文件:
bash
sudo vi /etc/nginx/conf.d/example.com.conf
添加以下内容:
“`nginx
server {
listen 80;
server_name example.com www.example.com; # 您的域名root /var/www/html/example.com; # 网站根目录 index index.html index.htm; # 默认文件 location / { try_files $uri $uri/ =404; # 尝试匹配文件或目录,否则返回 404 } error_page 500 502 503 504 /50x.html; # 错误页面 location = /50x.html { root /usr/share/nginx/html; } access_log /var/log/nginx/example.com_access.log main; error_log /var/log/nginx/example.com_error.log warn;}
“` -
检查 Nginx 配置语法:
bash
sudo nginx -t
如果看到syntax is ok和test is successful,则表示配置无误。 -
重新加载 Nginx 配置:
bash
sudo systemctl reload nginx
现在,如果您在本地 hosts 文件中将 example.com 或 www.example.com 指向您的服务器 IP,就可以通过浏览器访问 http://example.com 看到您创建的页面。
步骤六:Nginx 高级配置
Nginx 远不止静态文件服务,它在反向代理、负载均衡、SSL/TLS 加密等方面表现卓越。
1. 配置 SSL/TLS (HTTPS)
为您的网站启用 HTTPS 是现代 Web 的最佳实践。我们将使用 Let’s Encrypt 提供的免费 SSL 证书。
-
安装 Certbot:
Certbot 是 Let’s Encrypt 官方推荐的客户端,可以自动获取和续订证书。- 对于 CentOS 7:
bash
sudo yum install -y certbot python2-certbot-nginx - 对于 CentOS 8:
bash
sudo dnf install -y certbot python3-certbot-nginx
- 对于 CentOS 7:
-
获取并安装 SSL 证书:
bash
sudo certbot --nginx -d example.com -d www.example.com
按照提示输入您的邮箱地址,并同意服务条款。Certbot 会自动修改您的 Nginx 配置,添加 HTTPS 支持。 -
测试自动续订:
Let’s Encrypt 证书有效期为 90 天,Certbot 会自动设置定时任务进行续订。您可以手动测试续订过程。
bash
sudo certbot renew --dry-run
2. 配置反向代理
Nginx 作为反向代理服务器可以将客户端请求转发到后端应用服务器(如 Node.js, Python Flask/Django, Java Tomcat 等),隐藏后端服务的真实 IP 和端口。
假设您有一个后端应用运行在 http://127.0.0.1:3000。
修改 example.com.conf:
“`nginx
server {
listen 80;
server_name example.com www.example.com;
# 将所有 HTTP 请求重定向到 HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Certbot 自动生成
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Certbot 自动生成
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1: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;
}
access_log /var/log/nginx/example.com_access.log main;
error_log /var/log/nginx/example.log warn;
}
“`
重新加载 Nginx 配置后,访问 https://example.com 就会将请求转发到您的后端应用。
3. 配置负载均衡
当您有多个后端服务器提供相同服务时,Nginx 可以将请求分发到这些服务器上,实现负载均衡。
“`nginx
upstream backend_servers {
server 192.168.1.100:8000; # 后端服务器1
server 192.168.1.101:8000; # 后端服务器2
# server 192.168.1.102:8000 backup; # 备份服务器
# server 192.168.1.103:8000 down; # 标记为停止
}
server {
listen 80;
server_name myapp.com;
location / {
proxy_pass http://backend_servers; # 将请求转发到 upstream 定义的服务器组
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
“`
Nginx 提供了多种负载均衡算法:
* round-robin (默认): 按顺序循环分发请求。
* least_conn: 将请求发送到活动连接数最少的服务器。
* ip_hash: 基于客户端 IP 地址的哈希值来分配请求,确保同一客户端总是被转发到同一服务器,适用于会话保持。
* least_time (商业版): 最短响应时间和最少活动连接数的服务器。
您可以在 server 后添加权重(如 server 192.168.1.100:8000 weight=3;)来调整流量分配。
4. 配置缓存
Nginx 可以缓存后端服务器的响应,减少后端压力,提高响应速度。
在 http 块中定义缓存区域:
“`nginx
http {
# … 其他配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;
server {
listen 80;
server_name mycachedapp.com;
location / {
proxy_pass http://my_backend_server;
proxy_cache my_cache; # 启用缓存
proxy_cache_valid 200 302 10m; # 缓存 200 和 302 状态码的响应 10 分钟
proxy_cache_valid 404 1m; # 缓存 404 状态码的响应 1 分钟
proxy_cache_min_uses 1; # 至少请求一次后才缓存
add_header X-Cache-Status $upstream_cache_status; # 添加缓存状态头信息
}
}
}
“`
5. 开启 Gzip 压缩
Gzip 可以压缩传输的文本文件,减少带宽消耗,加快页面加载速度。在 http 块中添加:
“`nginx
http {
# … 其他配置
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
“`
步骤七:Nginx 故障排除
- 检查 Nginx 状态:
sudo systemctl status nginx - 检查 Nginx 配置语法:
sudo nginx -t - 查看 Nginx 错误日志:
/var/log/nginx/error.log - 查看 Nginx 访问日志:
/var/log/nginx/access.log - 防火墙问题: 确保端口已开放,使用
sudo firewall-cmd --list-all查看当前规则。 - SELinux 问题: 如果遇到权限拒绝错误,可能是 SELinux 阻止了 Nginx 访问文件或端口。您可以临时禁用 SELinux (
sudo setenforce 0) 或配置相应的 SELinux 策略。例如,允许 Nginx 访问非标准端口或目录:
bash
sudo semanage fcontext -a -t httpd_sys_content_t "/path/to/your/webroot(/.*)?"
sudo restorecon -Rv /path/to/your/webroot
sudo semanage port -a -t http_port_t -p tcp 8080 # 如果 Nginx 监听 8080 端口
总结
通过本教程,您应该已经掌握了在 CentOS 上安装和配置 Nginx 的基本方法,并了解了如何利用其高级功能,如 SSL/TLS 加密、反向代理、负载均衡和内容缓存。Nginx 功能强大且配置灵活,深入学习其模块和指令将帮助您构建更高效、更安全的 Web 服务架构。