Nginx(发音同“engine-x”)是一款轻量级、高性能的 HTTP 和反向代理服务器,同时也可用作邮件代理和通用 TCP/UDP 负载均衡器。它以事件驱动架构著称,能在低内存占用下处理数万并发连接,因此被广泛用于静态资源服务、API 网关和负载均衡等场景。本节将从安装开始,逐步完成一个简单的静态站点和反向代理配置。
1. 安装 Nginx
Ubuntu/Debian 系统
sudo apt update
sudo apt install nginx -y
安装完成后,Nginx 会自动启动并设为开机自启。可以用以下命令查看状态:
sudo systemctl status nginx
如果服务器开启了防火墙(如 ufw),需要允许 HTTP/HTTPS 流量:
sudo ufw allow 'Nginx Full'
CentOS/RHEL 系统
sudo yum install epel-release -y # 若需启用 EPEL 仓库
sudo yum install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
防火墙放行:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
安装后,在浏览器访问服务器的 IP 地址,如果出现 Nginx 默认欢迎页面,说明服务已正常运行。
2. 基础配置结构与重要文件
Nginx 的配置主要分布在 /etc/nginx/ 目录下,核心文件为 nginx.conf,通常通过 include 引入其他配置片段。
- 主配置文件:
/etc/nginx/nginx.conf - 站点配置目录:
/etc/nginx/sites-available/存放可用站点配置,/etc/nginx/sites-enabled/存放已启用的符号链接(部分发行版使用/etc/nginx/conf.d/目录)。 - 全局参数:如
worker_processes(建议设为 CPU 核心数)、worker_connections(每个工作进程的最大连接数),可在nginx.conf的events块中调整。
一个典型的 nginx.conf 主结构如下:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式与路径
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 其他通用设置
sendfile on;
keepalive_timeout 65;
# 引入站点配置
include /etc/nginx/sites-enabled/*;
}
日常操作中,我们通常不在主文件中直接编写站点,而是在 sites-available 下创建独立的配置文件,然后通过符号链接启用。例如:
sudo nano /etc/nginx/sites-available/example
sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置文件语法
sudo systemctl reload nginx
3. 配置静态网站
假设我们要在 /var/www/mysite 目录下放置静态 HTML 文件,并让域名 www.example.com(或直接通过 IP)访问。
首先创建站点根目录和测试页面:
sudo mkdir -p /var/www/mysite
sudo chown -R $USER:$USER /var/www/mysite
echo '<h1>Hello from Nginx!</h1>' > /var/www/mysite/index.html
接着编写站点配置 /etc/nginx/sites-available/mysite:
server {
listen 80; # 监听 IPv4 的 80 端口
listen [::]:80; # 监听 IPv6 的 80 端口
server_name www.example.com; # 域名,也可用 _ 匹配所有
root /var/www/mysite; # 网站根目录
index index.html index.htm; # 默认索引文件
location / {
try_files $uri $uri/ =404; # 按顺序查找文件,不存在则返回 404
}
# 可选:自定义日志
access_log /var/log/nginx/mysite.access.log;
error_log /var/log/nginx/mysite.error.log;
}
启用站点并重载配置:
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
现在通过服务器 IP 或域名访问,即可看到 index.html 的内容。如果有多个站点,只需为每个站点创建独立的 server 块,Nginx 会根据 server_name 和 listen 指令将请求分发到对应的配置。
常用静态服务优化
- 开启 gzip 压缩:在主配置的
http块或站点server块中添加:
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
- 设置静态资源缓存:针对图片、CSS、JS 等文件单独设置过期时间:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
4. 反向代理配置
反向代理是 Nginx 最常见的用途之一,它可以将客户端的请求转发给后端应用(如 Node.js、Python、Java 等监听的本地端口),并将响应返回给客户端,从而隐藏后端服务、实现负载均衡或 SSL 终结。
假设后端应用运行在本机的 http://127.0.0.1:3000,我们希望将域名 api.example.com 的请求转发过去。
创建配置 /etc/nginx/sites-available/api:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:3000; # 后端地址
proxy_http_version 1.1;
# 设置头信息,以便后端获取真实客户端 IP 和协议
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_connect_timeout 60s;
proxy_read_timeout 60s;
}
}
如果是 WebSocket 应用,还需要在 location / 块中增加以下指令以支持协议升级:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
启用并测试:
sudo ln -s /etc/nginx/sites-available/api /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
现在,所有访问 http://api.example.com 的请求都会被 Nginx 接收并透明地转发给 127.0.0.1:3000。用户只会看到 Nginx 的地址,而无法直接访问后端服务,这既提高了安全性,也为后续横向扩展(增加多个后端做负载均衡)提供了基础。
简单的负载均衡示例(在 proxy_pass 前定义一组后端):
upstream backend_servers {
server 10.0.0.101:3000 weight=3; # 权重为 3
server 10.0.0.102:3000;
server 10.0.0.103:3000 backup; # 备用服务器
}
server {
# …… 省略其他配置
location / {
proxy_pass http://backend_servers;
# ……
}
}
通过以上配置,Nginx 会默认按轮询(round-robin)方式分发请求到各后端服务器,可配合 weight、ip_hash 等策略满足不同场景。
5. 测试与排错要点
- 检查配置文件语法:每次修改后务必运行
sudo nginx -t。 - 查看错误日志:配置出错或后端不可用时,
/var/log/nginx/error.log是最重要的线索来源。 - 监控连接状态:使用
sudo nginx -s reopen可重新打开日志文件(配合日志轮替),而systemctl status nginx可查看进程运行状态。 - 常用信号:
sudo nginx -s reload:平滑重载配置(不中断现有连接)sudo nginx -s stop:快速停止sudo nginx -s quit:优雅停机
Nginx 的强大远不止于此,但掌握了安装、基础配置、静态服务和反向代理四块内容后,你就已经能够用 Nginx 搭建出生产环境中 80% 常见的 Web 服务模型。