nginx反向代理,nginx负载均衡,配置nginx的ssl

nginx反向代理

  • 机器 b 跟 c 在同一个机房
  • b 有外网,而 c 没有外网
  • b 跟 c 在同一个局域网内
  • 另一台机器 a 若是想访问没有外网的 c 的数据
  • 只能经过有外网的 b 代理访问
  • 也就是 b 访问 c
  • 获得须要的数据后再返回给 a
  • 可是 a 并不知道 b 访问了 c
  • a 只是访问了 b
  • 而后由 b 自动选择应该访问的路线
  • 正向代理跟反向代理的区别
  • a 能够控制 b 的访问路线,指定 b 访问某个服务器
  • 这就是正向代理
  • a 不能够控制 b 的访问路线,只能向 b 提出请求
  • b 本身选择访问路线,完成 a 的请求
  • 这就是反向代理

  • 使用反向代理的场景有
  • 1.访问不带公网的内网机器
  • 2.解决两台机器之间通讯有障碍的问题
  • 首先作一个实验
  • 如图,tom02编辑虚拟机设置,增长一块网卡
  • 如图,新增的网卡选择主机模式
  • 而后打开虚拟机
  • 新增了网卡,须要配置一下ip地址
  • 如图,ifconfig 查看网卡信息
  • ens37就是新增的网卡,能够看到,已经分配了ip
  • ls /etc/sysconfig/network-scripts/
  • 查看网卡配置文件
  • 如图,配置文件里面并无 ens37 的网卡配置文件
  • 如今 ens37 的ip 是自动分配的动态ip
  • 要使用静态ip就须要在这里编辑一个 ens37的配置文件
  • ctrl+a 光标到命令行最左边
  • ctrl+e 光标到命令行最右边
  • cd /etc/sysconfig/network-scripts/ 进入网卡配置文件目录
  • cp ifcfg-ens33 ifcfg-ens37
  • 把ens33配置文件复制一份并命名为ens37
  • 这样就新建了 ens37的配置文件了
  • 而后 vi ifcfg-ens37 编辑内容
  • 如图,把 name device 修改成 ens37
  • ip 地址修改成 192.168.100.100
  • 而后把 dns 和 gateway 两行删除
  • 若是有多个网卡配置文件
  • 只须要其中一个配置了 dns 和 gateway
  • 其它网卡配置文件就不须要这两行配置了
  • ens33已经有了,因此ens37这两行就删除
  • 保存退出
  • systemctl restart network 重启网络
  • 如图,能够看到ens37的ip已经修改成 192.168.100.100
  • 从windows ping 192.168.100.100 发现ping不通
  • 查看虚拟网络编辑器,发现vmware分配的网段是 192.168.174.0
  • 如图,从新修改ip为 192.168.174.100
  • 重启网络,如今就能够 ping通了
  • 这个ip 必须设置为 vmware分配的网段内的ip地址

  • 如图,在虚拟机 tom01 上面
  • 使用命令 scp /etc/yum.repos.d/nginx.repo 192.168.64.130:/etc/yum.repos.d/
  • 这样就把tom01虚拟机上面的 nginx.repo 文件
  • 复制到 tom02虚拟机的 /etc/yum.repos.d/ 目录下了
  • 192.168.64.130是tom02 ens33网卡的ip地址
  • 而后在 tom02 上面安装 nginx
  • 使用 yum install -y nginx 在tom02虚拟机安装nginx
  • cd /etc/nginx/conf.d/ 安装完成就进入配置文件目录
  • 目前只有一个默认虚拟主机配置文件
  • vi default.conf 编辑文件
  • 如图,添加 deny all; 这一行代码
  • 这样就把默认虚拟主机禁掉了
  • 这样默认虚拟主机就不能被访问到了
  • 咱们的目标是经过 tom02机器访问tom01的论坛网站
  • 这里在tom02 conf.d目录下面编辑 tom.bbs.conf 虚拟主机配置文件
server{

    listen 80;
    server_name tom.bbs.com;

        location / {
            proxy_pass http://192.168.64.128;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

}
  • 空白的配置文件内写入以上代码
  • 代码意思是监听 80 端口
  • 虚拟主机名称是 tom.bbs.com
  • location 里面的代码是代理的意思
  • 也就是访问这个虚拟主机
  • 这个虚拟主机会把访问请求转发到真正的目标服务器上去
  • 这个虚拟主机就是一个反向代理的服务器
  • 第一行 http://192.168.64.128 就是转发的地址
  • 192.168.64.128就是真正要访问的服务器的ip地址
  • http:// 表示使用 http协议
  • 下面三行是 header 信息
  • 若是不设置下面三行,目标服务器的访问日志
  • 就没办法记录下真正的访问信息
  • 下面三行表明 主机名称,真实ip,转发ip
  • 转发ip就是代理虚拟主机的 ip
  • 真实 ip 就是真正发出请求的主机的 ip
  • host 就是使用的域名,在配置文件里面定义的server_name
  • 这样目标主机的访问日志里面就会记录
  • 代理主机访问的域名,ip,还有真正发送请求的主机的 ip 等信息
  • 设置好虚拟主机配置文件,如今要启动nginx服务
  • 使用 systemctl start nginx 发现启动不了
  • 直接使用启动文件 /usr/sbin/nginx 启动
  • ps aux | grep nginx 查看服务发现启动成功
  • 而后使用 systemctl restart nginx 重启服务,又发生错误
  • pkill nginx 杀死全部nignx 进程
  • 再使用 systemctl start nginx 启动服务,正常启动
  • 再使用 systemctl restart nginx 重启服务,没有错误
  • 如今nginx 服务正常了
  • 使用 nginx -t && nginx -s reload 检测重载配置文件
  • 由于要使用浏览器访问网站,因此要在windows的host文件里面添加信息
  • 把 192.168.174.100 跟 tom.bbs.com 域名绑定
  • 这样访问这个域名就会解析到 192.168.174.100 的ip地址
  • 由于 tom02 的 nginx 虚拟主机监听的是 80 端口
  • 因此还须要让防火墙放行 80 端口,外部访问才能够经过 80 端口
  • 如图,开放80端口显示 firewalld 服务没有启动
  • 启动防火墙服务
  • 而后在开放 80 端口,返回修改为功信息
  • 如图,修改以后,防火墙须要重载一下
  • 使用 firewall-cmd --reload 重载
  • 下面 iptable -nvL | grep 80 能够查看开放的端口
  • 能够看到有 80 端口,说明这个端口已经开放了
  • 如图,访问 tom.bbs.com 网站,成功访问
  • 由于 host 文件里面并无 把 tom.bbs.com 跟 192.168.64.128 绑定
  • 这个网站其实是在 192.168.64.128 的服务器上面的
  • 可是如今成功访问到了
  • 说明刚才的代理访问设置成功了
  • 使用场景就是,有几台机器没有外网,只有其中一台机器有外网
  • 这几台机器互相之间有局域网连通
  • 那么想要访问没有外网的机器,就须要经过其中有外网的那一台机器
  • 来访问其它没有外网的机器
  • 这时候就能够按照上面的操做,在有外网的机器上面配置反向代理虚拟主机
  • 这样外面的机器就能够经过这个反向代理主机来访问其它没有外网的机器了

nginx负载均衡

  • 负载均衡也是一种反向代理
  • 若是须要反向代理多台机器的时候
  • 就会用到 nginx的负载均衡功能
  • 负载均衡就是把请求均衡的分发到后端的多台机器上去
  • 举例说明
  • 有 a,b,c,d 四台服务器
  • 这四台服务器上的数据是同样的
  • 外面有一个客户端想访问这四台服务器上面的内容
  • 可是这四台服务器是没有外网的
  • 这就须要一台有外网的反向代理服务器 f
  • 外面的客户端访问代理服务器 f
  • f 会把接受的请求均衡的发送到这四台服务器上去
  • 若是有不少的请求同时访问 f
  • f 就能够把这些大量的请求均衡的发给这四台服务器
  • 这样就能够抗住大量访问对于服务器的压力了

  • 要实现这样的效果,须要在反向代理服务器里面的nginx里面配置
  • 假设 tom01 服务器就是反向代理服务器
  • 首先 cd /etc/nginx/conf.d/ 进入nginx配置文件目录
  • vi apelearn.com.conf 编辑一个空的配置文件
upstream apelearn {
	ip_hash;
	server 115.159.51.96:80 weight=100;
	server 47.104.7.242:80 weight=10;
}

server {
	listen 80;
	server_name www.apelearn.com;
	location / {
		proxy_pass http://apelearn;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}
  • 如图,而后保存退出
  • 使用 nginx -t 检测配置文件语法错误
  • 使用 nginx -s reload 重载发生错误,跟 pID 有关
  • 这是由于nginx里面有多个配置文件的时候
  • 机器重启以后不知道应该加载哪一个配置文件
  • 因此须要指定加载的配置文件,才能够启动nginx
  • 使用 nginx -c /etc/nginx/nginx.conf
  • 这样就指定了加载 nginx.conf 配置文件
  • 成功启动 nginx 服务
  • 再使用 nginx -s reload 重载配置文件
  • 如图,要从浏览器访问代理服务器,须要在host绑定 ip 域名
  • 这里 192.168.64.128 是代理服务器的 ip
  • 后面的域名是要访问的网站的域名
  • 这样访问这个域名就会解析到代理服务器的 ip
  • 而后代理服务器就会把访问请求转发到真正对应这个域名的网站服务器去
  • 若是反向代理成功
  • 咱们就能够从浏览器看到这个域名对应的网站内容
  • 如图,访问这个域名,成功转到对应的网站了,说明负载均衡设置成功了
  • 如图,负载均衡配置文件里面的代码
  • 主要分为两个部分
  • 一个是 upstream 另外一个是 server
  • server 就是虚拟主机
  • upstream 就是反向代理的服务器组
  • 访问 www.apelearn.com 虚拟主机
  • 根据server内的代码,访问请求会被代理到 http://apelearn
  • apelearn 是一个名称,表明一个 upstream
  • 这个 upstream 在 server 上面定义了内容
  • ip_hash 的做用是,若是一个 ip 访问了 a 服务器
  • 这个 ip 继续访问代理服务器的时候
  • 代理服务器只会把这个 ip的请求发送给 a 服务器,而不是别的服务器
  • 由于假设 这个ip 在 a 服务器上面登陆了用户名密码
  • 若是代理服务器把 这个ip 后续的请求发送到别的服务器
  • 可是 这个ip 在别的服务器上面并无登陆用户名密码
  • 这显然就会发生错误
  • 为了不这样的错误发生,代码加入 ip_hash
  • 就可让 某个ip 若是访问到 某个服务器
  • 这个ip 后续的请求就只会发送到 这个服务器上去
  • 下面的 server 115.159.51.96:80
  • 就是被反向代理的服务器的 ip和端口号
  • 如图,这里写了两个服务器的 ip和端口
  • 若是有更多服务器要作负载均衡
  • 能够在下面继续添加别的 server 的 ip和端口
  • 访问代理服务器的请求会被均衡的发送给这两个server的其中一个
  • weight=100 表示权重,也就是优先级
  • weight 最大值为 100 最小值为 0
  • 好比这里,第一个server设置了 weight=100
  • 说明权重最大,那么代理服务器的全部请求就会优先发给第一个server
  • 若是第一个server处理不过来了,才会发给第二个 server
  • 利用 weight 就能够设置不一样服务器之间的优先级

配置nginx的SSL

  • nginx访问网站用的是 http 协议
  • 可是 http协议不够安全
  • 有可能会被抓包从而获取用户信息
  • 因此须要一个更安全的协议,就是 https 协议
  • https 协议对于数据包会有更安全的加密措施
  • 防止别人从数据包拿到用户信息
  • 要实现 nginx 使用 https 访问
  • 就须要配置 SSL
  • http 默认使用的是 80 端口
  • https 默认使用的是 443端口
  • 目前使用的 http 版本是 http 1.1 版本
  • 新版本的http是 http 2 版本
  • http 2 默认使用的就是 https 协议
  • 要配置 https 协议
  • 首先作个试验,把论坛网站配置 https 协议链接
  • cd /etc/nginx/conf.d
  • vi tom.bbs.conf 编辑配置文件
  • 如图,要修改的地方主要是图中的几处
  • listen 原本是监听 80 端口的
  • 由于 https 协议默认端口是 443 因此这里改为 443 端口
  • 后面加上 ssl 表示使用 ssl 证书
  • https 对比 http 的主要区别就是能够对传输的数据进行加密
  • 之因此可以进行加密是由于使用了 ssl 证书
  • ssl证书是由权威的机构颁发的,因此具备公信力
  • 权威机构跟大部分浏览器的厂商进行了合做
  • 这些浏览器的厂商都信任颁发证书的权威机构
  • 因此权威机构颁发的证书就是有效的,可信任的
  • ssl 证书的本质就是一对 公钥与私钥
  • 浏览器访问服务器,会使用这对公钥与私钥
  • 还有加密算法对通讯进行加密
  • 因此要使服务器跟浏览器之间进行 https 协议的链接
  • 须要先在权威机构申请 ssl 证书,得到公钥私钥
  • 才可以配置服务器使用 ssl 证书,这样就可使用 https 通讯了
  • 上图中,tomyue.ltd 是在 dnspod 上面购买的一个域名
  • 由于申请ssl证书是须要使用真实域名的
  • 因此须要先在 dnspod 上购买一个真实的域名
  • 才能够用这个域名来申请 ssl 证书
  • 由于是用 tomyue.ltd 域名申请的证书
  • 因此虚拟服务器配置 ssl 证书就必须使用
  • 申请证书时用到的 域名
  • 因此这里服务器域名使用 tomyue.ltd
ssl_certificate /etc/nginx/ssl/tom.ltd.crt;
ssl_certificate_key /etc/nginx/ssl/tom.ltd.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  • 第一行代码是指定使用的 ssl证书公钥
  • 第二行代码是指定使用的 ssl证书私钥
  • 第三行代码是指定使用的 ssl协议的版本号
  • 如图,这是一个申请免费 ssl 证书的网站
  • freessl.org 能够百度找到这个网站
  • ssl 证书有免费有收费的,这里能够申请免费1年的证书
  • 在下面方框输入购买到的真实域名,点击建立证书
  • 这里须要验证域名是不是真实域名
  • 由于只有真实域名,机构才会颁发证书,因此须要验证一下
  • 下面 证书类型就选 rsa
  • 验证类型就选 dns
  • csr生成就选 浏览器生成,或者离线生成也能够
  • 离线生成就须要下载 keymanager 这个软件
  • 才能够保存离线生成的密钥对
  • 浏览器生成就能够才浏览器直接显示密钥对
  • 如图,下面有这些验证信息,须要到注册真实域名的网站上去添加记录
  • 而后再回来验证,验证成功才会颁发证书
  • 好比说个人域名是在 dnspod 买的
  • 就到 dnspod 上面去添加记录
  • 如图,登陆 dnspod 管理本身的域名
  • 点击域名
  • 如图,添加一条记录
  • 主机记录就是 _dnsauth
  • 类型就是 txt
  • 记录值就是 刚才 freessl 那里写的记录值
  • 就是上图中的记录值,复制粘贴到域名记录值这里
  • 而后保存记录
  • 再回到 freessl 网站
  • 点击 点击验证 按钮
  • 等待验证完成
  • 如图,验证完成就会出现这三段信息
  • 这个就是 ssl 证书
  • ca 证书是 根证书,通常不使用
  • 第二段证书是 公钥
  • 第三段证书是 私钥
  • 这三段密钥都复制粘贴保存到 linux 服务器里面去
  • 首先 cd /etc/nginx/ 进入 nginx 目录
  • 而后 mkdir ssl 建立 ssl 目录
  • cd ssl 进入 ssl 目录
  • vi ca 编辑一个叫作 ca 的空文件
  • 而后把 ca 密钥复制粘贴到这里,而后保存退出
  • 如图,按照上面的流程
  • 分别把 公钥复制粘贴到 tom.ltd.crt文件内,保存退出
  • 把 私钥复制粘贴到 tom.ltd.key 文件内,保存退出
  • 这样就服务器内就拥有了 公钥 和 私钥 文件了
  • 保存好这三个密钥文件后,freessl 网站就能够关闭了
  • 如图,配置文件里面,指定的公钥和私钥的文件地址就是刚才建立的文件的地址
  • 而后 nginx -t && nginx -s reload
  • 由于修改了监听端口,因此须要重启一下 nginx 服务
  • systemctl restart nginx
  • 使用 netstat -lntp 查看端口
  • 能够看到 443 端口已经监听了
  • 可是还有一个问题,就是防火墙尚未放行 443 端口
  • 这样的话外面仍是不能访问 443 端口
  • 因此还须要让防火墙放行 443 端口才行
  • firewall-cmd --add-port=443/tcp --permanent
  • 使用以上命名放行 443 端口
  • firewall-cmd --reload 重载防火墙配置
  • 这样刚才的设置才生效
  • 由于尚未在域名配置真实服务器的ip地址
  • 域名指向服务器网站是须要备案的
  • 如今只是进行 ssl 配置的测试
  • 因此不使用 域名 指向服务器的网站
  • 直接到windows 的 host 文件进行修改
  • 把 tomyue.ltd 域名 和 192.168.64.128 ip 进行绑定
  • 而后打开浏览器访问 tomyue.ltd
  • 如图,成功访问网站
  • 链接的协议也是 https
  • 这样表示 ssl 设置是成功的
  • 除了使用浏览器测试
  • 如图,也可使用 curl 来测试 https 是否能够访问网站
相关文章
相关标签/搜索