Linux 环境下 Nginx 的安装与配置
1. 引言
Nginx (发音为 “engine-x”) 是一款高性能的开源 HTTP 服务器、反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器。它以其卓越的性能、稳定性、丰富的功能集以及低资源消耗而闻名,在现代 Web 架构中扮演着关键角色。Nginx 采用事件驱动的异步非阻塞处理模型,能够轻松处理高并发场景,同时保持极低的内存消耗,这使其成为负载均衡器、反向代理服务器或静态内容服务器的理想选择。
本文将详细介绍在 Linux 环境下安装和配置 Nginx 的过程,包括基本安装、服务管理、基础配置以及反向代理、负载均衡和 SSL/TLS 等高级配置示例。
2. 前提条件
在开始安装 Nginx 之前,请确保您的 Linux 服务器满足以下条件:
- 操作系统: 本文将涵盖 Ubuntu/Debian (基于
apt包管理器) 和 CentOS/RHEL (基于yum或dnf包管理器) 系列发行版。 - 用户权限: 拥有
sudo权限的非 root 用户或 root 用户。 - 域名 (可选): 如果计划配置 SSL/TLS 或虚拟主机,建议拥有一个指向服务器 IP 地址的注册域名。
- 防火墙配置: 确保服务器防火墙允许 HTTP (80 端口) 和 HTTPS (443 端口) 流量。
- Ubuntu/Debian (UFW):
bash
sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTPS' # 如果需要HTTPS
sudo ufw enable - CentOS/RHEL (firewalld):
bash
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https # 如果需要HTTPS
sudo firewall-cmd --reload
- Ubuntu/Debian (UFW):
3. Nginx 安装
Nginx 可以通过包管理器或从源代码编译安装。对于大多数用户,推荐使用包管理器,因为它更简单且易于维护。
3.1 使用包管理器安装 (推荐)
a. 在 Ubuntu/Debian 系统上安装:
- 更新包索引:
bash
sudo apt update - 安装 Nginx:
bash
sudo apt install nginx
b. 在 CentOS/RHEL 系统上安装:
- CentOS 7/8: 首先需要安装 EPEL (Extra Packages for Enterprise Linux) 仓库,因为 Nginx 在默认仓库中可能不是最新版本或不可用。
bash
sudo yum install epel-release -y
sudo yum install nginx -y - RHEL 8/9, CentOS Stream, AlmaLinux, Rocky Linux (使用 dnf):
bash
sudo dnf install nginx -y
3.2 从源代码编译安装 (可选,适用于高级用户)
从源代码安装可以提供对 Nginx 模块和编译选项的更精细控制,但过程更复杂。
-
安装构建依赖:
“`bash
# Ubuntu/Debian
sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-devCentOS/RHEL
sudo yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
2. **下载 Nginx 源代码**: 访问 Nginx 官方网站下载最新稳定版或主线版的源代码包。bash
wget http://nginx.org/download/nginx-1.2x.x.tar.gz # 替换为最新版本
tar -zxvf nginx-1.2x.x.tar.gz
cd nginx-1.2x.x
3. **配置编译选项**:bash
./configure –prefix=/usr/local/nginx –with-http_ssl_module –with-pcre –with-zlib –with-http_realip_module # 根据需要添加模块
* `--prefix=/usr/local/nginx`: 指定 Nginx 的安装路径。bash
* `--with-http_ssl_module`: 启用 SSL/TLS 支持。
* `--with-pcre`: 启用 PCRE 正则表达式支持。
* `--with-zlib`: 启用 zlib 压缩库支持。
4. **编译并安装**:
make
sudo make install
5. **创建 Systemd 服务文件 (如果从源代码安装)**:ini
为了方便管理,建议为自编译的 Nginx 创建一个 systemd 服务文件 `/etc/systemd/system/nginx.service`。
[Unit]
Description=The Nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target
然后重新加载 systemd 配置并启用服务:bash
sudo systemctl daemon-reload
sudo systemctl enable nginx
“`
4. 管理 Nginx 服务
安装完成后,Nginx 服务通常会自动启动。您可以使用 systemctl 命令来管理 Nginx 服务。
- 启动 Nginx:
bash
sudo systemctl start nginx - 停止 Nginx:
bash
sudo systemctl stop nginx - 重启 Nginx: (会断开所有当前连接)
bash
sudo systemctl restart nginx - 重新加载配置: (平滑重启,不会断开当前连接,推荐在修改配置后使用)
bash
sudo systemctl reload nginx - 检查 Nginx 状态:
bash
sudo systemctl status nginx - 设置 Nginx 开机自启:
bash
sudo systemctl enable nginx - 禁用 Nginx 开机自启:
bash
sudo systemctl disable nginx - 测试 Nginx 配置文件的语法: (在重新加载或重启前务必执行此命令)
bash
sudo nginx -t
如果语法正确,会显示syntax is ok和test is successful。
5. Nginx 基础配置
Nginx 的主配置文件通常位于 /etc/nginx/nginx.conf。此外,为了更好地组织配置,通常会在 /etc/nginx/sites-available/ 目录中为每个网站创建单独的配置文件,并通过符号链接将其启用至 /etc/nginx/sites-enabled/ 目录。
Nginx 配置由指令 (directives) 组成,这些指令通常组织在不同的块 (blocks) 中,例如 http 块、server 块和 location 块。
http块: 定义全局 HTTP 服务器配置,例如 MIME 类型、日志格式、连接设置等。server块: 定义虚拟主机,用于处理特定域名或 IP 地址的请求。location块: 定义如何处理特定 URL 路径的请求。
5.1 默认网站和静态文件服务
安装完成后,Nginx 会有一个默认的 server 块,通常监听 80 端口,并从 /var/www/html 目录提供静态文件。
您可以访问服务器的 IP 地址或域名来验证 Nginx 是否正常运行。
5.2 配置虚拟主机 (Server Blocks)
虚拟主机 (在 Nginx 中称为 Server Blocks) 允许您在同一台服务器上托管多个网站或应用程序。
以下是配置虚拟主机的步骤:
- 创建网站根目录:
bash
sudo mkdir -p /var/www/your_domain/html
将your_domain替换为您的实际域名。 - 创建示例
index.html文件:
bash
sudo nano /var/www/your_domain/html/index.html
添加以下内容:
html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Your Domain!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Success! Your Nginx server block for your_domain is working!</h1>
<p>This is a test page.</p>
</body>
</html> - 设置文件权限:
bash
sudo chown -R www-data:www-data /var/www/your_domain/html # Ubuntu/Debian
sudo chown -R nginx:nginx /var/www/your_domain/html # CentOS/RHEL
sudo chmod -R 755 /var/www/your_domain - 创建 Nginx Server Block 配置文件:
bash
sudo nano /etc/nginx/sites-available/your_domain
添加以下配置:
“`nginx
server {
listen 80;
listen [::]:80; # 监听 IPv6server_name your_domain www.your_domain; # 替换为您的域名 root /var/www/your_domain/html; index index.html index.htm index.nginx-debian.html; # 默认索引文件 access_log /var/log/nginx/your_domain.access.log; # 访问日志 error_log /var/log/nginx/your_domain.error.log warn; # 错误日志 location / { try_files $uri $uri/ =404; # 尝试查找文件,否则返回404 }}
5. **启用 Server Block**: 创建从 `sites-available` 到 `sites-enabled` 的符号链接。bash
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
6. **测试 Nginx 配置并重新加载**:bash
sudo nginx -t
sudo systemctl reload nginx
“`
现在,当您访问 your_domain 时,Nginx 将会显示您创建的 index.html 页面。
6. Nginx 高级配置示例
6.1 反向代理 (Reverse Proxy)
Nginx 作为反向代理服务器,可以将客户端请求转发到后端服务器 (如 Node.js 应用、Python Flask/Django 应用、Apache 等),并将后端服务器的响应返回给客户端。这有助于隐藏后端服务器的真实 IP、提供负载均衡、SSL 卸载等功能。
以下是一个简单的反向代理配置示例,将所有请求转发到运行在 http://127.0.0.1:8080 的后端应用:
- 编辑您的 Server Block 配置文件 (例如
/etc/nginx/sites-available/your_domain):
“`nginx
server {
listen 80;
server_name your_domain www.your_domain;location / { proxy_pass http://127.0.0.1:8080; # 后端应用地址 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; 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_cache_bypass $http_upgrade; }}
* `proxy_pass`: 指定后端服务器的地址。bash
* `proxy_set_header`: 转发客户端请求头到后端服务器,这对于后端应用获取客户端真实 IP 和主机名非常重要。
2. **测试配置并重新加载 Nginx**:
sudo nginx -t
sudo systemctl reload nginx
“`
6.2 负载均衡 (Load Balancing)
Nginx 可以作为高效的 HTTP 负载均衡器,将流量分发到多个后端应用实例,以优化资源利用、提高吞吐量、减少延迟并确保容错配置。
Nginx 支持多种负载均衡算法:
- Round Robin (默认): 请求按顺序均匀分发到后端服务器。
- Least Connections: 将请求发送到当前活动连接数最少的服务器。
- IP Hash: 根据客户端 IP 地址的哈希值将请求分发到后端服务器,确保同一客户端的请求始终发送到同一台服务器。
以下是一个使用 Round Robin 算法的负载均衡配置示例:
- 在
http块内定义upstream块: 通常在/etc/nginx/nginx.conf或一个单独的包含文件中。
“`nginx
http {
# … 其他http配置 …upstream backend_servers { server 192.168.1.100:8080; # 后端服务器1 server 192.168.1.101:8080; # 后端服务器2 server 192.168.1.102:8081 weight=3; # 后端服务器3,权重为3,接收更多请求 # least_conn; # 如果要使用最少连接算法,取消注释 # ip_hash; # 如果要使用IP哈希算法,取消注释 } server { listen 80; server_name your_domain www.your_domain; location / { proxy_pass http://backend_servers; # 转发到 upstream 定义的服务器组 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }}
* `upstream backend_servers`: 定义一个名为 `backend_servers` 的服务器组。bash
* `server`: 列出后端服务器的 IP 地址和端口。
* `weight`: 可选参数,指定服务器的权重,权重越高的服务器将接收更多的请求。
* `proxy_pass http://backend_servers;`: 将请求转发到 `backend_servers` 组中的服务器。
2. **测试配置并重新加载 Nginx**:
sudo nginx -t
sudo systemctl reload nginx
“`
6.3 SSL/TLS 配置 (HTTPS)
为您的网站启用 HTTPS 是保护用户数据和提高网站信任度的关键。这通常涉及获取 SSL/TLS 证书并配置 Nginx 使用它。
最常见的方法是使用 Let’s Encrypt 提供的免费证书和 Certbot 工具。
- 安装 Certbot (Ubuntu/Debian):
bash
sudo apt update
sudo apt install certbot python3-certbot-nginx
安装 Certbot (CentOS/RHEL):
bash
sudo yum install certbot python3-certbot-nginx -y - 获取并安装 SSL 证书:
Certbot 会自动为您获取证书并修改 Nginx 配置。
bash
sudo certbot --nginx -d your_domain -d www.your_domain
Certbot 会提示您输入电子邮件地址、同意服务条款,并询问是否将所有 HTTP 请求重定向到 HTTPS。建议选择重定向。 - 手动配置 SSL/TLS (如果 Certbot 不适用或您有自己的证书):
- 将您的 SSL 证书文件 (
fullchain.pem或.crt) 和私钥文件 (privkey.pem或.key) 上传到服务器的安全位置 (例如/etc/nginx/ssl/)。 -
编辑您的 Server Block 配置文件 (例如
/etc/nginx/sites-available/your_domain):
“`nginx
server {
listen 80;
listen [::]:80;
server_name your_domain www.your_domain;
return 301 https://$server_name$request_uri; # 将HTTP重定向到HTTPS
}server {
listen 443 ssl http2; # 监听443端口,启用SSL和HTTP/2
listen [::]:443 ssl http2;
server_name your_domain www.your_domain;ssl_certificate /etc/nginx/ssl/fullchain.pem; # 您的证书文件路径 ssl_certificate_key /etc/nginx/ssl/privkey.pem; # 您的私钥文件路径 # 推荐的SSL设置 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1.2 TLSv1.3; # 仅允许强协议 ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers on; root /var/www/your_domain/html; index index.html; location / { try_files $uri $uri/ =404; }}
4. **测试配置并重新加载 Nginx**:bash
sudo nginx -t
sudo systemctl reload nginx
“`
现在您的网站应该可以通过 HTTPS 访问了。
- 将您的 SSL 证书文件 (
7. 故障排除
- 配置语法错误: 始终使用
sudo nginx -t命令检查配置文件的语法。如果存在错误,Nginx 会指出错误所在的行和文件。 - Nginx 服务未运行: 使用
sudo systemctl status nginx检查服务状态。如果服务未启动或失败,查看日志以获取更多信息。 - 无法访问网站:
- 检查防火墙是否允许 80/443 端口的流量。
- 确保域名正确解析到服务器 IP 地址。
- 检查 Nginx 错误日志 (
/var/log/nginx/error.log) 和访问日志 (/var/log/nginx/access.log) 以获取详细错误信息。
- 权限问题: 确保 Nginx 进程 (通常是
www-data或nginx用户) 对网站文件和目录具有读取权限。
8. 总结
通过本文,您应该已经掌握了在 Linux 环境下安装和配置 Nginx 的基本知识。从简单的静态文件服务到复杂的反向代理和负载均衡,Nginx 提供了强大的功能来满足各种 Web 服务需求。持续学习 Nginx 的高级特性和优化技巧,将帮助您构建更健壮、高性能的 Web 架构。