一 Nginx负载均衡
一台代理服务器代理多台web服务器就可以构成负载均衡
1、查询某个域名绑定的几个IP
首先可以使用以下方法查看某个域名对应的IP
# yum install -y bind-utils //如果没有安装dig命令,需要先安装
# dig qq.com //查询qq.com这个域名绑定的IP
# dig ask.apelearn.com //查询ask.apelearn.com这个域名绑定的IP
也可以使用以下方法查看某个域名对应的IP
# ping qq.com //此处反馈的IP不同于前面反馈的IP,
# ping ask.apelearn.com
在上面的实验中我们查询到qq.com的两个IP,下面的实验中我们就使用这两个IP来作为nginx负载均衡服务器的后端连接的WEB服务器IP
2、创建并编辑负载均衡服务器配置文件
# vim /usr/local/nginx/conf/vhost/load.conf
在上述配置文件中加入以下内容:
upstream qq //这里使用到了upstream模块,后面的内容中可以定义多个web服务器ip,qq是upstream的名字,可以随便起
{
ip_hash; //使同一个用户始终保持在一个IP上,否则可能出现同一用户在不同服务器登陆状况不一致的情况
server 61.135.157.156:80; //端口 80时,80可以省略
server 14.17.32.211;
}
server
{
listen 80;
server_name www.qq.com;
location /
{
proxy_pass http://qq; //这里的qq应写的是IP,但因为有多个IP,因此使用的是upstream模块后面跟的名字qq
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3、加载前的对比测试
我们来测试下,在配置文件生效前我们访问www.qq.com的结果
# curl -x127.0.0.1:80 www.qq.com
可以看到访问的结果是访问到了我们自己服务器上的默认页面
4、检查语法错误并重新加载配置文件
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
5、再次测试验证
现在我们再来访问www.qq.com,可以看到结果成功访问到了qq.com
# curl -x127.0.0.1:80 www.qq.com
6、注意点
nginx不支持代理https,也就是说使用nginx作代理服务器时,不能访问后端web服务器的443端口,如果遇到前端用户使用https访问时,可以在代理服务器配置访问web服务器的80端口
二 ssl原理
给数据加密,以防在传输过程被人抓包后盗取信息,如果加密的话,即使被抓包也解密不了
1、请求
浏览器发送一个https的请求给服务器;
2、证书
服务器要有一套数字证书,可以自己制作(后面的操作就是阿铭自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出>提示页面,这套证书其实就是一对公钥和私钥; 公钥用于加密,私钥用于解密
3、传输公钥
服务器会把公钥传输给客户端;
4、浏览器验证公钥合法性并生成随机数串
客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;
5、传输随机字符串
客户端把加密后的随机字符串传输给服务器;
6、加密数据
服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串>通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
7、传输数据
服务器把加密后的数据传输给客户端;
8、解密数据
客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;
三 生产ssl密钥对
我们这里在本机制作一个密钥对
1、安装openssl
# yum install -y openssl-1.0.2k-8.el7.x86_64 //安装openssl命令的包
# rpm -qf `which openssl` //如果安装过的,也可以查看openssl命令是由哪个包安装的
2、切换目录
# cd /usr/local/nginx/conf/ //我们将密钥对存放到这个目录下
3、生成私钥
# openssl genrsa -des3 -out tmp.key 2048
上述命令表达的意思是生成rsa格式的生成长度为2048、名字为tmp.key的私钥
然后输入密码就生成私钥成功
4、取消密码
生成密钥必需要指定密码,但是使用密码很麻烦,我们不能在nginx配置文件中指定密码,每次在浏览器中输入密码不现实,因此需要去掉密码,
# openssl rsa -in tmp.key -out lijie.key //-in指定被转换的密钥文件,-out指定转换后输出的密钥文件,其实转换前后的文件内容是一样的,只是转换前有密码,转换后没有密码
5、删除带密码的密钥文件
# rm -f tmp.key
6、生成证书请求文件
生成证书请求文件,需要拿这个文件和私钥一起生产公钥文件
# openssl req -new -key lijie.key -out lijie.csr
要求输入以下信息:
7、生成公钥
利用上一步生成的证书请求文件来生成公钥
# openssl x509 -req -days 365 -in lijie.csr -signkey lijie.key -out lijie.crt
上述命令表示,证书有效期1年,这里的lijie.crt就是公钥
下面我们可以查询到目前为止已经有3个文件了
四 Nginx配置SSL
1、创建虚拟主机的配置文件
# vim /usr/local/nginx/conf/vhost/ssl.conf
在配置文件中加入以下内容:
server
{
listen 443;
server_name lijie.com;
index index.html index.php;
root /data/wwwroot/lijie.com;
ssl on; //开启ssl,支持https
ssl_certificate lijie.crt; //指定公钥
ssl_certificate_key lijie.key; //指定私钥
ssl_protocols TSLv1 TSLv1.1 TSLv1.2; //指定协议
}
2、创建lijie.com域名对应的目录
# mkdir /data/wwwroot/lijie.com;
3、重新编译nginx使其支持ssl
当我们来测试-t语法错误时,提示第七行的ssl找不到对应的位置:
这是因为我们再编译安装nginx时没有指定支持ssl,只指定了非常简单的安装路径,如下图:
这时我们就需要重新编译nginx的源码包
首先切换到nginx源码包目录下
# cd /usr/local/src/nginx-1.12.1
随后我们可以查看下包含ssl参数的模块有哪些
# ./configure --help |grep -i ssl
其中--with-http_ssl_module就是我们需要加上的模块,接下来我们就来重新编译安装nginx
# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
# make
# make install
4、检查语法错误
# /usr/local/nginx/sbin/nginx -t
5、重启nginx服务
因为重新编译安装过nginx,所有需要重启一下nginx服务
# /etc/init.d/nginx restart
6、检查ssl监听的端口
# netstat -lntp //可以看到443端口已经被监听
7、创建测试文件
# vim /data/wwwroot/lijie.com/index.html
在文件中加入以下内容
8、测试验证
# curl -x127.0.0.1:443 https://lijie.com/
以上这种方法访问是不对的,如果要直接访问,需要像以下这样操作
# vim /etc/hosts //在hosts配置文件中加入下图一行
# curl https://lijie.com/ // 应该使用这种方式访问
上面提示证书不可信任是因为我们的证书是自己颁发的,但实际上是配置成功了的,我们可以在windows上来实验一下
首先需要在windows的host文件中配置,查找host配置文件的路径为C:\Windows\System32\drivers\etc\hosts 并在配置文件中加入虚拟机的IP 及配置ssl访问的网站域名
然后在linux中配置iptables打开443端口的防火墙
# iptables -I INPUT -p tcp --dport 443 -j ACCEPT
或者清空防火墙规则# iptables -F
现在我们到浏览器输入网站https://lijie.com即可访问到网站内容,如果浏览器出现链接不安全,就需要我们收到点击信任链接,即可访问到网站,如下图:
以上是通过我们自己生成证书来访问的情况,在实际生产环境中,我们需要去申请权威证书,比如沃通
推荐链接
针对请求的uri来代理 http://ask.apelearn.com/question/1049
根据访问的目录来区分后端的web http://ask.apelearn.com/question/920
nginx长连接 http://www.apelearn.com/bbs/thread-6545-1-1.html
nginx算法分析 http://blog.sina.com.cn/s/blog_72995dcc01016msi.htm