http { server_tokens off; # 隐藏版本号 # 想要彻底清除 Server 响应头可以选择 ngx_headers_more 模块，这个模块需要额外安装。或者直接安装 nginx-extras 包也会带上这个模块。 more_clear_headers Server; # 清除 Server 响应头 # 阻止ip访问 server { # default_server 是一个配置参数，用于指定当请求的域名（Host 头）没有匹配任何 server 块时，Nginx 应该使用哪个 server 块来处理这些请求。 listen 443 ssl default_server; server_name _; # 匹配所有未配置的域名或IP，这样设置了 default_server 的 server 块（即本块）就会处理所有未匹配的请求。 ssl_certificate 证书.pem; # 签名证书路径，相对路径、绝对路径都可以 ssl_certificate_key 私钥.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 证书.pem; # 签名证书路径，nginx支持pem格式的证书 ssl_certificate_key 私钥.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:;"; # 启用 gzip 压缩，优化传输速度和网络带宽使用。 gzip on; # 文件大于 1KB 才压缩，对于小文件（小于 1KB 的资源），压缩的效果不明显，还可能导致处理开销增加，因此跳过。 gzip_min_length 1024; # 设置压缩等级为 5，这是一种性能和压缩比的折中选择。Gzip 压缩需要消耗服务器的 CPU 资源，过高的压缩等级可能增加服务器的负载。推荐压缩等级为 4~6。 gzip_comp_level 5; # 指定要压缩的资源类型：text/plain: 纯文本文件。text/css: CSS 样式表文件。application/json: JSON 数据（比如 API 响应）。 # application/javascript: JavaScript 文件。text/xml 和 application/xml: XML 文件。image/svg+xml: 矢量图片（SVG 格式）。 # 图片文件通常不需要 Gzip 压缩。他们已经是高度压缩了。 gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml; # 添加 Vary: Accept-Encoding 头部用于通知缓存服务器根据客户端是否支持 Gzip 压缩返回不同的内容。 gzip_vary on; # 为所有代理请求启用压缩，适用于反向代理场景。 gzip_proxied any; # location 指令用于定义一个位置块，它根据请求的 URI 匹配特定的路径。location也可以嵌套在其他location块中。 # 前端代理，根路径 / 指向静态文件 index/index.html。 location / { # 指定静态文件的根目录 root html/course; # 指定当请求为url目录时，默认返回的页面 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，请根据实际情况修改匹配的url location /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; } # 单独按文件类型配置静态资源，可以单独为图片、CSS、JS 文件设置不同的缓存策略。 # 也可以写到某页的 location 块中。比如： # location / { # root html/course; # index index/index.html; # expires 30d; # add_header Cache-Control "public, max-age=2592000"; # } # 这里我选择统一缓存网站的所有静态资源，使用正则表达式匹配文件后缀。每页的 location 块中也可以单独配置，如上。 # 配置图片、视频缓存 location ~* \.(jpg|jpeg|png|gif|ico|svg|webp|mp4)$ { # 必须设置 root 参数，指定静态文件的根目录。不然无法找到静态文件。 root html/course; # 设置静态资源的缓存时间为 30 天。 expires 30d; # 设置浏览器缓存策略。public：表示该资源可以被任何缓存（包括浏览器缓存和中间代理缓存）存储和共享。max-age=2592000 表示缓存时间为 30 天。 # 浏览器在 30 天内不会重新请求资源，直接从本地缓存加载。 add_header Cache-Control "public, max-age=2592000"; } # 配置 CSS 和 JS 文件缓存 location ~* \.(css|js)$ { root html/course; expires 1d; # 缓存 1 天 add_header Cache-Control "public, max-age=86400"; } # 页面资源（HTML 文件） location ~* \.(html)$ { root html/course; add_header Cache-Control "no-cache, no-store, must-revalidate"; # 确保内容实时更新 } # 防止访问隐藏文件（如 .git 文件） location ~ /\. { deny all; } # 404错误页面配置：当请求的文件不存在时，转入 /404.html 页面 error_page 404 /404.html; # 匹配 /404 错误页面，=表示精确匹配 location = /404.html { # 指定 404.html 页面的位置 root /usr/share/nginx/html/404.html; } } }