nginx 的 server 块配置解析

前后端分离(前端 + flask):

nginx 复制代码
	# 阻止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,请根据实际情况修改匹配的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;
        }

        # 404错误页面配置:当请求的文件不存在时,转入 /404.html 页面
        error_page  404              /404.html;
        # 匹配 /404 错误页面,=表示精确匹配
        location = /404.html {
            # 指定 404.html 页面的位置
            root /usr/share/nginx/html/404.html;
        }

    }
相关推荐
Fcy6481 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满1 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠2 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9032 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技3 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀3 小时前
Linux环境变量
linux·运维·服务器
zzzsde3 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º5 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~5 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化
神梦流5 小时前
GE 引擎的内存优化终局:静态生命周期分析指导下的内存分配与复用策略
linux·运维·服务器