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;
        }

    }
相关推荐
tan6257477 分钟前
github
运维
鹧鸪云光伏与储能软件开发10 分钟前
鹧鸪云运维软件焕新升级
运维·光伏运维
lishing635 分钟前
Linux驱动开发(18):linux驱动并发与竞态
linux·运维·服务器
对,就是哥39 分钟前
ABAP 两个内表不同名称字段赋值的方法
运维·数据库·windows
O。o.尊都假都3 小时前
003__系统共享工具、服务器的使用
linux·运维·服务器
叱咤少帅(少帅)6 小时前
Ubuntu Server安装谷歌浏览器
linux·运维·ubuntu
聚名网7 小时前
加固服务器有什么用?
运维·服务器
比钻石还闪亮的nan人8 小时前
ubuntu 使用s3fs配置自动挂载对象存储
linux·运维·ubuntu
whp4049 小时前
docker-compose 简单部署
运维·docker·容器
冷曦_sole10 小时前
linux-26 文件管理(四)install
linux·运维·服务器