折腾负载均衡上搞https的免费ssl证书了几天,写点总结
要看证书配置的直接跳到四,五步吧
一、先看最简单的,安装Nginx
1.添加源
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
2.安装
yum install -y nginx
3.启动服务+开机自启
systemctl start nginx
systemctl enable nginx
4.nginx配置文件所在目录
/etc/nginx/nginx.conf
二、再来看看Nginx怎么实现反向代理
1.DNS直接解析到的服务器,nginx配置文件中加上这段
upstream poxy_server{
server 120.打.码.81;
}
server {
listen 80 ;
server_name ldl.域名.com;
location /{
proxy_pass http://poxy_server;
}
}
2.代理服务器nginx配置文件中加上这段
server {
listen 80;
server_name ldl.域名.com;
root /usr/share/nginx/html;
}
3.两台服务器重新加载nginx配置
nginx -t 检查配置文件
nginx -s reload 重新加载配置文件
4.现在当我们再去访问该域名的时候,就会发现访问的是代理服务器的页面了。
三、负载均衡的实现
多加几台反向代理服务器,DNS解析到的主服务器作为负载均衡器,就算是简单的负载均衡了,配置和原理我说的比较简略,放上前辈写的吧(捂脸) https://www.jianshu.com/p/af6e018b1641
四、acme.sh脚本实现Let’s Encrypt免费ssl证书自动续期
直接放上源码地址,使用说明也还是直接看官方的吧。。。
https://github.com/Neilpang/acme.sh
五、负载均衡上部署ssl证书
1.对於单台负载均衡器来说,我们只要把证书部署到负载均衡器上就行了,也就是DNS解析指向的那台服务器,nginx中443端口如下配置即可(需要注意的是对于没有指定root目录的负载均衡器,直接使用acme.sh的–webroot方式进行验证是访问不到验证文件的,选择acme.sh –issue -d mydomain.com –nginx这种方式即可)
# Settings for a TLS enabled server.
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name www.域名.com;
# root /usr/share/nginx/html;
ssl_certificate "/etc/nginx/证书路径/fullchain.cer"; #这两行配置好ssl证书路径
ssl_certificate_key "/etc/nginx/证书路径/域名.key"; #这两行配置好ssl证书路径
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on; #这里要开启
location / {
proxy_pass http://poxy_server;
}
然后nginx -s reload 一下,域名就可以进行https访问了
2.现在情况是有多台负载均衡器,ssl证书文件验证时会出现访问到其他服务器上的情况,导致无法完成文件根目录验证。由于acme.sh该脚本验证时验证文件会在网站根目录生成一个.well-known目录,验证文件在这个目录里面。
根据这个特性,我们可以使用Nginx的反向代理,让网站访问.well-known目录时,所有负载均衡器都指向到运行acme.sh脚本的那台ssl验证服务器上。
负载均衡器配置如下
upstream ssl_server{
server 120.打.码.81;
}
server {
listen 80 ;
server_name www.域名.com;
location /.well-known {
proxy_pass http://ssl_server;
}
}
这里注意ssl_server的配置,是要加上root的配置的,然后启动acme.sh时用acme.sh –issue -d mydomain.com –webroot /home/wwwroot/ 使用这种直接指定根目录的方式
server {
listen 80 ;
server_name www.域名.com;
root /etc/share/nginx/html; #这里要加上网站根目录配置,否则--webroot方式访问不到验证文件
}
具体配置根据需要更改,只是提供一种思路吧。。。
验证成功获取到证书后,再用scp,rsync之类命令将证书发送到所有负载均衡器服务器上就好。
六、备注一下配置代理时遇到的坑
1.代理时location可以实现对应目录匹配,所有目录都反向代理到web_aserver服务器。如下配置
location /{
proxy_pass http://web_aserver;
}
/.well-known目录代理到ssl_server,如下配置
location /.well-known {
proxy_pass http://ssl_server;
}
2.代理指向有目录的情况,例如
location /.well-known {
proxy_pass http://192.168.1.1/yumin;
}
假设192.168.1.1服务器网站根目录是/etc/html
则当我们访问192.168.1.1/.well-known/token.txt时,所访问的服务器目录为/etc/html/yumin/token.txt
3.代理指向没有目录
location /.well-known {
proxy_pass http://192.168.1.1;
}
假设192.168.1.1服务器网站根目录是/etc/html
则当我们访问192.168.1.1/.well-known/token.txt时,所访问的服务器目录为/etc/html/.well-known/token.txt
ps:配置文件并非完全从服务器上覆制过来的,有部分改动,所以直接复制运行时可能会出现错误
说的可能有点晕,实践一下就明白了吧23333