前言
服務器內網下有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: nacos1container_name: nacos1environment:- NACOS_SERVERS=172.20.0.2:8848 172.20.0.3:8848 172.20.0.4:8848- NACOS_SERVER_IP=172.20.0.2ports:- "8248:8848" # http- "9248:9848" # grpc- "7248:7848"- "9249:9849"networks:nacos_cluster_network:ipv4_address: 172.20.0.2nacos2:hostname: nacos2container_name: nacos2environment:- NACOS_SERVERS=172.20.0.2:8848 172.20.0.3:8848 172.20.0.4:8848- NACOS_SERVER_IP=172.20.0.3ports:- "8348:8848"- "9348:9848"- "7348:7848"- "9349:9849"networks:nacos_cluster_network:ipv4_address: 172.20.0.3nacos3:hostname: nacos3container_name: nacos3environment:- NACOS_SERVERS=172.20.0.2:8848 172.20.0.3:8848 172.20.0.4:8848- NACOS_SERVER_IP=172.20.0.4ports:- "8448:8848"- "9448:9848"- "7448:7848"- "9449:9849"networks:nacos_cluster_network:ipv4_address: 172.20.0.4networks:nacos_cluster_network:ipam:config:- subnet: 172.20.0.0/16
Nginx配置
docker-compose.yaml配置
services:nginx:image: nginx:latestcontainer_name: nginxrestart: alwaysports:- "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/nginxnetworks:nginx_docker_network:ipv4_address: 172.16.0.30 networks:nginx_docker_network:external: truename: 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; # 日志目錄,引用上面設置的格式mainsendfile 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)↓
返回響應數據
參考資料
- 3分鐘配置好nacos集群(docker compose)
- Nginx代理轉發Nacos集群:基于Nacos2.0.3版本
- 使用nginx代理請求到內網
如遇問題,請留言博主