4.48/49 nginx反向代理
4.50 nginx负载均衡
4.51 配置nginx的ssl
扩展链接: https://github.com/aminglinux/nginx/tree/master/ssl
一、nginx反向代理
什么叫反向代理?
A想要访问C上的网站 A(用户)--> B(在和C同一个机房,并且有公网即外网)--> C(不带公网的机器) A可以访问B,B可以访问C,最终A成功访问到了C,即代理的过程,用B代替A去访问C,B是代理的机器
什么场景会使用反向代理?
1)访问不带公网的内网机器 2)解决两台机器之间通信有障碍的问题
准备工作:
在虚拟机中添加一个仅主机模式的网卡,此时该网卡的IP获取方式是通过DHCP获取的,需要把一个静态的配置文件复制,并改成对应该IP的静态配置文件,GATEWAY和DNS1在一个网卡上配置就可以了,这里删除掉,重启网卡。此时这台机器做为有内网和外网的机器
场景设置:
内网不能连外网。 1)A B 两台机器,其中A只有内网,B有内网和外网 2)A的内网ip是 192.168.78.100,web站点在该机器上 3)B的内网ip是 192.168.78.101, B的外网IP是 192.168.207.128 4)C为客户端,C只能访问B的外网IP,不能访问A或者B的内网IP
需求目的:
C要访问到A内网上的网站,C通过访问B,B访问到了A,最终C访问到了A
启动nginx时,如果报错,/var/run/nginx.pid没有pid,可以使用/usr/sbin/nginx先启动nginx,在使用pkill nginx杀掉nginx进程,在systemctl start nginx启动查看是否正常.
在B机器上编辑虚拟主机配置文件
discuz.tobe.com.conf
server { listen 80; server_name discuz.a.com; #代理的域名,站点的名称 location / { proxy_pass http://192.168.78.100; #此处的ip为后端真正的web服务器的IP,即A的内网IP,B的nginx会去访问这个ip,通过这个ip访问到网站 proxy_set_header Host $host; #设定header信息,代理时的header是什么;proxy_set_header Host就是域名是什么,域名就是$host,$host即server_name proxy_set_header X-Real-IP $remote_addr; # 最后两行为了在日志当中显示源ip(真正的客户端IP)和显示CB两台机器的ip,在访问日志中体现 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 虚拟主机配置文件编辑完成,到windows更改hosts配置文件,把discuz.a.com网站的IP设置为B机器的外网IP:192.168.207.128
并在B机器添加防火墙规则,80端口添加到白名单,然后在到页面访问web站点
firewall-cmd --add-port=80/tcp --permanent 80端口添加到白名单 firewall-cmd --reload 加载设置 iptables -nvL |grep 80 查看规则是否生效
下方的即为header信息
二、nginx负载均衡
参考https://my.oschina.net/u/4093217/blog/3050955
什么是负载均衡?
负载均衡就是,把请求均衡地分发到后端的各个机器上面。 比如,A B C D 四台WEB服务器,现在E要访问这4台服务器,F为Nginx反向代理服务器,可以让F把E的请求均衡地发送到A B C D 4台服务器上。 A B C D请求接收的多少,取决于权重的大小
使用 dig 查看域名; 没有安装可以用yum安装此包:yum install -y bind-utils
在192.168.246.33这台机器上进行配置:
vi apelearn.com.conf
upstream apelearn #upstream定义负载均衡组,在同一个nginx服务器中,不能出现相同的两个upstream名称 { ip_hash; #负载均衡算法 server 115.159.51.96:80 weight=100; #真正的服务器ip地址和端口 #weight=100,权重最高100,最小0 server 47.104.7.242:80; } server { listen 80; server_name www.apelearn.com; location / { proxy_pass http://apelearn; #apelearn即upstream定义的,此处引用 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
到浏览器进行访问,如果跳到https是有问题的,因为代理的是80端口,没有监听443端口,443端口是加密的,在不配置证书的情况下,去访问443端口是不行的。
curl -x47.104.7.242:80 www.apelearn.com -I
curl -x127.0.0.1:80 www.apelearn.com -I
此时可以通过自己的机器能访问该网站。说明设置成功
三、配置nginx的ssl
Nginx的SSL
让Nginx实现用https来访问网站。http是80端口,https是443端口。端口可以定义 https其实就是一种加密的http。
为什么要加密
举例:如果要在网上银行汇款,在你汇款过程当中,你会输入银行卡的密码。如果不加密,这些数据在传输过程中就有可能被人截获。 如果使用了https,那么数据在传输过程中是会加密的。即使抓到了数据包,但是无法破jie出来。
nginx -V 如果编译时没有--with-http_ssl_module这个模块,说明不支持ssl,需要重新编辑安装,yum安装默认是有的
申请证书:
网站:www.wosign.com (沃通) 免费的:freessl.cn 注册freessl.cn账号,输入域名,创建免费的SSL证书,点击创建,创建完成后,需要根据下方生成的验证信息到DNSpod去加一条TXT和记录值的记录
DNSpod:
把对应的txt信息填入进去
设置完成后会生成证书信息,证书、私钥和CA证书,在服务器上创建ssl目录用来存放证书。
xxx.crt文件用来加密,存放证书
xxx.key用来解密,存放私钥
分别创建这两个文件,把生成的证书和私聊拷贝到对应文件中
在虚拟主机中配置:
vim discuz.tobe.com.conf
监听端口改为443 ssl
#ssl on; ssl_certificate /path/to/xxx.crt; ssl_certificate_key /path/to/xxx.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
如果报这个错误,说明nginx 1.15 及以后的版本,不需要再写 ssl on; 了,注释或删除
nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /etc/nginx/conf.d/discuz.tobe.com.conf:4
nginx -t 检查是否有错误
nginx -s reload 重新加载
重启nginx,出现监听443端口
firewall-cmd --add-port=443/tcp --permanent 把443端口添加到白名单 firewall-cmd --reload 重新加载
浏览器上测试:
使用https访问: https://discuz.tobe.com
在另一台机器上,curl访问https: 返回网站信息即成功
curl -k -H "host:discuz.tobe.com" https://192.168.246.128/index.php