这个文章是nginx代理和负载均衡没有证书的grpc服务的简单介绍:
[不带证书的nginx对不带证书的grpc服务的代理和负载均衡]
(https://blog.csdn.net/Edu_enth/article/details/94750731)
下面是对带安全证书的grpc服务代理和负载的完整介绍,可以直接使用:
一:Nginx和依赖包
Nginx安装包 下载地址:http://nginx.org/en/download.html
OpenSSL SSL协议加密解密的工具包 下载地址:https://www.openssl.org/
PCRE 由c语言编写的正则表达式库 下载地址:http://www.pcre.org/
zlib数据压缩库 下载地址:http://www.zlib.net/
下载完成之后,全部扔到linux中去吧,如果上传文件的过程中出现Access Denied(拒绝访问),看看文件的权限是不是只读的。下面是我的文件目录
二:安装依赖包
注:1. 开始安装前,先说明下如果以下安装的过程中出现了:error: You need a C++ compiler for C++ support.说明你的系统中没有安装c++的编译环境, 使用命令: yum install gcc-c++ 安装即可。(由于系统是新安装的基本啥都没有,后面安装过程出现了此问题)
2. 在执行以下操作时候,最好切换到root权限,避免有时候需要在命令前 重复添加 sudo。 例如 sudo make install
1.先使用命令 tar -zxvf fileName (文件名称)。逐一的解压每个文件,
2.安装OpenSSL
cd到OpenSSL目录内,执行以下命令
./config 生成Makefile文件(这里的是config文件不是Configure)
make 读取Makefile中指令编译
make install 安装到系统中(需要root权限)
3.安装PCRE 和zlib
PCRE 和zlib安装的方式一样,只是和OpenSSL的文件config名称不一样而已
./configure
make
make install
安装完上面的三个依赖包,下面安装我们的正主Nginx
configure arguments: --prefix=/usr/local/nginx --with-pcre=/root/nginxinstall/pcre-8.43 --with-openssl=/root/nginxinstall/openssl-1.1.1c --with-zlib=/root/nginxinstall/zlib-1.2.11 --with-http_ssl_module --with-http_v2_module
注意了,以上的都是解压后的文件夹目录,不是安装后的目录。 当执行完成上的命令,执行下面的命令
编译: make
安装: make install
至此Nginx和依赖包都安装完成,下面试试能否成功启动Nginx
注:如果出现Access Denied(拒绝访问),请使用root权限安装
下面服务基于 带证书的GRPC服务
cd /usr/local/nginx/conf
mkdir ssl
cp ~/goproject/grpcpro/cert/* ssl/
新建一个server,和默认server并列即可
vim nginx.conf
server{
listen 444 default ssl http2;
#证书(公钥.发送到客户端的)
ssl_certificate ssl/server.crt;
#私钥,
ssl_certificate_key ssl/server.key;
location / {
#grpc server的地址,这里有证书使用 grpcs
grpc_pass grpcs://127.0.0.1:50052;
}
}
把
address = "127.0.0.1:50052"
改成
address = "127.0.0.1:444"
先启动grpc server
再启动nginx:
./sbin/nginx
最后执行client,只要结果和 带证书的GRPC服务 这个博客的执行结果一样表示执行可用
负载均衡
只是加了个upstream ,然后把
grpc_pass grpcs://127.0.0.1:50052;
改成
grpc_pass grpcs://backend ;
如下:
vim nginx.conf
upstream backend {
# 把下面的服务端地址和端口改成你自己的
server 127.0.0.1:50052;
server 127.0.0.1:50051;
}
#
server{
listen 444 default ssl http2;
#证书(公钥.发送到客户端的)
ssl_certificate ssl/server.crt;
#私钥,
ssl_certificate_key ssl/server.key;
location / {
grpc_pass grpcs://backend ;
}
}
这样只要下面两个服务有任意一个启用,nameclient就可以执行成功,如果两个都启用,那么client的请求会随机分配给他们两个:
127.0.0.1:50052;
127.0.0.1:50051;
之前nginx对grpc做代理的时候,直接在/ 根地址做了代理,
我们希望/ 根地址有别的用处,对指定服务代理到指定的地址。
那么,
首先我们看proto文件
...
package hello;
service Hello{
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
...
重点就是package和service
我们修改nginx.conf
把
location / {
grpc_pass grpcs://backend ;
}
改成(package.service)
location /hello.Hello {
grpc_pass grpcs://backend ;
}
完整配置
upstream backend {
# 把下面的服务端地址和端口改成你自己的
server 127.0.0.1:50052;
server 127.0.0.1:50051;
}
#
server{
listen 444 default ssl http2;
#证书(公钥.发送到客户端的)
ssl_certificate ssl/server.crt;
#私钥,
ssl_certificate_key ssl/server.key;
location /hello.Hello {
grpc_pass grpcs://backend;
}
}
本文章介绍了nginx对grpc服务的代理,这样,grpc服务就可以不对外暴露端口,而直接使用nginx对外提供访问。具有很高的安全性和可配置性。
这里只是提供了nginx代理的方式,下面的学习可以不基于nginx,因为这样我们的环境会多了nginx这样一个因素,增加了排查错误的难度
这里代理出去的还是grpc服务,不是http服务。不能接收http服务。
# go run client.go
2019/07/09 14:28:39 could not greet: rpc error: code = Unavailable desc = Bad Gateway: HTTP status code 502; transport: received the unexpected content-type "text/html"
exit status 1
这应该是没有可访问的server被nginx代理。查看nginx是否代理成功了server,或者server是否启动
go run client.go
2019/07/09 14:04:49 could not greet: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:444: connect: connection refused"
exit status 1
看下证书配置是否正确