nginx配置公网与内网访问(域名+内网ip)

打开h5以查看

主站 Nginx 配置(适配全部静态文件,缓存 2 小时)

核心规则说明

  1. 匹配路径:/static/** 全部转发到 B 服务器 IP/static/
  2. 不限文件类型:图片、js、css、字体、视频静态资源全部放行
  3. 浏览器缓存过期:2 小时
  4. Nginx 代理缓存有效期同步 2 小时

一、主站站点配置片段

nginx

复制代码
server {
    listen 443 ssl;
    server_name www.yourdomain.com;
    ssl_certificate cert/xxx.crt;
    ssl_certificate_key cert/xxx.key;

    # 网站主业务
    location / {
        root /www/main;
        index index.html index.htm;
    }

    # 所有 /static/ 下静态资源转发至B服务器
    location /static/ {
        # 替换为你的B服务器IP
        proxy_pass http://B服务器IP/static/;

        # 代理请求头标准配置
        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;

        # Nginx本地代理缓存 2小时
        proxy_cache static_cache;
        proxy_cache_valid 200 304 2h;

        # 浏览器客户端缓存 2小时
        expires 2h;
        add_header Cache-Control "public, max-age=7200";

        # 超时控制
        proxy_connect_timeout 8s;
        proxy_read_timeout 20s;

        # 防盗链(可选,防止别人盗资源)
        valid_referers none blocked server_names *.yourdomain.com yourdomain.com;
        if ($invalid_referer) {
            return 403;
        }
    }
}

二、nginx.conf http 块添加缓存定义

打开 /etc/nginx/nginx.conf,在 http {} 内部加入:

nginx

复制代码
http {
    # 其他原有配置...

    # 静态文件代理缓存目录,提前执行 mkdir -p /var/nginx/cache/static
    proxy_cache_path /var/nginx/cache/static 
        levels=1:2 
        keys_zone=static_cache:100m 
        inactive=4h 
        max_size=20g;
}

参数解释:

  • keys_zone=static_cache:100m:分配 100M 内存存缓存索引
  • inactive=4h:4 小时没人访问自动清理缓存文件(比 2h 长即可)
  • max_size=20g:缓存磁盘最大占用 20G,可按需调整

三、B 服务器 Nginx 配置(提供全部静态文件)

B 无域名,仅 IP 访问,存放所有 /static 静态资源,限制仅主站可访问:

nginx

复制代码
server {
    listen 80;
    server_name _;
    root /data/files; # static文件夹放在这个目录下

    # 所有静态文件统一缓存2小时
    location ~ .* {
        expires 2h;
        add_header Cache-Control "public, max-age=7200";
    }

    # 白名单:只允许主站服务器IP请求,禁止公网直接访问B服务器
    location / {
        allow 主站服务器IP;
        deny all;
    }
}

目录结构示例(B 服务器):

plaintext

复制代码
/data/files/
└── static/
    ├── js/main.js
    ├── css/style.css
    ├── img/1.png
    ├── font/font.ttf
    └── video/demo.mp4

四、操作命令

  1. 创建缓存目录

bash

运行

复制代码
mkdir -p /var/nginx/cache/static
chmod 700 /var/nginx/cache/static
  1. 校验配置并重载

bash

运行

复制代码
nginx -t
systemctl reload nginx

五、路径转发逻辑示例

访问:https://www.yourdomain.com/static/js/app.js 转发至 B 服务器:http://B服务器IP/static/js/app.js

补充说明

  • expires 2h = 浏览器缓存 2 小时,max-age=7200 等价 7200 秒
  • 不限文件后缀,js/css/png/ttf/mp4 等全部支持
  • 代理缓存 2 小时,2 小时内重复请求不会穿透到 B 服务器,减轻 B 服务器压力

如果是单独域名访问:

场景 1:adata.a.comadmin.a.com 共用同一台主站 Nginx(同一个 conf)

只需要在 server_name 把两个域名都写上,原有 /park/static/ 代理配置完全不用改,自动生效。

nginx

复制代码
server {
    listen 80;
    # 两个域名都匹配
    server_name admin.a.com data.a.com;

    # 放在最顶部,不变
    location ^~ /park/static/ {
        add_header X-Hit-ParkStatic "true";
        proxy_pass http://192.168.120.44:8010/static/;
        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;
        proxy_cache static_cache;
        proxy_cache_valid 200 304 2h;
        expires 2h;
        add_header Cache-Control "public, max-age=7200";
        proxy_connect_timeout 8s;
        proxy_read_timeout 20s;
    }

    # 你的其他业务location
    location / {
        root D:/xxx;
    }
}

访问 http://data.a.com/park/static/aa.txt 会自动转发到 B 服务器,路径映射逻辑不变: /park/static/aa.txthttp://192.168.120.44:8010/static/aa.txt

场景 2:data.a.com 单独一台 Nginx、独立配置文件

新建一个站点 server 块,复制一模一样的 /park/static/ 代理规则,只改 server_name

nginx

复制代码
server {
    listen 80;
    server_name data.a.com;

    # 同样放在最顶部
    location ^~ /park/static/ {
        add_header X-Hit-ParkStatic "true";
        proxy_pass http://192.168.120.44:8010/static/;
        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;
        proxy_cache static_cache;
        proxy_cache_valid 200 304 2h;
        expires 2h;
        add_header Cache-Control "public, max-age=7200";
        proxy_connect_timeout 8s;
        proxy_read_timeout 20s;
    }

    # data域名自身业务根目录
    location / {
        root D:/data-project;
    }
}

注意:独立配置文件的 http{} 块里,依然要保留 proxy_cache_path 定义 static_cache,否则启动报错。

额外:如果需要跨域(前端两个域名互相加载静态文件)

/park/static/ 内部增加跨域头,允许两个域名访问资源:

nginx

复制代码
location ^~ /park/static/ {
    # 允许两个域名跨域请求
    add_header Access-Control-Allow-Origin "http://admin.a.com http://data.a.com";
    add_header Access-Control-Allow-Methods GET,OPTIONS;
    if ($request_method = 'OPTIONS') {
        return 204;
    }

    # 下面原有代理配置不变
    add_header X-Hit-ParkStatic "true";
    proxy_pass http://192.168.120.44:8010/static/;
    ...
}

核心不变点

无论用哪个域名访问 /park/static/xxx

  1. 代理转发目标 B 服务器地址不变;
  2. 路径替换逻辑不变;
  3. 缓存、2 小时过期配置完全复用,不用改动。

打开h5以查看