Nginx反向代理GRPC服务

Nginx代理Gprc服务

编译Nginx

nginx从1.13.10版本开始支持grpc协议的反向代理。本文以目前最新稳定版本的nginx源码为例来实现grpc的反向代理。

  • 执行sudo apt update 更新ubuntu系统

  • 安装依赖包:apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

  • linux下执行wget http://nginx.org/download/nginx-1.26.2.tar.gz下1.26.2版本的nginx源码到本地。

  • 执行tar -zxvf nginx-1.26.2.tar.gz 解压源码。

  • 由于grpc是基于http2的所以编译nginx时需要添加 --with-http_v2_module和--with-stream选项。

  • 在源码目录下执行./configure --with-http_v2_module --with-stream完成编译配置。

  • sudo Make & make install编译安装nginx。默认安装到/usr/local/nginx目录下。

配置Nginx

Nginx配置文件默认存放在/usr/local/nginx/conf目录下,拷贝nginx.conf重命名为grpc.conf。打开grpc.conf修改如下内容:

    #gzip  on;

    server {
        listen       8080;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 

改为:

 http2 on;
    upstream grpc_backend {
            server 192.168.1.100:30034;
            server 192.168.1.101:30000;
            server 192.168.1.102:30036;
    }

    server {
        listen       8000;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        client_max_body_size 1000000000;
        location / {
                grpc_pass   grpc://grpc_backend;
                #grpc_set_header Host $host;
                #grpc_set_header X-Real-IP $remote_addr;
                #keepalive_timeout 300s;
        }

error_page部分直接删掉,因为要使用的是grpc后台服务不是web站点,没有页面可供显示,所以直接删掉。http2 on;表示启用http2协议以支持grpc,grpc就是基于http2的。 upstream grpc_backend里是要反向代理的grpc服务程序的ip地址和端口。 client_max_body_size指定客户端报文最大长度,这里设置的是1G个byte。如果不设置默认是1M,当请求报文或响应报文大于1M时会导致不能正常工作。 location里指定要代理的grpc后端服务。注意这里的grpc_pass表明反向代理的协议是grpc协议。

修改完配置文件后,可以执行 nginx -t -c /usr/local/nginx/grpc.conf 来验证配置文件是否正确,如果有格式错误或语法错误会给出具体错误位置的行号。

启动Nginx

以守护的方式启动Nginx: nginx -c /usr/local/nginx/conf/grpc.conf -g 'daemon off; master_process on;' &

执行netstat -anp|grep 8000查看nginx监听端口是否正常在监听了。如果上面配置的8000端口已经在监听了则可以使用客户端来连接这个地址和端口。

root@hy-pc009:~# netstat -anp|grep 8000
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      12732/nginx: master
tcp        0      0 172.19.169.241:8000     172.19.160.1:59751      ESTABLISHED 13558/nginx: worker

LISTEN表明已在监听。ESTABLISHED表明有客户端连接到了8000端口,这个是我使用客户端连接上来测试的。

如果在nginx允许期间修改了配置文件,则可以通过执行nginx -s reload来重新加载启动时指定的配置文件。

常用命令汇总

  • 启动nginx服务:ngnix -c x.conf -g 'daemon off; master_process on;' &

  • 检查nginx配置是否正确:ngnix -t -c x.conf

  • 修改配置后重新加载配置:nginx -s reload

  • 查看指定端口是否在监听状态:netstat -anp|grep port_number

  • 查看有多少个nginx进程在工作:netstat -antp|grep "nginx: worker"

<think>好的,用户之前问过关于Nginx反向代理Nacos的问题,现在又问了关于Keycloak的。我需要先回顾之前的回答结构,确保保持一致。用户可能是在搭建一套微服务环境,需要配置多个服务反向代理,所以需要清晰的步骤和配置示例。 首先,用户的需求是使用Nginx反向代理Keycloak,可能遇到访问问题,比如页面空白或配置错误。需要分析Keycloak的特点,比如默认端口、必要路径、WebSocket支持等。Keycloak通常运行在8080端口,但可能用户会修改,需要确认。另外,Keycloak可能需要处理CORS和HTTPS,特别是生产环境中的安全配置。 接下来,我需要考虑用户可能的配置错误点。比如端口是否正确,是否启用了SSL,静态资源路径是否正确代理,WebSocket有没有配置。此外,Keycloak的上下文路径可能需要调整,用户可能修改过,导致Nginx配置不匹配。 然后,要整理配置模板,确保包含关键部分,比如静态资源代理、WebSocket支持、gRPC(如果适用)、SSL配置示例。需要提醒用户替换实际域名和后端服务器地址。同时,强调关键配置说明,比如WebSocket的必要性,路径匹配,HTTPS的重要性,以及健康检查等。 还要考虑用户可能遇到的常见问题,比如页面无法加载、WebSocket连接失败、CORS错误、HTTPS重定向问题。给出排查步骤,比如检查Nginx日志,验证端口连通性,浏览器控制台检查等。 最后,补充建议部分需要提醒集群配置、性能调优、安全加固,比如添加访问限制、WAF集成,以及备份配置的重要性。确保用户有一个全面的指南来配置和排查问题。 整个过程中要保持结构清晰,分步骤说明,使用代码块突出配置,让用户容易复制和修改。同时,使用中文口语化表达,避免技术术语过于晦涩,确保用户能理解每一步的目的和操作方法。</think>--- ### 一、Keycloak反向代理核心要点 **Keycloak特性与代理难点:** 1. **默认端口**:HTTP 8080(开发模式) / HTTPS 8443(生产模式) 2. **必要路径**:`/auth`(关键路径,新版本可能调整) `/auth/admin` `/auth/realms` 3. **协议敏感**:需严格保持前端(Nginx)与后端(Keycloak)协议一致 4. **WebSocket依赖**:实时功能需要代理升级协议 --- ### 二、推荐配置模板(基础版) ```nginx server { listen 80; server_name auth.yourdomain.com; # 核心路径代理 location / { proxy_pass http://keycloak-server:8080; # Keycloak后端地址 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; # WebSocket支持(管理控制台需要) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # 健康检查端点 location /health { proxy_pass http://keycloak-server:8080/health; access_log off; } } ``` --- ### 三、生产环境HTTPS增强配置 ```nginx server { listen 443 ssl; server_name auth.yourdomain.com; # SSL证书配置 ssl_certificate /etc/ssl/certs/fullchain.pem; ssl_certificate_key /etc/ssl/certs/privkey.pem; ssl_session_timeout 1d; ssl_protocols TLSv1.2 TLSv1.3; # 强制HTTPS重定向 if ($scheme != "https") { return 301 https://$host$request_uri; } # 代理配置(需同步修改Keycloak服务配置) location / { proxy_pass http://keycloak-server:8080; proxy_set_header X-Forwarded-Proto $scheme; # 必须传递协议类型 # 保持长连接 proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; } } ``` --- ### 四、关键配置说明 1. **协议一致性要求**: - 必须设置 `proxy_set_header X-Forwarded-Proto` - Keycloak会校验请求协议,若Nginx使用HTTPS但未传递该头,会导致重定向循环 2. **上下文路径匹配**: ```nginx # 如果Keycloak修改了context-path(默认无) location /my-auth/ { proxy_pass http://keycloak-server:8080/my-auth/; } ``` 3. **WebSocket超时配置**: ```nginx proxy_connect_timeout 7d; proxy_send_timeout 7d; proxy_read_timeout 7d; ``` --- ### 五、常见问题排查指南 #### 1. 页面无法加载 - **检查点**: ```bash # 验证后端可达性 curl -v http://keycloak-server:8080/auth/realms/master # 查看Nginx错误日志 tail -f /var/log/nginx/error.log | grep -i keycloak ``` #### 2. WebSocket连接失败 - **典型症状**:控制台出现 `WebSocket connection to 'wss://...' failed` - **解决方案**: ```nginx map $http_upgrade $connection_upgrade { default upgrade; '' close; } location / { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } ``` #### 3. CORS错误 - **配置增强**: ```nginx add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; ``` --- ### 六、高级配置建议 1. **集群部署支持**: ```nginx upstream keycloak_cluster { least_conn; server 10.0.0.1:8080; server 10.0.0.2:8080; keepalive 32; } ``` 2. **性能调优**: ```nginx # 缓冲区优化 proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; # 缓存静态资源 location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff2)$ { expires 365d; add_header Cache-Control "public, immutable"; } ``` 3. **安全加固**: ```nginx # 限制管理接口访问 location ~ ^/auth/admin/ { allow 192.168.1.0/24; deny all; proxy_pass http://keycloak-server:8080; } # 隐藏Server头 proxy_hide_header Server; more_clear_headers 'Server'; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值