前后端分离(前端 + flask):
# 阻止ip访问server {# default_server 是一个配置参数,用于指定当请求的域名(Host 头)没有匹配任何 server 块时,Nginx 应该使用哪个 server 块来处理这些请求。 listen 443 ssl default_server;server_name _; # 匹配所有未配置的域名或IP,这样设置了 default_server 的 server 块(即本块)就会处理所有未匹配的请求。ssl_certificate cert/证书.pem; # 签名证书路径,相对路径、绝对路径都可以ssl_certificate_key cert/私钥.key; # 私钥路经return 403; # 返回禁止访问}# https配置模板server {# https的默认端口是443,只有把端口写成443,登录网站的时候才不需要写端口号listen 443 ssl;# [::] 是 IPv6 的通配符地址,表示监听所有可用的 IPv6 地址(类似于 IPv4 的 0.0.0.0)listen [::]:443 ssl;# Nginx 会先检查请求的域名是否与某个 server_name 精确匹配,# 如果没有精确匹配,会尝试使用通配符匹配。如果没有找到匹配的 server_name,Nginx 会将请求交给 default_server 的 server 块。server_name 这里写你的域名;# ssl配置,证书可以使用免费的Let's Encrypt生成,阿里云上也有,但是签名需要域名,# 不需要域名的可以自己使用 openssl 创建自签名证书,但是自签名证书不受信任ssl_certificate cert/证书.pem; # 签名证书路径,nginx支持pem格式的证书ssl_certificate_key cert/私钥.key; # 私钥路经# 启用ssl协议,强制使用 TLS 1.2 和 1.3 版本ssl_protocols TLSv1.2 TLSv1.3; # 启用加密套件,加密套件的顺序用冒号分隔。很重要,Nginx 会按照这个顺序选择一个加密套件ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';# 强制性要求浏览器在加密连接时优先使用 服务器端 的加密套件ssl_prefer_server_ciphers on; # 会话缓存:会话缓存能够存储客户端和服务器之间建立的 SSL/TLS 会话,避免每次请求都重新建立完整的握手过程,从而提升性能,减少 CPU 使用。通常 1 MB 可以存储大约 4000 个会话。ssl_session_cache shared:SSL:1m; # 会话缓存时间:用于设置 SSL 会话缓存中会话的过期时间。在指定时间内,客户端可以重用之前缓存的会话,对于大多数网站,设置为 5m(5 分钟)到 10m(10 分钟)是合理的范围。ssl_session_timeout 5m; # 向 HTTP 响应中添加自定义的 HTTP 头部信息。语法:add_header <header_name> <value> [always];# add_header 指令可以写在 http、server 或 location 块中,作用范围会逐级缩小。如果多个级别的 add_header 冲突,优先使用最具体(内层)的配置。# 强制客户端使用 HTTPS 访问,防止中间人攻击。# max-age=31536000:缓存 1 年。includeSubDomains:对子域生效。preload:允许加入浏览器 HSTS 预加载列表。# [always]: 默认情况下,add_header 只会在响应状态码为 200、204、206、301、302、303 或 304 时添加。如果加上 always 参数,头部会在所有响应中添加(包括错误状态码,如 404 或 500)。add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;# 只允许特定的 HTTP 方法。add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";# 限制加载资源的来源,防止恶意脚本注入。# default-src 'self' 仅允许加载本域的资源。如果你不熟悉域的概念就别用# script-src 'self' 'unsafe-inline' 限制脚本加载来源,仅允许本域和内联脚本。如果你不熟悉域的概念就别用# img-src 'self' data: 限制图片来源,仅允许本域和 data: 协议。add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; img-src 'self' data:;";# location 指令用于定义一个位置块,它根据请求的 URI 匹配特定的路径。# 前端代理,根路径指向静态文件location / {# 指定静态文件的根目录root html/course;# 指定当请求为目录时,默认返回的页面index index/index.html;}# 后端代理,将/api/开头的请求转发到后端服务器的 http://localhost:5000 上location /api/ {# proxy_pass 指定代理的后端服务器的地址。# 注意:http://localhost:5000/ 和 http://localhost:5000 所代表的url拼接规则是不一样的。自己去搜 proxy_pass 参数怎么用proxy_pass http://localhost:5000/;# proxy_set_header 用于设置转发给后端服务器的请求头部。# Host头部保持了原始请求的Host值。proxy_set_header Host $host;# X-Real-IP头部记录了原始客户端的IP地址。proxy_set_header X-Real-IP $remote_addr;# X-Forwarded-For头部是一个逗号分隔的列表,包含了从客户端到代理服务器的所有IP地址(包括客户端的IP地址)。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# X-Forwarded-Proto头部记录了原始请求使用的协议(如http或https)。proxy_set_header X-Forwarded-Proto $scheme;}# WebSocket 代理,我使用的是 flask_socketio,请根据实际情况修改匹配的urllocation /socket.io/ {proxy_pass http://localhost:5000;# 这里必须使用 http1.1 版本,因为1.1版本才是长连接proxy_http_version 1.1;# 设置 Upgrade 请求头,用于处理协议升级(从 HTTP 升级到 WebSocket)。proxy_set_header Upgrade $http_upgrade;# 强制将 Connection 设置为 "upgrade",以支持协议切换。proxy_set_header Connection "upgrade";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;# 设置超时时间为 60 秒,用于保持 WebSocket 连接。proxy_read_timeout 60s;}# 404错误页面配置:当请求的文件不存在时,转入 /404.html 页面error_page 404 /404.html;# 匹配 /404 错误页面,=表示精确匹配location = /404.html {# 指定 404.html 页面的位置root /usr/share/nginx/html/404.html;}}