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"