Nginx
约 1346 字大约 4 分钟
nginx服务器反向代理
2020-05-07
一句话摘要:Nginx 安装、常用命令、反向代理、负载均衡、HTTPS 配置的实用指南。
背景与动机
Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器。相比 Apache,Nginx 具有占用内存少、并发能力强、配置灵活等优点。
本文适合需要在服务器上部署 Nginx 的开发者,涵盖从安装到配置的完整流程。你将学会:
- 在不同系统上安装 Nginx
- 常用命令操作
- 配置静态资源映射
- 实现负载均衡
- 配置 HTTPS 证书
安装
macOS (Homebrew)
brew install nginx安装后配置文件位于 /usr/local/etc/nginx/nginx.conf。
CentOS/RHEL (RPM)
# 下载 RPM 包后安装
rpm -ivh nginx-1.10.3-1.el7.ngx.x86_64.rpmCentOS/RHEL (Yum)
首先安装依赖:
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel然后安装 Nginx:
yum install -y nginx常用命令
| 命令 | 说明 |
|---|---|
nginx -c /etc/nginx/nginx.conf | 使用指定配置文件启动 |
nginx -s stop | 快速停止服务 |
nginx -s quit | 优雅停止服务(处理完当前请求) |
nginx -s reload | 重新加载配置文件 |
nginx -t | 测试配置文件语法 |
nginx -v | 查看版本号 |
核心概念
反向代理
反向代理是 Nginx 最常见的用途。客户端请求 Nginx,Nginx 再将请求转发到后端服务器。
正向代理 vs 反向代理:
- 正向代理:客户端通过代理访问外部网络(如科学上网)
- 反向代理:外部客户端通过代理访问内部服务器
负载均衡
当后端有多台服务器时,Nginx 可以将请求分发到不同服务器,提高系统整体处理能力。
配置示例
静态资源映射
以下配置将 /home/static_blog/static_blog/ 目录映射为 Web 根目录:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# Gzip 压缩配置
gzip on;
gzip_min_length 1k; # 低于 1kb 的资源不压缩
gzip_comp_level 3; # 压缩级别【1-9】,建议设置在 4 左右
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
gzip_disable "MSIE [1-6]\."; # IE6 及以下不启用 gzip
gzip_vary on;
server {
listen 80 default_server;
server_name 127.0.0.1;
root /home/static_blog/static_blog/;
client_max_body_size 100M;
location / {
try_files $uri $uri/ /index.html;
expires 7d;
log_not_found off;
access_log off;
}
}
}关键配置说明:
worker_processes:工作进程数,建议设置为 CPU 核心数worker_connections:单个进程最大连接数gzip_comp_level:压缩级别,越高越耗 CPUtry_files:尝试按顺序查找文件,都找不到则返回 index.htmlexpires 7d:静态资源缓存 7 天
负载均衡配置
Nginx 支持多种负载均衡策略:
| 策略 | 说明 |
|---|---|
| 轮询(默认) | 按时间顺序逐个分配 |
| weight | 按权重分配,权重越高被分配几率越大 |
| ip_hash | 同一 IP 始终访问同一台服务器 |
| fair | 按响应时间分配(需第三方模块) |
| backup | 其他服务器都忙时才启用 |
worker_processes 1;
error_log logs/error.log info;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
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 logs/access.log main;
sendfile on;
keepalive_timeout 65;
server_names_hash_bucket_size 64;
client_max_body_size 10m;
# 定义上游服务器组
upstream portal_server {
server 112.74.106.172:8080 weight=2 max_fails=2 fail_timeout=60s;
server 120.76.130.193:8080 weight=2 max_fails=2 fail_timeout=60s;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://portal_server/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}关键参数说明:
weight=2:服务器权重,默认为 1max_fails=2:最大失败次数,超过后标记为不可用fail_timeout=60s:失败超时时间,超过后重新尝试proxy_set_header:转发时设置请求头,保留客户端真实 IP
HTTPS 配置
配置 HTTPS 需要先获取 SSL 证书,通常从阿里云、腾讯云等平台免费申请。
server {
listen 443 ssl;
server_name jcblog.com;
root /home/static_blog/static_blog/;
ssl_certificate /etc/nginx/ssl/3878801_www.jcblog.top.pem;
ssl_certificate_key /etc/nginx/ssl/3878801_www.jcblog.top.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2 TLSv1.3; # 仅启用安全协议
location / {
try_files $uri $uri/ /index.html;
}
}
# HTTP 自动跳转 HTTPS
server {
listen 80;
server_name jcblog.com;
return 301 https://$server_name$request_uri;
}注意事项:
ssl_protocols应禁用不安全的 SSLv2/SSLv3,仅保留 TLSv1.2+ssl_session_cache可以提高 HTTPS 性能- 建议配置 HTTP 自动跳转 HTTPS
常见问题
403 Forbidden
可能原因:
- 文件权限不足:检查 Nginx 运行用户是否有读取权限
- SELinux 限制:临时关闭
setenforce 0或配置正确策略 - 目录索引缺失:缺少
index.html且未配置目录列表
502 Bad Gateway
可能原因:
- 后端服务未启动:检查 upstream 服务是否运行
- 防火墙阻隔:检查端口是否开放
- SELinux 限制:阻止 Nginx 连接后端
性能优化建议
- 启用 Gzip 压缩:减少传输体积,但不要压缩图片等已压缩文件
- 设置静态资源缓存:减少重复请求
- 调整 worker 数量:设置为 CPU 核心数
- 启用 HTTP/2:提升并发性能
- 使用 CDN:静态资源走 CDN 减轻服务器压力
总结
Nginx 是现代 Web 架构中不可或缺的组件,本文介绍了从安装到配置的核心内容:
- 安装方式选择 Homebrew 或 Yum
- 常用命令:
nginx -s reload重载配置最常用 - 静态资源配置关键在
root和location - 负载均衡通过
upstream实现多种分发策略 - HTTPS 配置需注意禁用旧协议,启用 TLSv1.2+
下一步建议:
- 学习 Nginx 日志分析
- 了解 Nginx 缓存机制
- 探索 Nginx + Lua 扩展
