笔记内容:

  • 12.17 Nginx负载均衡

  • 12.18 ssl原理

  • 12.19 生成ssl密钥对

  • 12.20 Nginx配置ssl

笔记日期:2017-10-24


12.17 Nginx负载均衡

2680

关于负载均衡实际上和上一篇末尾讲的代理服务器的概念差不多,代理一台机器,叫做代理服务器,代理多台机器就叫做负载均衡。

使用负载均衡是为了将多个用户的请求均匀的发送给多台web服务器,如果没有负载均衡的话,用户A访问web服务器A时,web服务器A宕机了,那么用户A的访问请求就不会被处理,而有负载均衡的话,负载均衡会把用户A的访问请求发送给其他的web服务器去进行处理。

在配置负载均衡前先介绍一个命令:dig

安装命令:

yum -y install bind-utils


dig是用来进行域名解析的,例如我解析qq.com这个域名,使用dig能够反馈更多的解析信息:

2681


现在我们开始配置负载均衡,新建一个虚拟主机配置文件:

vim /usr/local/nginx/conf/vhost/ld.conf


增加以下内容,我拿解析到qq.com的ip来当服务器做这个实验:

upstream qq_com  //upstream是一个模块,需要使用它来定义多个IP

{

   ip_hash;   //ip_hash是为了让同一个用户始终保持在同一个机器上

//定义两个服务器的ip,qq.com解析出来的ip

   server 61.135.157.156:80;

   server 125.39.240.113:80;

}

server

{

   listen 80;  //定义监听端口

   server_name www.qq.com;  //定义域名

   location /

   {

       proxy_pass      http://qq_com;  //upstream的名称,这个名称代表着upstream里定义的ip

       proxy_set_header Host   $host;

       proxy_set_header X-Real-IP      $remote_addr;

       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

   }

}

2682


编辑完之后保存退出,先不要重新加载配置文件,先测试一下用本机ip去访问www.qq.com这个域名看看结果会是什么:

2683


这时我们重新加载配置文件,再访问一次看看:

2684

可以看到能够访问到www.qq.com,并输出了这个页面的html源码,这个就是负载均衡。


关于Nginx负载均衡方面要注意一点:

Nginx不支持直接代理https,只能代理http,也就是说443端口不支持只支持80端口。如果非要代理https,只能是用户访问Nginx代理服务器时使用https,然后Nginx去访问后端的web服务器时使用http,属于折中的一种方式,依然不能直接代理。








12.18 ssl原理

https就是使用ssl加密的http,是一种加密的超文本传输协议。如果http不加密的话,被人抓包或监听了数据包,就能很轻易地看到数据包里面的数据内容,那样的话你的信息就泄露了。

如果使用的是https协议,那么你的数据包就会被加密,即便被人抓包了,也没有那么轻易破解加密算法,因为数据包只能使用服务器上的私钥解密,而服务器根本不会在任何情况下发送私钥,想要不通过私钥来直接破解数据包几乎是不可能的。

具体流程如图:

2685





12.19 生成ssl密钥对

2686

理解了ssl原理后,现在我们可以在虚拟机上去生成ssl密钥对,也就是自己制作证书。我们需要使用一个工具来生成密钥对,把密钥对放在nginx的conf目录下。

进入nginx的conf目录:

cd /usr/local/nginx/conf


我们需要使用到的工具是openssl,如果你虚拟机没有此命令,需要自己安装,安装命令:

yum -y install openssl


准备完成后,第一步是生成一个私钥,命令如下:

openssl genrsa -des3 -out tmp.key 2048    //key文件为私钥

2687

第二步,是把密码取消掉,如果不取消的话,会每次都要求客户端输入此密码,命令如下:

openssl rsa -in tmp.key -out aminglinux.key   //转换key,取消密码

2688

实际上这时候aminglinux.key和tmp.key是同一个文件,只不过前者有密码,后者没密码。


这时候就可以把tmp.key给删掉了:

rm -f tmp.key


第三步就是去生成一个请求的文件,生成这个请求文件的目的是为了让这个请求文件和私钥一起去生成一个公钥,命令如下,会要求你输入一些信息,因为是自己制作的证书所以随便输入也是可以的,如果是正式的证书就不可以随便写了:

openssl req -new -key aminglinux.key -out aminglinux.csr

2689


第四步就是生成公钥了,命令如下:

openssl x509 -req -days 365 -in aminglinux.csr -signkey aminglinux.key -out aminglinux.crt

2691


现在我们的证书就制作完成了,可以看到有这样的三个文件:

2692







12.20 Nginx配置ssl

2693

我们生成好密钥对也就是证书之后,就可以使用Nginx配置SSL了。

先创建一个目录:

mkdir /data/wwwroot/aming.com


然后创建一个文件:

vim /usr/local/nginx/conf/vhost/ssl.conf


加入以下内容:

server

{

   listen 443;

   server_name aming.com;

   index index.html index.php;

   root /data/wwwroot/aming.com;

   ssl on;  //定义开启ssl

   ssl_certificate aminglinux.crt;  //指定公钥

   ssl_certificate_key aminglinux.key;  //指定私钥

   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  //定义协议

}


然后保存退出,测试一下配置文件:

2694

如图可以看到报错了,这是因为我编译Nginx的时候没有指定这个参数,所以Nginx它不知道ssl是啥没有找到这玩意。

所以我要去重新编译一下Nginx,所以说源码包不要删除,后期增加一些配置的时候会用到:

cd /usr/local/src/nginx-1.12.1

./configure --prefix=/usr/local/nginx --with-http_ssl_module

make && make install


重新编译安装后再测试一下配置文件,现在就没问题了:

2695


重启nginx :

/etc/init.d/nginx restart


查看监听端口可以发现监听了443端口:

2696


现在就可以进入一开始创建的那个目录下:

cd /data/wwwroot/aming.com


然后创建一个测试文件:

vim index.html

文件内容如下:

This is sll test.


往hosts里添加aming.com:

2697


然后使用curl访问https://aming.com/

curl https://aming.com/

2698


我们可以使用windows上的浏览器看一下:

先编辑一下hosts文件,文件路径为:

C:\Windows\System32\drivers\etc

2699


然后先临时清空Linux上的防火墙规则,命令如下:

iptables -F


完成以上操作后,才能够使用浏览器访问:

2700

可以看到这个警告,但是我们可以点击“高级”里的“继续前往”即可访问:

2701


可以看到页面上出现了我们创建的index.html文件里的内容:

2702


想要没有这些警告的话,可以自己去买正规受信任的证书。我们可以访问https://www.12306.cn看看,相信这个网站大家都不陌生,访问它的https也是会有警告:

2703

这不是因为政府没钱买证书,而是不相信那些外部购买的证书,所以使用自己内部颁发的证书。

因此可以知道,显示这个警告的原因仅仅是因为浏览器没有认可这个证书,并非是真的不安全。





扩展

针对请求的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.html