一. nginx学习笔记 又长又臭篇幅
目录
引言
Nginx 简介
Nginx 的特点和优势
适用场景
安装 Nginx
在 Windows 上安装 Nginx
在 Linux (CentOS)上安装 Nginx
基本配置
Nginx 配置文件结构
启动、停止和重载 Nginx
基本的服务器块配置
处理静态文件
设置文档根目录
配置 MIME 类型
优化静态文件服务
反向代理
反向代理概述
反向代理的优点:
配置反向代理服务器
负载均衡基本配置
负载均衡算法
SSL/TLS 配置
获取 SSL 证书
配置 HTTPS
强制 HTTPS 重定向
完整配置示例
访问控制
IP 地址白名单和黑名单
IP 地址白名单
IP 地址黑名单
基于请求的访问控制
基于请求的 URI 访问控制
基于请求方法的访问控制
日志管理
配置访问日志和错误日志
访问日志
错误日志
日志格式定制
日志分析工具
性能优化
缓存配置
Gzip 压缩
Keep-Alive 设置
安全性
基本安全配置
防止 DDoS 攻击
安全性最佳实践
使用 HTTPS
定期更新 Nginx
限制访问控制
使用安全的文件权限
定期检查日志
常见问题与故障排除
常见错误代码及其含义
解决常见配置问题
调试技巧
案例:
-
引言
-
Nginx 简介
- Nginx最初由 Igor Sysoev 开发,旨在解决 C10K 问题,即如何在单台服务器上同时处理一万多个并发连接。Nginx 采用事件驱动架构,相比传统的线程或进程模型,能够更有效地利用系统资源,实现高并发处理。
-
Nginx 的特点和优势
- 高并发处理:使用事件驱动模型,能够处理大量并发连接,适合高流量网站。
- 低内存消耗:相比其他服务器,Nginx 的内存占用较低,适合资源有限的环境。
- 反向代理和负载均衡:支持多种负载均衡算法,能够将请求分发到多个后端服务器,提升网站的可用性和响应速度。
- 灵活的配置:通过配置文件,用户可以轻松地定制 Nginx 的行为,满足不同需求。
- 静态文件处理:对于静态文件,Nginx 的处理速度非常快,适合用作静态资源的服务器。
- 安全性:支持 SSL/TLS 加密和防止 DDoS 攻击,增强网站的安全性。
-
适用场景
-
反向代理服务器:将请求转发到后端服务器(如应用服务器),以实现负载均衡和提高安全性。
-
负载均衡:支持多种负载均衡算法(如轮询、IP 哈希等),可以将流量分配到多台后端服务器,提高系统的可用性和性能。
-
静态文件服务:能够高效地提供静态资源(如图片、CSS、JavaScript 等),通常性能优于传统的应用服务器。
-
SSL/TLS 终端:处理 HTTPS 请求,卸载加密和解密的负担,减轻后端服务器的压力。
-
内容缓存:可以缓存静态和动态内容,提高访问速度,减少后端负载。
-
API 网关:适用于微服务架构,作为 API 请求的入口,进行流量管理、认证和监控。
-
WebSocket 代理:支持 WebSocket 协议,适合需要实时通信的应用。
-
HTTP/2 支持:支持 HTTP/2 协议,提升网站的加载速度和用户体验。
-
-
-
安装 Nginx
-
在 Windows 上安装 Nginx
-
下载 Nginx:
- 访问 nginx: download
- 下载适合 Windows 的最新版本(通常是
.zip
文件)。
-
解压缩:
- 将下载的
.zip
文件解压到您希望安装 Nginx 的目录(例如 D:\nginx
)。
- 将下载的
-
运行 Nginx:
- 打开命令提示符(cmd)。
- 进入 Nginx 的安装目录:
-
start nginx
-
验证安装:
- 在浏览器中访问 http://127.0.0.1:80/,如果看到 Nginx 欢迎页面,则安装成功。
-
停止 Nginx:
- 在命令提示符中输入:(然后刷新浏览器就访问不到了)
-
nginx -s stop
-
-
在 Linux (CentOS)上安装 Nginx
- 安装 EPEL 仓库(Nginx 在 EPEL 中可用):
-
sudo yum install epel-release -y
-
- 安装 Nginx:
-
sudo yum install nginx -y
-
- 启动 Nginx 服务:
-
sudo systemctl start nginx
-
- 设置 Nginx 开机自启动:
-
sudo systemctl enable nginx
-
- 检查 Nginx 是否运行:
-
sudo systemctl status nginx
-
- 打开浏览器,访问127.0.0.1
- 要关闭 Nginx 服务
-
sudo systemctl stop nginx
-
- 用 Nginx 的开机自启动
-
sudo systemctl disable nginx
-
- 安装 EPEL 仓库(Nginx 在 EPEL 中可用):
-
-
基本配置
-
Nginx 配置文件结构
-
user nginx; # 指定 Nginx 运行的用户 worker_processes auto; # 自动设置工作进程数 events { worker_connections 1024; # 每个工作进程的最大连接数 } http { include mime.types; # 包含 MIME 类型文件 default_type application/octet-stream; sendfile on; # 启用高效文件传输 keepalive_timeout 65; # 设置保持连接的超时时间 # 定义服务器块 server { listen 80; # 监听的端口 server_name localhost; # 服务器名 location / { root /usr/share/nginx/html; # 网站根目录 index index.html index.htm; # 默认首页文件 } } }
-
-
启动、停止和重载 Nginx
-
sudo systemctl start nginx //启动 sudo systemctl stop nginx //停止 sudo systemctl reload nginx //重新加载 sudo systemctl status nginx //连接状态
#windows 重新加载 nginx -s reload
-
-
基本的服务器块配置
-
server { listen 80; # 监听 HTTP 请求 server_name example.com www.example.com; # 服务器名 location / { root /var/www/html; # 网站根目录 index index.html index.htm; # 默认首页 } location /images/ { root /var/www; # 指定子目录 } # 错误页面配置 error_page 404 /404.html; location = /404.html { internal; } # 反向代理示例 location /api/ { proxy_pass http://backend_server; # 代理到后端服务器 } }
-
-
-
处理静态文件
-
设置文档根目录
- 在 Nginx 中,可以通过
root
或alias
指令设置文档根目录。假设你希望将文档根目录设置为D:/tu
,你可以这样配置: -
server { listen 8072; server_name localhost; location / { root D:/tu; # 设置文档根目录 index index.html; # 默认首页文件 } }
- 在 Nginx 中,可以通过
-
配置 MIME 类型
- Nginx 默认会加载
mime.types
文件来设置 MIME 类型。如果你需要为特定文件类型设置 MIME 类型,可以在http
块中进行配置。例如: -
http { include mime.types; # 加载 MIME 类型配置 default_type application/octet-stream; # 其他配置... }
-
你可以在
mime.types
文件中找到常见文件扩展名的 MIME 类型,如下所示:text/html html htm; text/css css; text/javascript js; image/jpeg jpg jpeg; image/png png;
- Nginx 默认会加载
-
优化静态文件服务
- 启用
sendfile
:可以提高文件传输性能。-
sendfile on; # 启用高效文件传输
-
-
使用
gzip
压缩:可以减少传输数据的大小。-
gzip on; # 启用 gzip 压缩 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
-
-
设置缓存:为静态文件设置合理的缓存策略。
-
location / { expires 30d; # 设置文件过期时间为30天 }
-
- 启用
-
-
反向代理
-
反向代理概述
- 反向代理 是一种服务器,客户端请求不直接发送到目标服务器,而是发送到反向代理服务器。反向代理服务器接收请求,然后将其转发到适当的后端服务器。后端服务器的响应会通过反向代理返回给客户端。
-
反向代理的优点:
- 安全性:隐藏后端服务器的真实地址,增强安全性。
- 负载均衡:可以将请求分配到多台后端服务器,以实现负载均衡,提高性能。
- 缓存:反向代理可以缓存后端服务器的响应,减少对后端的请求压力。
- SSL 终止:可以在反向代理服务器上处理 SSL 加密,简化后端服务器的配置。
-
配置反向代理服务器
-
server { listen 80; # 监听 80 端口 server_name zbr.com; # 你的服务器域名或 IP 地址 location /ceshi { proxy_pass http://192.68.1.11:7862; # 将请求转发到目标服务 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; # 添加 X-Forwarded-For 头 proxy_set_header X-Forwarded-Proto $scheme; # 添加协议头 } }
-
-
负载均衡基本配置
-
http { upstream backend_servers { server backend1.example.com; # 第一台后端服务器 server backend2.example.com; # 第二台后端服务器 server backend3.example.com; # 第三台后端服务器 } server { listen 80; server_name example.com; location / { proxy_pass http://backend_servers; # 将请求转发到负载均衡集群 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; } } }
负载均衡算法
-
轮询(默认):按顺序将请求分配到每台后端服务器。
-
权重:根据权重将请求分配到后端服务器。配置示例:
-
upstream backend_servers { server backend1.example.com weight=3; # 权重为 3 server backend2.example.com weight=1; # 权重为 1 }
-
-
IP 哈希:根据客户端 IP 地址将请求分配到特定后端服务器。配置示例:
-
upstream backend_servers { ip_hash; # 启用 IP 哈希 server backend1.example.com; server backend2.example.com; }
-
-
-
-
-
SSL/TLS 配置
-
获取 SSL 证书
- 网上买一个
-
配置 HTTPS
-
server { listen 443 ssl; # 启用 SSL server_name example.com www.example.com; # 你的域名 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # SSL 证书路径 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 私钥路径 # 强化 SSL 配置(可选) ssl_protocols TLSv1.2 TLSv1.3; # 启用 TLS 版本 ssl_ciphers 'HIGH:!aNULL:!MD5'; # 设置密码套件 location / { # 你的其他配置... } }
-
-
强制 HTTPS 重定向
- 如果你希望将所有 HTTP 请求重定向到 HTTPS,可以添加一个新的 server 块来处理 80 端口的请求:
-
server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; # 强制重定向到 HTTPS }
-
完整配置示例
-
# 强制 HTTP 到 HTTPS 重定向 server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; # 强制重定向到 HTTPS } # HTTPS 配置 server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # SSL 证书路径 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 私钥路径 # 强化 SSL 配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'HIGH:!aNULL:!MD5'; location / { # 你的其他配置... } }
-
-
-
访问控制
-
IP 地址白名单和黑名单
-
IP 地址白名单
server { listen 80; server_name example.com; location / { allow 192.168.1.100; # 允许的 IP 地址 allow 192.168.1.101; # 另一个允许的 IP 地址 deny all; # 拒绝其他所有访问 } }
IP 地址黑名单
-
server { listen 80; server_name example.com; location / { deny 192.168.1.200; # 拒绝的 IP 地址 deny 192.168.1.201; # 另一个拒绝的 IP 地址 allow all; # 允许其他所有访问 } }
-
-
-
基于请求的访问控制
-
基于请求的 URI 访问控制
-
server { listen 80; server_name example.com; location /admin { allow 192.168.1.100; # 仅允许特定 IP 地址访问 deny all; # 拒绝其他访问 } }
-
-
基于请求方法的访问控制
-
server { listen 80; server_name example.com; location /api { limit_except GET { deny all; # 只允许 GET 请求,拒绝其他方法 } } }
-
-
-
-
日志管理
-
配置访问日志和错误日志
-
访问日志
-
Nginx 默认会记录访问日志,可以在 http 或 server 块中进行配置。例如: http { access_log /var/log/nginx/access.log; # 访问日志文件路径 # 其他配置... }
-
-
错误日志
-
错误日志的配置类似,可以在 http 或 server 块中进行配置: http { error_log /var/log/nginx/error.log; # 错误日志文件路径 error_log /var/log/nginx/error.log warn; # 设置日志级别为 warn # 其他配置... }
-
-
-
日志格式定制
-
http { log_format custom_format '$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 custom_format; # 使用自定义格式 }
$remote_addr
:客户端 IP 地址$remote_user
:用户认证信息$time_local
:访问时间$request
:请求行$status
:HTTP 状态码$body_bytes_sent
:发送的字节数$http_referer
:来源地址$http_user_agent
:客户端用户代理$http_x_forwarded_for
:转发的客户端 IP(如果存在)
-
-
日志分析工具
- GoAccess
- AWStats
-
-
性能优化
-
缓存配置
- 静态文件缓存
-
可以通过
expires
指令配置静态文件的缓存时间。例如,设置缓存图片、CSS 和 JS 文件:location / { expires 30d; # 缓存 30 天 add_header Cache-Control "public, max-age=2592000"; # 设置 Cache-Control 头 }
-
- 代理缓存
-
如果 Nginx 作为反向代理,你可以配置代理缓存来提高性能:
http { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { listen 80; server_name example.com; location /api { proxy_pass http://backend_server; proxy_cache my_cache; # 启用代理缓存 proxy_cache_valid 200 60m; # 缓存 200 响应 60 分钟 } } }
-
- 静态文件缓存
-
Gzip 压缩
-
启用 Gzip 压缩可以减少传输数据的大小,提高网站加载速度。可以在
http
块中配置:http { gzip on; # 启用 Gzip 压缩 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 压缩的 MIME 类型 gzip_min_length 1000; # 最小压缩长度 gzip_vary on; # 支持代理缓存 }
-
-
Keep-Alive 设置
- Keep-Alive 允许客户端与服务器之间保持持久连接,减少重复连接的开销。可以在
http
块中配置: -
http { keepalive_timeout 65; # 设置 Keep-Alive 超时时间 keepalive_requests 100; # 最大请求数 }
- Keep-Alive 允许客户端与服务器之间保持持久连接,减少重复连接的开销。可以在
-
-
安全性
-
基本安全配置
- 关闭不必要的 HTTP 方法
-
server { listen 80; server_name example.com; location / { limit_except GET POST { deny all; # 只允许 GET 和 POST 方法 } } }
-
- 隐藏 Nginx 版本信息
-
http { server_tokens off; # 隐藏版本信息 }
-
- 限制请求速率
-
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; # 每个 IP 每秒最多 1 个请求 server { listen 80; server_name example.com; location / { limit_req zone=one burst=5; # 突发请求数为 5 # 其他配置... } } }
-
- 关闭不必要的 HTTP 方法
-
防止 DDoS 攻击
- 使用防火墙
- 使用 Nginx 的限制模块
-
http { limit_conn_zone $binary_remote_addr zone=addr:10m; # 每个 IP 地址的连接数限制 server { listen 80; server_name example.com; location / { limit_conn addr 10; # 每个 IP 地址最多 10 个连接 # 其他配置... } } }
-
-
安全性最佳实践
-
使用 HTTPS
强烈建议使用 SSL/TLS 来加密数据传输,保护用户信息。参考之前的 SSL/TLS 配置。
定期更新 Nginx
确保 Nginx 和操作系统保持最新,及时修补已知的安全漏洞。
限制访问控制
使用 IP 白名单和黑名单来限制访问敏感区域,例如管理面板。
使用安全的文件权限
确保 Nginx 配置文件和相关目录的权限设置正确,避免未授权访问。
定期检查日志
定期检查 Nginx 访问日志和错误日志,发现异常活动并采取相应措施。
-
-
-
常见问题与故障排除
-
常见错误代码及其含义
- 400 Bad Request: 客户端请求无效,可能是请求语法错误或请求数据缺失。
- 401 Unauthorized: 请求需要身份验证,客户端未提供有效的凭证。
- 403 Forbidden: 服务器拒绝请求,可能是由于权限设置或文件/目录的访问控制。
- 404 Not Found: 请求的资源未找到,可能是 URL 错误或文件不存在。
- 405 Method Not Allowed: 请求方法不被允许,可能是服务器配置错误。
- 500 Internal Server Error: 服务器内部错误,通常是代码或配置问题。
- 502 Bad Gateway: Nginx 作为反向代理时,后端服务器不可用或返回错误。
- 504 Gateway Timeout: Nginx 作为反向代理时,后端服务器超时未响应。
-
解决常见配置问题
- 检查 Nginx 配置文件
-
nginx -t
-
- 查看错误日志
- 配置文件的正确缩进
-
确保配置文件的格式和缩进正确,尤其是在
server
、location
块中。
-
- 资源路径问题
-
确保静态文件和资源的路径正确配置,使用绝对路径时要注意格式和拼写。
-
- 检查 Nginx 配置文件
-
调试技巧
- 使用 Nginx 的调试日志
-
error_log /var/log/nginx/error.log debug;
-
- 清理缓存
- 测试不同配置
- 在调试时,可以逐步注释掉部分配置,查看问题是否得到解决。
- 使用 Nginx 的调试日志
-
案例:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/', methods=['GET'])
def success():
return jsonify({"port+": "9082"}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9082) # 监听所有可用的接口,端口
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream flask_app {
server 127.0.0.1:9081; # 第一个后端服务
server 127.0.0.1:9082; # 第二个后端服务
}
server {
listen 8072;
server_name localhost;
location / {
proxy_pass http://flask_app; # 使用 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;
proxy_set_header X-Forwarded-Proto $scheme;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root D:/tu/nginx-1.26.2/nginx-1.26.2/html; # 确保路径正确
}
}
}
这样 你每次 刷新浏览器 就会在不同程序上返回了