一. 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; # 确保路径正确
}
}
}
这样 你每次 刷新浏览器 就会在不同程序上返回了
原文地址:https://blog.csdn.net/pasaxiaorui/article/details/143366819
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!