一分钟部署nginx-公网IP访问内网

前言

服务器内网下有nacos cluster(3个节点),开放到公网并指定公司网络访问需要配置三次IP白名单,因此需要简化流程,通过nginx反向代理只配置1次IP白名单。
现在通过docker容器模拟环境,准备1台云服务器。
nacos cluster docker-compose.yaml端口配置如下:

version: "3.0"
# nginx使用到IP和端口,因此部分配置不在此赘述,nacos具体配置参考博主nacos章节
# image:nacos/nacos-server:v2.5.0
# volumes、restart、healthcheck : 略
# environment配置集群模式,采用mysql持久化,mysql配置、java_opts配置 : 略
services:
  nacos1:
    hostname: nacos1
    container_name: nacos1
    environment:
      - NACOS_SERVERS=172.20.0.2:8848 172.20.0.3:8848 172.20.0.4:8848
      - NACOS_SERVER_IP=172.20.0.2
    ports:
      - "8248:8848" # http
      - "9248:9848" # grpc
      - "7248:7848"
      - "9249:9849"
    networks:
      nacos_cluster_network:
        ipv4_address: 172.20.0.2
 
  nacos2:
    hostname: nacos2
    container_name: nacos2
    environment:
      - NACOS_SERVERS=172.20.0.2:8848 172.20.0.3:8848 172.20.0.4:8848
      - NACOS_SERVER_IP=172.20.0.3
    ports:
      - "8348:8848"
      - "9348:9848"
      - "7348:7848"
      - "9349:9849"
    networks:
      nacos_cluster_network:
        ipv4_address: 172.20.0.3
    
  nacos3:
    hostname: nacos3
    container_name: nacos3
    environment:
      - NACOS_SERVERS=172.20.0.2:8848 172.20.0.3:8848 172.20.0.4:8848
      - NACOS_SERVER_IP=172.20.0.4
    ports:
      - "8448:8848"
      - "9448:9848"
      - "7448:7848"
      - "9449:9849"
    networks:
      nacos_cluster_network:
        ipv4_address: 172.20.0.4
        
networks:
  nacos_cluster_network:
    ipam:
       config:
         - subnet: 172.20.0.0/16

Nginx配置

docker-compose.yaml配置

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    restart: always
    ports:
      - "8848:80" # 宿主机的8848端口,容器80端口
    volumes:
      - ./conf/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./conf.d:/etc/nginx/conf.d:ro
      - ./html:/usr/share/nginx/html:ro
      - ./logs:/var/log/nginx
    networks:
      nginx_docker_network:
        ipv4_address: 172.16.0.30 

networks:
  nginx_docker_network:
    external: true
    name: docker_network

nginx的./conf/nginx.conf配置,nginx的conf配置文件,除了{},其他需以;结尾,注释为 #本文只配置公网+内网信息,其他负载均衡、缓存、限流、黑/白名单、静态资源服务、动静分离、防盗链、跨域、高可用参考博主Nginx系列文章。

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include       /etc/nginx/mime.types;  # 引入配置文件
    default_type  application/octet-stream;
    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'; # 设置日志格式,main为格式名称,后面一串为具体
    
    access_log  /var/log/nginx/access.log  main; # 日志目录,引用上面设置的格式main
    
    sendfile        on;
    keepalive_timeout  65;
    client_max_body_size 500m;
    
    include /etc/nginx/conf.d/*.conf; # 引入代理文件,需放在html 范围内
}

设置nacos反向代理配置,./conf.d/nacos_cluster.conf

upstream nacos_http {
    server 172.20.0.2:8848;
    server 172.20.0.3:8848; 
    server 172.20.0.4:8848;
}  


upstream nacos_grpc {
    server 172.20.0.2:9848 max_fails=3 fail_timeout=30s;
    server 172.20.0.3:9848 max_fails=3 fail_timeout=30s;
    server 172.20.0.4:9848 max_fails=3 fail_timeout=30s;
}

 
server {
    listen 80; # 记得是容器的80端口,非宿主机的8848端口
    server_name 117.77.200.222;  # 公网IP或者域名,该服务器已经做过IP白名单,访问无效
    
    location /nacos/ {
        proxy_pass  http://nacos_http/nacos/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # Nacos需要的特殊配置
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 以下是为Nacos Web控制台和API添加的配置
        proxy_connect_timeout 30s;
        proxy_read_timeout 120s;
        proxy_send_timeout 120s;
        
        # 解决WebSocket问题(如果使用2.x版本)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    
    # gRPC服务代理
    location / {
        grpc_pass grpc://nacos_grpc;
        
        # gRPC相关配置
        grpc_connect_timeout 30s;
        grpc_read_timeout 120s;
        grpc_send_timeout 120s;
        
        # 必要的头信息
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 健康检查端点
    location /nacos/actuator/health {
        proxy_pass http://nacos_http/nacos/actuator/health;
        access_log off;
    }
}

验收

在这里插入图片描述
聪明的你也许看出来了:为啥访问的是8848端口,而不是80端口。访问流程分解

浏览器请求 http://117.77.200.222:8848/nacos/ (公网)
  ↓
宿主机防火墙放行8848端口
  ↓
Docker 将宿主机8848端口映射到Nginx容器的80端口
  ↓
Nginx 监听容器内的80端口,收到请求
  ↓
Nginx 根据配置将请求代理到 nacos_http (172.20.0.[2-4]:8848)
  ↓
返回响应数据

参考资料

  1. 3分钟配置好nacos集群(docker compose)
  2. Nginx代理转发Nacos集群:基于Nacos2.0.3版本
  3. 使用nginx代理请求到内网

如遇问题,请留言博主

<think>好的,我现在需要帮用户解决他们的问题,他们想用Python搭建一个网站,但没有域名,想知道用ngrok是否可行,是否需要Nginx。用户可能对网络和服务器不太熟悉,所以需要详细但易懂的解释。 首先,我要确认用户的需求。他们想搭建一个网站,并且能被公网访问,但没有域名。Python可能是他们选择的服务器端语言,比如使用Flask或Django。接下来,用户提到了ngrok,可能听说过这个工具,但不确定如何应用。另外,用户可能对Nginx的作用不太清楚,是否需要用它来配合。 我应该先解释ngrok的功能。Ngrok可以将本地服务器暴露到公网,生成一个临时域名,比如xxx.ngrok.io,这样用户就可以通过这个域名访问本地运行的Python应用。这对于测试和临时展示非常方便,不需要购买域名,也不需要配置复杂的服务器设置。 接下来,是否需要Nginx?用户可能混淆了Nginx的作用。Nginx通常用作反向代理或静态文件服务器,但在这种情况下,如果用户只是想让Python应用能被公网访问,而本地已经运行了Python的Web服务器(如Flask内置的服务器或Gunicorn),那么Ngrok已经足够,不需要Nginx。不过,如果用户需要更稳定的域名、负载均衡或处理静态文件,可能需要Nginx,但根据当前需求,可能暂时不需要。 然后,我需要给出步骤,比如安装ngrok,运行Python应用,然后使用ngrok转发端口。同时提醒用户注意,ngrok的免费域名是临时的,每次重启都会变,如果需要固定域名可能需要付费。此外,安全方面也要注意,因为公开的ngrok链接可能被他人访问到,尤其是测试时可能有敏感数据。 可能用户的问题还包括如何确保Python服务器正确配置,如何处理防火墙或端口问题。比如,确保Python应用监听在正确的端口(如0.0.0.0:5000),而不仅仅是本地回环地址127.0.0.1,否则ngrok可能无法正确转发。 是否需要补充其他工具?比如localtunnel,或者PythonAnywhere这样的托管服务,但用户可能更倾向于自建,所以ngrok是更直接的选择。 最后,总结ngrok的优缺点,让用户明确是否满足需求。如果用户需要长期稳定的服务,可能需要考虑购买域名和云服务器,但当前用ngrok是快速简便的解决方案。</think>当然可以!**即使没有域名,使用 `ngrok` 也能快速将你的本地 Python 网站暴露到公网,无需配置 Nginx**。以下是具体方案和步骤: --- ### **1. 为什么选择 ngrok?** - **核心功能**:`ngrok` 是一个内网穿透工具,能将本地运行的 Web 服务(如 Python 开发的网站)通过一个**临时公网域名**(如 `https://xxx.ngrok.io`)暴露到互联网,无需购买域名或云服务器。 - **适合场景**: - 临时测试、开发调试。 - 快速分享本地网站给他人访问- 验证微信/API回调等需要公网地址的功能。 --- ### **2. 使用 ngrok 的步骤** #### **(1) 安装 ngrok** - 访问 [ngrok官网](https://ngrok.com/),注册后下载对应系统的客户端。 - 解压文件,通过命令行运行(或按官网指引配置 token)。 #### **(2) 编写 Python 网站(以 Flask 为例)** 假设你已安装 Flask(`pip install flask`),创建一个 `app.py`: ```python from flask import Flask app = Flask(__name__) @app.route('/') def home(): return "Hello, 公网访问成功!" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) # 必须监听 0.0.0.0 ``` #### **(3) 启动 Python 网站** ```bash python app.py ``` 此时网站运行在 `http://localhost:5000`(仅本地访问)。 #### **(4) 使用 ngrok 暴露到公网** 在另一个命令行窗口运行: ```bash ngrok http 5000 # 映射本地 5000 端口 ``` ngrok 会生成一个公网域名(如 `https://abcd-123-456.ngrok.io`),**通过这个域名即可公网访问你的网站**! --- ### **3. 是否需要额外配置 Nginx?** - **不需要!** ngrok 直接代理了你的 Python 服务,无需 Nginx 反向代理。但以下情况可能需要 Nginx: 1. **长期生产环境**:ngrok 的免费域名是临时的(重启会变),若需固定域名或 HTTPS,需付费或自建服务。 2. **负载均衡/静态文件优化**:Nginx 可提升性能,但对临时测试无必要。 --- ### **4. 其他替代方案** - **Cloudflare Tunnel**:类似 ngrok,但支持自定义域名和免费 HTTPS。 - **PythonAnywhere**:免费 Python 托管平台,直接部署代码并提供子域名。 - **本地路由器端口转发**:需公网 IP 和配置路由器,适合长期使用但门槛较高。 --- ### **5. 注意事项** - **临时性**:ngrok 免费版的域名每次重启都会变化,付费版可固定。 - **安全性**:公网域名可能被他人扫描到,测试时避免敏感数据。 - **性能**:ngrok 免费版有带宽和连接数限制,高并发场景需升级。 --- ### **总结** - **最快方案**:直接用 `ngrok` 暴露本地 Python 服务,无需域名和 Nginx- **长期方案**:购买云服务器(如阿里云/腾讯云)+ 域名 + Nginx 部署。 试试 ngrok,5 分钟内让你的本地网站被公网访问吧! 🚀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值