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;
}
}
}
版权属于:
无心博客
作品采用:
《
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
》许可协议授权
评论 (0)