LNMP架构(五)

一 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

扫描二维码关注公众号,回复: 1465807 查看本文章

    在上面的实验中我们查询到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

猜你喜欢

转载自my.oschina.net/u/3746774/blog/1634315