使用Nginx搭建https代理服务
我们知道反向代理相当于是一个中转站的存在。现在有3台服务器:客户端所在的服务器A、反向代理服务器B、终端服务器C
A想访问C,但是由于C做出了一系列的限制如防火墙之类的,静止了A的IP进行访问,此时A想通过B来请求C,再让B将请求到的数据返回给A。
代理服务器就充当了一个中转站的角色。
此时 C就是B的上游服务;A就是B的下游服务
用Nginx作为反向代理服务有一个用处就是可以做负载均衡。
例如某个网站(假设域名为abc.com,原本只放在一个服务器a)的访问量很高,我可以将项目目录同时放在 a/b/c/d 4台主机,然后再反向代理服务s中做出如下配置:
upstream xxx { #指定上游服务,这里应该是a~d 4台服务器。xxx是名字,可以随便起
# ip_hash;
server a的ip:80;
server b的ip:80;
server c的ip:80;
server d的ip:80;
}
# 上面不只可以写ip,还可以写域名;可以不写端口,默认80端口
# 默认使用轮询的方式分配上游服务(就是分配你访问a/b/c/d哪个服务器),如果使用 ip_hash; 表示对ip进行hash算法来分配上游服务。
server {
server_name abc.com; # 指定域名,记得要在阿里云腾讯云将abc.com这个域名绑定到s这个反向代理服务器上
listen 80;
location / {
proxy_pass http://xxx; #这里的xxx就是上面定义的upstream的名称
}
}
只需在 upstream 代码块中指定多个上游服务(即终端服务),客户端访问反向代理的时候就会将客户端请求分配到多个上游中的一个。从而实现负载均衡,减轻服务器压力。
上面是当上游服务都是http协议的情况。下面做正式的实例操作使用的是https协议的上游服务。
==========================================================
接下来正式开始,由于这里是试验,所以就找3个网站作为上游服务,这3个网站不是相同的。
https://www.forexyj.com/
https://www.yjwaihui.com/
https://www.gold899.com/
注意:上面的3个网站是https的网站,所以反向代理也要设置https,否则访问反向代理的时候会报错的。
1. 给nginx添加ssl模块
cd ~/nginx-1.14.2
make clean
./configure --prefix=/usr/local/nginx --with-http_ssl_module
make
cp ./objs/nginx /usr/local/nginx/sbin -f
# 重启nginx
nginx -s stop && nginx
注意:./configure的时候,使用上一次执行./configure的参数,在此基础上添加--with-http_ssl_module
不要执行make install,不然配置文件会被新安装的nginx覆盖
这里我们也是只替换二进制命令文件nginx
现在nginx已经支持https,接下来进行负载均衡的配置配置文件如下:
upstream forex {
server www.forexyj.com:443;
server www.yjwaihui.com:443;
server www.gold899.com:443;
}
server {
listen 443 ssl; # 让该服务监听443端口
server_name www.zbpblog.com; # 指定域名
# 指定cert文件和key文件的路径
ssl_certificate /var/www/ssl/Apache/2_www.zbpblog.com.crt;
ssl_certificate_key /var/www/ssl/Apache/3_www.zbpblog.com.key;
location / {
# add_header Content-Security-Policy upgrade-insecure-requests;
# 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_pass https://forex; # 这句最重要,表示使用上面指定的上游服务,这样访问www.zbpblog.com才会去访问终端服务。
# 而且这里要注意,一定要写成https://forex不能是http://forex。否则访问的时候会看到报错说:You're speaking plain HTTP to an SSL-enabled server port。
}
重启:
nginx -s stop && nginx
为了防止用nginx -s reload无效,这里使用强制重启。
报错说:bind() to 0.0.0.0:443 failed (98: Address already in use)
这是由于我的Apache中的网站使用了https,因此占用了443端口。
关闭apache服务
service httpd stop
启动nginx:
nginx
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 这三个选项不是必须的
下游服务发送请求反向代理,反向代理请求上游服务器,此时上游服务能获取的是反向代理的ip,但是获取不到下游服务器的ip和相关信息。
使用了这3个选项,反向代理在请求上游服务的时候就可以在header信息中添加下游服务的host,ip这样的信息,让上游服务知道下游客户端的IP。
这里还可以使用代理缓存proxy_cache,他会缓存下你访问过的上游服务的页面,这样的话即使上游服务更改了内容,下游客户端看到的都是缓存时那一刻显示的旧内容,即使上游服务宕机了,访问代理的时候可以将缓存的内容显示给客户端。当然缓存有过期时间,这个在配置可设置。