nginx内外网分流+https证书同步


一、内网nginx配置

目录结构:

nginx内外网分流+https证书同步

1.1 支持stream代理

修改 /etc/nginx/nginx.conf,添加以下代码

Markup 全选
stream {
   include /etc/nginx/stream.d/*.conf;
}

nginx内外网分流+https证书同步

1.2 公共配置片段

 /etc/nginx/snippets/proxy-params.conf

Markup 全选
proxy_set_header Host $host; # 传递原始请求的域名(主机名)。
proxy_set_header X-Real-IP $remote_addr; # 传递客户端的真实 IP 地址。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 记录完整的代理链路 IP 列表 它比 X-Real-IP 更强大。如果请求经过了多层代理(比如:用户 -> CDN -> Nginx1 -> Nginx2 -> 后端),这个变量会不断追加 IP
proxy_set_header X-Forwarded-Proto $scheme; # 告知后端原始请求使用的是 HTTP 还是 HTTPS。
proxy_set_header X-NginX-Proxy true; # 仅仅是一个header标记,配合后端适用的

# 第一层nginx不需要下面三行配置
real_ip_header X-Real-IP;
set_real_ip_from 10.8.0.0/24; # 填 上一层代理 的内网网段
real_ip_recursive on;

# 跑腿员到达餐厅门口,敲门或者打电话给老板,看老板在不在。如果过了 90 秒老板还没开门(建立 TCP 连接失败),跑腿员就走了;
# 这个阶段还没开始传数据,只是在“打招呼”。通常这个值不需要设太长(比如 60s 或更短),因为如果 5-10 秒都连不上,后端大概率挂了。
proxy_connect_timeout 90; # 握手时间 Nginx 尝试与后端服务器建立连接的最长等待时间; 
# 老板开了门,跑腿员开始报菜单。如果跑腿员报了一半,剩下的菜单卡在嗓子里 90 秒没说出来(网络拥塞或后端接收太慢),连接就会断开;
# 它不是指整个发送过程,而是指两次相邻的写入操作之间的时间间隔
proxy_send_timeout 90; # 写入时间 Nginx 向后端服务器发送请求数据的最长等待时间;
# 菜单报完了,老板进厨房炒菜。跑腿员在门口等出餐。如果 90 秒还没出一个菜(后端处理逻辑太慢,比如查了大表),跑腿员就报超时;
# 这是最容易触发 504 错误的地方。如果你有耗时很长的 API(比如导出 Excel 或大数据分析),这个值必须调大
proxy_read_timeout 300; # 读取时间 Nginx 等待后端服务器返回响应数据的最长等待时间;

common-params.conf

Markup 全选
# 基础性能优化
gzip on; # 开启 Gzip 压缩功能。
gzip_types text/plain text/css application/json application/javascript; # 指定哪些类型的文件需要压缩。通常包含文本、CSS、JSON 和 JS。图片(JPG/PNG)通常不建议压缩,因为它们本身已高度压缩。
gzip_static on; # 高级功能。如果目录下已经存在 .gz 后缀的预压缩文件,直接发送该文件,不再消耗 CPU 实时压缩。
gzip_min_length 1k; # 小于 1k 的文件不压缩。因为压缩小文件可能反而会让体积变大。
gzip_comp_level 4; # 压缩等级(1-9)。4 是性能与压缩率的最佳平衡点;等级越高,体积越小,但 CPU 消耗剧增。
gzip_proxied any; # 无论后端请求是否有缓存相关头部,Nginx 都会对代理转发的请求进行压缩。
  
gzip_vary on; # 在响应头添加 Vary: Accept-Encoding,告诉浏览器或 CDN:这个版本是压缩过的,防止缓存错乱。
gzip_http_version   1.0; # 兼容老版本 HTTP 协议,确保绝大多数客户端都能接收压缩包。
gzip_disable "MSIE [1-6]\.(?!.*SV1)"; # 禁用特定的浏览器。这里是禁用极其古老的 IE6,因为它对 Gzip 支持有 Bug。


# 设置上传文件的大小
# 限制客户端请求体的最大允许大小(即上传文件限制)
# Nginx 默认只有 1M。 当用户上传一个 5MB 的头像时,Nginx 会直接拦截并返回 413 Request Entity Too Large 错误。设置为 100m 意味着允许最大 100MB 的文件上传。
client_max_body_size 100m;

# 安全头部
# 这三行是防止常见的 Web 攻击(如点击劫持、脚本注入)的“防弹背心”。
add_header X-Frame-Options "SAMEORIGIN"; # 防止点击劫持 (Clickjacking) ;只允许同域名的页面通过 <iframe> 嵌套本站。;坏人不能在他的网页里通过透明的 iframe 套住你的网站,诱导你的用户点击。
add_header X-XSS-Protection "1; mode=block"; # 开启浏览器 XSS 过滤器;如果浏览器检测到跨站脚本攻击(XSS),直接停止渲染整个页面(mode=block)。虽然现代浏览器有更先进的 CSP,但这依然是一个很好的基础防护。
add_header X-Content-Type-Options "nosniff"; # 禁用 MIME 类型嗅探;有些浏览器很“聪明”,即使你告诉它这是一个 .txt 文件,它看里面有 HTML 代码就会把它当 HTML 执行。;强制浏览器必须遵守服务器给出的 Content-Type。这可以防止用户上传一个伪装成图片的恶意脚本文件。

1. 3设置默认404页面

/etc/nginx/conf.d/00-default.conf

要确保这个文件是排在第一位,因为nginx匹配不到代理的时候,会默认返回第一个

Markup 全选
server {
    listen 80 default_server;
    listen 443 ssl default_server;
    
    # 这里的 server_name 设为 _ 只是为了捕获所有未匹配的请求
    server_name _default_fallback;

    # 必须提供证书才能建立 SSL 连接,可以用你现有的任何一个证书
    ssl_certificate     /etc/nginx/ssl/erp.infnitee.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/erp.infnitee.com/privkey.pem;

    # 重点:在响应头里显式告诉客户端,我是谁,你访问的是谁
    add_header X-Debug-Matched-Server "This is the Default Fallback Server" always;
    add_header X-Debug-Requested-Host "$host" always;
    add_header X-Debug-Config-ServerName "$server_name" always;

    location / {
        default_type text/plain;
        return 200 "Fallback: Your request for '$host' matched the DEFAULT server block. \nCheck your specific config for '$host' server_name.";
    }
}

 

 

1.4 代理示例:

Markup 全选
server {
  listen 80;
  server_name test.infnitee.com;
  location /.well-known/acme-challenge/ {
    root /var/www/certbot;
  }
  return 301 https://$host$request_uri;
}
server {
  listen 443 ssl;
  server_name test.infnitee.com;
  ssl_certificate   /etc/nginx/ssl/test.infnitee.com/fullchain.pem;
  ssl_certificate_key  /etc/nginx/ssl/test.infnitee.com/privkey.pem;
  #ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
  #ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  #ssl_prefer_server_ciphers on;
  #ssl_session_cache shared:SSL:10m;
  #ssl_session_timeout 10m;
  #add_header Strict-Transport-Security "max-age=31536000";
  #error_page 497  https://$host$request_uri;

  include snippets/common-params.conf; # 一行引入所有通用配置

  location / {
    proxy_pass http://192.168.88.160:8020;
    include snippets/proxy-params.conf; # 一行引入所有通用配置
  }
}

第一次可以先取消https证书

 

二、外网(公网)nginx配置

nginx目录结构

nginx内外网分流+https证书同步

公网的nginx是不需要ssl目录的,利用letsencrypt

2.1 支持stream

nginx.conf中添加以下配置

Markup 全选
stream {
   include /etc/nginx/stream.d/*.conf;
}

nginx内外网分流+https证书同步

2.2 snippets配置片段

内外网的公共配置片段会存在些许差异

/etc/nginx/snippets/common-params.conf

Markup 全选
# 基础性能优化
gzip on; # 开启 Gzip 压缩功能。
gzip_types text/plain text/css application/json application/javascript; # 指定哪些类型的文件需要压缩。通常包含文本、CSS、JSON 和 JS。图片(JPG/PNG)通常不建议压缩,因为它们本身已高度压缩。
gzip_static on; # 高级功能。如果目录下已经存在 .gz 后缀的预压缩文件,直接发送该文件,不再消耗 CPU 实时压缩。
gzip_min_length 1k; # 小于 1k 的文件不压缩。因为压缩小文件可能反而会让体积变大。
gzip_comp_level 4; # 压缩等级(1-9)。4 是性能与压缩率的最佳平衡点;等级越高,体积越小,但 CPU 消耗剧增。
gzip_proxied any; # 无论后端请求是否有缓存相关头部,Nginx 都会对代理转发的请求进行压缩。
  
gzip_vary on; # 在响应头添加 Vary: Accept-Encoding,告诉浏览器或 CDN:这个版本是压缩过的,防止缓存错乱。
gzip_http_version   1.0; # 兼容老版本 HTTP 协议,确保绝大多数客户端都能接收压缩包。
gzip_disable "MSIE [1-6]\.(?!.*SV1)"; # 禁用特定的浏览器。这里是禁用极其古老的 IE6,因为它对 Gzip 支持有 Bug。


# 设置上传文件的大小
# 限制客户端请求体的最大允许大小(即上传文件限制)
# Nginx 默认只有 1M。 当用户上传一个 5MB 的头像时,Nginx 会直接拦截并返回 413 Request Entity Too Large 错误。设置为 100m 意味着允许最大 100MB 的文件上传。
client_max_body_size 100m;

# 安全头部
# 这三行是防止常见的 Web 攻击(如点击劫持、脚本注入)的“防弹背心”。
add_header X-Frame-Options "SAMEORIGIN"; # 防止点击劫持 (Clickjacking) ;只允许同域名的页面通过 <iframe> 嵌套本站。;坏人不能在他的网页里通过透明的 iframe 套住你的网站,诱导你的用户点击。
add_header X-XSS-Protection "1; mode=block"; # 开启浏览器 XSS 过滤器;如果浏览器检测到跨站脚本攻击(XSS),直接停止渲染整个页面(mode=block)。虽然现代浏览器有更先进的 CSP,但这依然是一个很好的基础防护。
add_header X-Content-Type-Options "nosniff"; # 禁用 MIME 类型嗅探;有些浏览器很“聪明”,即使你告诉它这是一个 .txt 文件,它看里面有 HTML 代码就会把它当 HTML 执行。;强制浏览器必须遵守服务器给出的 Content-Type。这可以防止用户上传一个伪装成图片的恶意脚本文件。

/etc/nginx/snippets/proxy-params.conf

Markup 全选
proxy_set_header Host $host; # 传递原始请求的域名(主机名)。
proxy_set_header X-Real-IP $remote_addr; # 传递客户端的真实 IP 地址。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 记录完整的代理链路 IP 列表 它比 X-Real-IP 更强大。如果请求经过了多层代理(比如:用户 -> CDN -> Nginx1 -> Nginx2 -> 后端),这个变量会不断追加 IP
proxy_set_header X-Forwarded-Proto $scheme; # 告知后端原始请求使用的是 HTTP 还是 HTTPS。
proxy_set_header X-NginX-Proxy true; # 仅仅是一个header标记,配合后端适用的

# 第一层nginx不需要下面三行配置
# real_ip_header X-Real-IP;
# set_real_ip_from 10.8.0.1/24; # 填 上一层代理 的内网网段
# real_ip_recursive on;

# 跑腿员到达餐厅门口,敲门或者打电话给老板,看老板在不在。如果过了 90 秒老板还没开门(建立 TCP 连接失败),跑腿员就走了;
# 这个阶段还没开始传数据,只是在“打招呼”。通常这个值不需要设太长(比如 60s 或更短),因为如果 5-10 秒都连不上,后端大概率挂了。
proxy_connect_timeout 90; # 握手时间 Nginx 尝试与后端服务器建立连接的最长等待时间; 
# 老板开了门,跑腿员开始报菜单。如果跑腿员报了一半,剩下的菜单卡在嗓子里 90 秒没说出来(网络拥塞或后端接收太慢),连接就会断开;
# 它不是指整个发送过程,而是指两次相邻的写入操作之间的时间间隔
proxy_send_timeout 90; # 写入时间 Nginx 向后端服务器发送请求数据的最长等待时间;
# 菜单报完了,老板进厨房炒菜。跑腿员在门口等出餐。如果 90 秒还没出一个菜(后端处理逻辑太慢,比如查了大表),跑腿员就报超时;
# 这是最容易触发 504 错误的地方。如果你有耗时很长的 API(比如导出 Excel 或大数据分析),这个值必须调大
proxy_read_timeout 300; # 读取时间 Nginx 等待后端服务器返回响应数据的最长等待时间;

2.3 配置示例

Markup 全选
server {
  listen 80;
  server_name test.infnitee.com;
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
  return 301 https://$host$request_uri;
}
server {
  listen 443;
  server_name test.infnitee.com;
  ssl_certificate   /etc/letsencrypt/live/test.infnitee.com/fullchain.pem;
  ssl_certificate_key  /etc/letsencrypt/live/test.infnitee.com/privkey.pem;
  #ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
  #ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  #ssl_prefer_server_ciphers on;
  #ssl_session_cache shared:SSL:10m;
  #ssl_session_timeout 10m;
  #add_header Strict-Transport-Security "max-age=31536000";
  #error_page 497  https://$host$request_uri;

   include snippets/common-params.conf; # 一行引入所有通用配置

   location / {
     proxy_pass https://10.8.0.3:443;
     include snippets/proxy-params.conf; # 一行引入所有通用配置
   }
}

三、外网服务器证书更新后自动同步到内网服务器

参考

两台Linux之间自动同步文件-YES开发框架网

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
张国生
上一篇:Rocky编译安装指定版本OpenVPN
下一篇:IL直接修改方法返回true
评论列表

发表评论

评论内容
昵称:
关联文章

nginx内外分流+https证书同步
windows下openssl安装,证书生成,nginx配置https以及http重定向https
nginx反向代理https
nginx配置http自动重定向到https
CentOS7 nginx SSL证书申请并自动续期
SSL证书:Certify工具自动注册并管理免费的 Let's Encrypt Https证书
nginx搭建个私有内cdn
两台Linux之间自动同步文件
nginx初始配置优化
宝塔系统 nginx位置记录
Nginx部署
.net异步Task转同步
windows申请免费ssl证书Let's Encrypt
CentOS安装nginx
nginx websocket支持
nginx配置指南
Rocky Nginx添加端口
Nginx SSE支持
nginx安装为windows服务
windows Nginx配置开机自启动

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码