Nginx安装
安装与验证
# 安装依赖
sudo apt install -y curl gnupg2 ca-certificates lsb-release
# 安装Nginx
sudo apt install -y nginx # -y: 自动确认安装
# 验证安装
nginx -v # 查看版本
sudo systemctl status nginx # 检查运行状态
服务管理
sudo systemctl start nginx # 启动
sudo systemctl stop nginx # 停止
sudo systemctl restart nginx # 重启
sudo systemctl enable nginx # 开机自启
配置文件结构
cd /etc/nginx
mv nginx.conf nginx.conf.bak # 备份配置
touch nginx.conf # 创建新配置
nginx -t # 检查配置语法
vi nginx.conf # 编辑配置
基础配置模板
events {} # 事件模块必填
http {
include /etc/nginx/mime.types; # 引入MIME类型
include /etc/nginx/conf.d/*.conf; # 加载子配置
}
虚拟服务器配置 (conf.d/default.conf)
server {
listen 80; # 监听端口
server_name localhost; # 域名/IP
root /var/www/localhost; # 网站根目录
index app.html; # 默认文件(可省略默认index.html)
}
核心指令
1. 直接返回响应
server {
listen 80;
return 200 "Hello World"; # 返回状态码+文本
}
2. 静态文件服务
server {
listen 80;
root /var/www/localhost;
index app.html; # 指定默认文件
}
3. Location 路径匹配
location /images/ { # 匹配/images/路径
root /var/www/media; # 实际路径: /var/www/media/images/
}
location = /exact { # 精确匹配(优先级最高)
root /var/www/exact;
}
location ~* \.(jpg|png)$ { # 不区分大小写的正则匹配
root /var/www/images;
}
匹配优先级:
=>^~>~/~*> 普通路径
高级控制
1. 重定向与重写
# 临时重定向(浏览器URL变化)
location /old {
return 307 /new/index.html;
# 访问http://localhost/old >>> http://localhost/new/index.html
}
# 内部重写(URL不变)
rewrite ^/temp /app/index.html;
2. 错误处理与备用路径
server {
error_page 404 /404.html; # 自定义404页面
location / {
try_files $uri $uri/ /index.html =404;
# 尝试顺序: 文件→目录→备用文件→返回404
}
}
3. 调试响应头
location /debug {
add_header X-Request-Uri "$uri"; # 添加调试头
}
关键技巧
- 配置检查流程
sudo nginx -t # 验证配置 → sudo systemctl restart nginx # 重启生效 - 路径匹配陷阱
location /app可能匹配/apple(避免:用/app/或=精确匹配)- 正则匹配需文件实际存在
- 安全建议
- 避免暴露目录结构:关闭自动索引
autoindex off - 敏感路径限制访问:
location /admin { deny all; }
- 避免暴露目录结构:关闭自动索引
反向代理配置
server {
listen 80;
server_name localhost;
root /var/www/localhost;
index index.html;
# 代理到3001端口的服务
location /app_1 {
proxy_pass http://localhost:3001; # 关键指令
proxy_set_header Host $host; # 传递原始域名
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 代理到3002端口的服务
location /app_2 {
proxy_pass http://localhost:3002;
# 可添加缓存配置(示例):
# proxy_cache my_cache;
# proxy_cache_valid 200 1h;
}
}
关键参数说明:
proxy_pass:核心代理指令,结尾加/会修改URI路径(如http://backend/会移除/app_1前缀)proxy_set_header:传递原始请求信息,避免后端服务丢失客户端数据proxy_cache:启用响应缓存(需提前定义缓存区)
负载均衡配置
# 定义上游服务器组(负载均衡池)
upstream backend-servers {
server localhost:3001 weight=6; # 权重60%
server localhost:3002 weight=4; # 权重40%
server localhost:3003 backup; # 备用节点(仅当主节点全宕机时启用)
# 可选负载策略(默认轮询):
# least_conn; # 最少连接数
# ip_hash; # IP哈希会话保持
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend-servers; # 指向upstream名称
# 健康检查配置
proxy_next_upstream error timeout http_500; # 故障时切换节点
proxy_connect_timeout 2s; # 后端连接超时
}
}
负载均衡策略对比
| 策略 | 配置指令 | 适用场景 |
|---|---|---|
| 加权轮询 | weight | 默认策略,按权重分配流量 |
| 最少连接 | least_conn | 长连接服务(如数据库代理) |
| IP哈希 | ip_hash | 会话保持需求(无状态慎用) |
| 备份节点 | backup | 高可用灾备 |
高级配置技巧
1. 动静分离
location /static {
root /var/www/assets; # 直接提供静态文件
}
location /api {
proxy_pass http://backend-servers; # 动态请求转后端
}
2. 故障转移配置
upstream backend {
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.11:80;
}
# 参数说明:
# max_fails=3 → 允许的最大失败次数
# fail_timeout=30s → 节点被标记为不可用的时间
3. 长连接优化
upstream backend {
server 10.0.0.1;
keepalive 32; # 保持的长连接数量
}
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
调试与监控
# 实时查看负载状态
tail -f /var/log/nginx/access.log
# 监控上游节点状态
nginx -T | grep -A 10 upstream # 查看配置
curl http://localhost/nginx_status # 需启用stub_status模块
最佳实践:
- 始终配置
proxy_set_header保证后端获取真实客户端信息- 生产环境启用健康检查(
max_fails+fail_timeout)- 高并发场景开启
keepalive减少TCP握手开销- 静态资源分离处理,减轻后端压力
配置ssl证书
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate "etc/nginx/cert/server.pem";
ssl_certificate_key "etc/nginx/cert/server.key";
server_name example.com;
}
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
# 301 永久重定向
return 301 https://$host$request_uri;
}
实验一 访问控制与传输优化
拒绝内网用户访问,只允许域名访问。 并且优化文件传输
events{}
http{
include /etc/nginx/mime.types;
server_tokens off; # 隐藏nginx版本号
server {
listen 3000 ssl;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_certificate "/etc/nginx/cert/share.euyan.cloud/server.pem";
ssl_certificate_key "/etc/nginx/cert/share.euyan.cloud/server.key";
server_name xxx.euyan.cloud;
location / {
deny 192.168.0.0/24; # 拒绝内网网段
deny 172.16.0.0/16;
allow all;
proxy_pass http://localhost:3010;
proxy_cache off; # 关闭缓存
proxy_buffering off; # 关闭代理缓冲
chunked_transfer_encoding on; # 开启分块传输
sendfile on;
tcp_nopush on; # 开启TCP NOPUSH选项,禁止Nagle算法
tcp_nodelay on; # 开启TCP NODELAY选项,禁止延迟ACK算法
keepalive_timeout 300; # 设定keep-alive超时时间为300秒 长连接情况
client_max_body_size 64m;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; # 设置真实客户端IP
proxy_cache_bypass $http_upgrade;
proxy_set_header Accept-Encoding gzip;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 3000 default_server;
ssl_certificate "/etc/nginx/cert/server.pem";
ssl_certificate_key "/etc/nginx/cert/server.key";
server_name _; # 匹配IP地址访问 返回444
return 444;
}
}
实验二 常规网站部署
events{}
http{
include /etc/nginx/mime.types;
server_tokens off; # 隐藏nginx版本号
server {
listen 80;
server_name xxx.euyan.cloud;
# http重定向
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_certificate "/etc/nginx/cert/xxx.euyan.cloud.crt";
ssl_certificate_key "/etc/nginx/cert/xxx.euyan.cloud.key";
server_name xxx.euyan.cloud;
location / {
root /var/www/localhost;
# 图片资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header Vary Accept-Encoding;
# 开启 gzip 压缩
gzip_static on;
gzip_vary on;
}
}
# 反向代理
location = /submit {
proxy_pass http://127.0.0.1:5000;
proxy_set_header X-Real-IP $remote_addr;
}
location = /visit {
proxy_pass http://127.0.0.1:5000;
proxy_set_header X-Real-IP $remote_addr;
}
# json文件访问控制
location = /rsvp_data.json {
allow 111.33.37.xxx/32;
deny all;
}
}
}