十二周五次课

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十二周五次课相关的知识,希望对你有一定的参考价值。

12.17 nginx负载均衡

12.18 ssl原理

12.19 生成ssl密钥对

12.20 Nginx配置ssl

12.17 Nginx负载均衡

Nginx负载均衡目录概要

  • vim /usr/local/nginx/conf/vhost/load.conf // 写入如下内容

upstream qq_com

{

    ip_hash;

    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;

        proxy_set_header Host   $host;

        proxy_set_header X-Real-IP      $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

}

  • upstream来指定多个web server

Nginx负载均衡

  • 代理一台机器称为代理 ,代理两台机器就可以称为负载均衡

  • 代理服务器后面可以有多个web服务器,多个web服务器去提供服务的时候,就可以实现一个负载均衡的功能

  • 正常情况下,用户访问web服务器,是一台一台去请求;要么就是指定一个IP,把这域名解析到多台服务器上

  • 案例

    • 用户1 –> web1服务器

    • 用户2 –> web2服务器

    • 假设这时web1服务器挂掉了(宕机),用户1因为解析到了web1,但web1宕机了,所以就无法正常访问;

    • 这时候若是用nginx的负载均衡,在web1宕机后,代理服务器就不会把请求发送给web1,这就是代理的一个优点,负载均衡的优点。

1.配置负载均衡,负载均衡的配置借助了upstream 模块

2.这里将qq.com作为演示对象

  • dig命令查看解析的IP——>yum install -y bind-utils

[[email protected] ~]# yum install -y bind-utils

[[email protected] ~]# dig qq.com

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> qq.com

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9571

;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:

; EDNS: version: 0, flags:; udp: 4096

;; QUESTION SECTION:

;qq.com.                IN    A

;; ANSWER SECTION:

qq.com.            331    IN    A    125.39.240.113

qq.com.            331    IN    A    61.135.157.156

;; Query time: 14 msec

;; SERVER: 119.29.29.29#53(119.29.29.29)

;; WHEN: Thu Mar 15 22:06:46 CST 2018

;; MSG SIZE  rcvd: 67

[[email protected] vhost]# 

3.会看到返回出两个IP,这个就是域名解析,也就是qq.com解析到了两个IP上

4.这时候就可以用这两个125.39.240.113IP和61.135.157.156IP,去做负载均衡

5.写一个配置文件vim /usr/local/nginx/conf/vhost/load.conf

//写入以下内容

upstream qq_com    //upstream后的名称自定义

{

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

    server 61.135.157.156:80;    //如果域名解析端口是80,这段配置上的指定端口80是可以省略的

    server 125.39.240.113:80;

}

server

{

    listen 80;    //定义监听端口

    server_name www.qq.com;    //域名

    location /

    {

        proxy_pass      http://qq_com;    //这里填写的是upstream 的名字

        即“http://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;

    }

}

保存退出

6.upstream来指定多个web server

  • 当有多个服务器同时对一个域名提供服务的时候,长时间访问一个域名,在一定的时效内,会出现需要重新登录或者是说跳转到另外一个地址的服务器上;ip_hash,就是使通过这个代理访问的同一个域名的多个IP的服务器时,始终保持在一个IP上对这个域名进行访问。

7.在未加载配置的时候,本机去访问qq.com,回去访问默认虚拟主机

[[email protected] ~]# curl -x127.0.0.1:80 www.qq.com

This is the default site.

[[email protected] ~]# 

8.测试访问qq.com

9.检查配置文件语法,并重新加载

[[email protected] ~]# /usr/local/nginx/sbin/nginx -t

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[[email protected] ~]# /usr/local/nginx/sbin/nginx -s reload

[[email protected] ~]# 

10.这时再来访问qq.com,会看到的是qq.com的主页,反馈回来的是网页的源码

11.这个就是负载均衡

[[email protected] vhost]# cat load.conf

upstream qq_com

{

    ip_hash;

    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;

        proxy_set_header Host   $host;

        proxy_set_header X-Real-IP      $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

}

[[email protected] vhost]# 

nginx代理和负载均衡的知识点

  • nginx不支持去代理https,也就是在配置文件中的server后不能写:443,是不支持的,只能代理http、tcp

  • 若想要实现代理https,nginx监听443端口,但web服务必须是80端口

12.18ssl原理

ssl原理

  • https的相关知识点

  • 要配置nginx和https,就需要首先去了解https是什么?

  • 在访问一些网站的时候,会自动加上了https前标

  • http和https的区别

    • https通信是加密的,如果不加密,中间传输数据包的有时候会被截到,就会导致信息泄露,https就是对这个通信的数据包进行加密

  • SSL工作流程

    • 浏览器发送一个https的请求给服务器;

    • 服务器要有一套数字证书,可以自己制作(后面的操作就是阿铭自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥(加密)和私钥(解密);

    • 服务器会把公钥传输给客户端;

    • 客户端(浏览器)收到公钥后,(这个过程是浏览器判断的)会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机字符串(字符串1),并用收到的公钥加密;

    • 客户端把加密后的随机字符串(字符串2)传输给服务器;

    • 服务器收到加密随机字符串(字符串2)后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机字符串(字符串1)后,再用这串随机字符串(字符串1)加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);

    • 服务器把加密后的数据传输给客户端;

    • 客户端收到数据后,再用自己的私钥(字符串1)也就是那个随机字符串解密;

技术分享图片

12.19 生成ssl密钥对

生成ssl密钥对目录概要

? cd /usr/local/nginx/conf

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

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

? rm -f tmp.key

? openssl req -new -key aminglinux.key -out aminglinux.csr//生成证书请求文件,需要拿这个文件和私钥一起生产公钥文件

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

? 这里的aminglinux.crt为公钥

生成ssl密钥对

在自己的虚拟机生成ssl 需要用到openssl工具

  • 在虚拟上颁发一套证书(就是一套公钥和私钥),生成ssl,

1.首先得有一个openssl工具

2.切换到/usr/local/nginx/conf/目录下

[[email protected] ~]# cd /usr/local/nginx/conf/

[[email protected] conf]# 

3.若是没有openssl工具,可以安装下

4.查看openssl工具是由哪个安装包安装的

[[email protected] conf]# rpm -qf `which openssl`

openssl-1.0.2k-8.el7.x86_64

[[email protected] conf]# 

5.生成一个私钥,命令openssl genrsa -des3 -out tmp.key 2048

[[email protected] conf]# openssl genrsa -des3 -out tmp.key 2048

Generating RSA private key, 2048 bit long modulus

...........................................................................+++

.+++

e is 65537 (0x10001)

Enter pass phrase for tmp.key:    //输入密码123456

Verifying - Enter pass phrase for tmp.key:    //再次输入密码123456

[[email protected] conf]# 

  • openssl genrsa -des3 -out tmp.key 2048

    • genrsa ,表示生成rsa格式的私钥

    • 2048 ,2048长度

    • 名字为 tmp.key

  • 生成这个秘钥必须要有密码

6.在生成这个秘钥后比较麻烦,在nginx的配置文件里指定密码,每次访问浏览器,在https这个网址输入这个密码会很不方便,所以还需要去除这个密码

7.转换key,取消密码,命令 openssl rsa -in tmp.key -out gurui.key

  • -in 表示指定哪一个秘钥要被转换

  • -out 表示指定输出的

[[email protected] conf]# openssl rsa -in tmp.key -out tianqi.key

Enter pass phrase for tmp.key:    //输入tmp.key的密码

writing RSA key

[[email protected] conf]# 

8.这时候tmp.key和tianqi.key是属于同一个私钥

  • tmp.key,有密码

  • tianqi.key,没有密码

9.删除tmp.key

[[email protected] conf]# rm -f tmp.key

[[email protected] conf]# 

10.生成证书请求文件,需要拿这个请求文件和私钥一起生成公钥

[[email protected] conf]# openssl req -new -key tianqi.key -out tianqi.csr

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [XX]:cn    //国家,2个字母

State or Province Name (full name) []:GuangDong    //省或州

Locality Name (eg, city) [Default City]:ShenZhen    //城市

Organization Name (eg, company) [Default Company Ltd]:cao    //公司

Organizational Unit Name (eg, section) []:cao    //组织

Common Name (eg, your name or your server's hostname) []:tianqi    //您的主机名

Email Address []:[email protected]    //邮箱

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:123456    //设置密码123456

An optional company name []:    //一个可选的公司名称

//用请求证书文件和私钥,生成一个公钥

[[email protected] conf]# 

  • 这里的信息可以不用填写,直接回车也行

11.因为这是自己给自己颁发的证书,可以随意填写,若是购买那些正式的证书,那证书的信息就需要填写相对应的信息

12.生成公钥,命令openssl x509 -req -days 365 -in tianqi.csr -signkey tianqi.key -out tianqi.crt

[[email protected] conf]# openssl x509 -req -days 365 -in tianqi.csr -signkey tianqi.key -out tianqi.crt

Signature ok

subject=/C=cn/ST=GuangDong/L=ShenZhen/O=cao/OU=cao/CN=tianqi/[email protected]

Getting Private key

[[email protected] conf]# 

  • -days 365 证书的日期是一年

13.tianqi.crt是公钥,tianqi.key是私钥

12.20 Nginx配置ssl

  • 在有了公钥和私钥之后,配置nginx

?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_certificate aminglinux.crt;

    ssl_certificate_key aminglinux.key;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

}

? -t && -s reload //若报错unknown directive “ssl” ,需要重新编译nginx,加上--with-http_ssl_module

? mkdir /data/wwwroot/aming.com

? echo “ssl test page.”>/data/wwwroot/aming.com/index.html

? 编辑hosts,增加127.0.0.1 aming.com

? curl https://aming.com/

1.生成新的配置文件 vim /usr/local/nginx/conf/vhost/ssl.conf

[[email protected] ~]# vim /usr/local/nginx/conf/vhost/ssl.conf

添加以下内容

server

{

    listen 443;    //监听端口为443

    server_name aming.com;    //主机名

    index index.html index.php;    

    root /data/wwwroot/aming.com;    //root 目录

    ssl on;                    //开启ssl

    ssl_certificate tianqi.crt;        //指定公钥

    ssl_certificate_key tianqi.key;        //指定私钥

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    //ssl 的协议

}

保存退出

  • ssl 的协议,一般情况下,三种协议都配置上

2.创建/data/wwwroot/aming.com目录

[[email protected] ~]# mkdir /data/wwwroot/aming.com

[[email protected] ~]# 

3.检查配置文件语法

[[email protected] ~]# /usr/local/nginx/sbin/nginx -t

nginx: [emerg] unknown directive "ssl" in /usr/local/nginx/conf/vhost/ssl.conf:7

nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

[[email protected] ~]# 

报错:

  • 因为不知道这个ssl 配置,先前在编译nginx的时候,并没有额外配置支持SSL的参数

[[email protected] ~]# /usr/local/nginx/sbin/nginx -V

nginx version: nginx/1.12.1

built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) 

configure arguments: --prefix=/usr/local/nginx

[[email protected] ~]# 

解决办法

  • 重新编译nginx

4.重新编译nginx

[[email protected] ~]# cd /usr/local/src/nginx-1.12.1/

[[email protected] nginx-1.12.1]# ./configure --help |grep -i ssl

  --with-http_ssl_module             enable ngx_http_ssl_module

  --with-mail_ssl_module             enable ngx_mail_ssl_module

  --with-stream_ssl_module           enable ngx_stream_ssl_module

  --with-stream_ssl_preread_module   enable ngx_stream_ssl_preread_module

  --with-openssl=DIR                 set path to OpenSSL library sources

  --with-openssl-opt=OPTIONS         set additional build options for OpenSSL

[[email protected] nginx-1.12.1]# 

  • 编译的时候需要加上--with-http_ssl_module

5.初始化./configure --prefix=/usr/local/nginx --with-http_ssl_module

[[email protected] nginx-1.12.1]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module

6.编译make && make install

[[email protected] nginx-1.12.1]# make && make install

7.查看nginx的编译参数,会看到增加了--with-http_ssl_module

[[email protected] nginx-1.12.1]# /usr/local/nginx/sbin/nginx -V

nginx version: nginx/1.12.1

built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) 

built with OpenSSL 1.0.2k-fips  26 Jan 2017

TLS SNI support enabled

configure arguments: --prefix=/usr/local/nginx --with-http_ssl_module

[[email protected] nginx-1.12.1]# 

8.检查配置文件语法错误

[[email protected] nginx-1.12.1]# /usr/local/nginx/sbin/nginx -t

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[[email protected] nginx-1.12.1]# 

9.重启nginx

[[email protected] nginx-1.12.1]# /etc/init.d/nginx restart

Restarting nginx (via systemctl):                          [  OK  ]

[[email protected] nginx-1.12.1]# 

10.查看监听端口,会看到多出一个443端口

[[email protected] nginx-1.12.1]# netstat -lntp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4439/nginx: master  

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      807/sshd            

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1049/master         

tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      4439/nginx: master  

tcp6       0      0 :::22                   :::*                    LISTEN      807/sshd            

tcp6       0      0 ::1:25                  :::*                    LISTEN      1049/master         

tcp6       0      0 :::3306                 :::*                    LISTEN      1029/mysqld         

[[email protected] nginx-1.12.1]# 

11.切换目录路径,并创建一个测试文件

[[email protected] nginx-1.12.1]# cd /data/wwwroot/aming.com/

[[email protected] aming.com]# ls

[[email protected] aming.com]# vim index.html    //创建一个测试文件

This is ssl.

保存退出

12.测试,若是直接访问会报400,这种情况不对的

[[email protected] aming.com]# curl -x127.0.0.1:443 https://aming.com/

curl: (56) Received HTTP code 400 from proxy after CONNECT

[[email protected] aming.com]# 

13.要直接访问,在虚拟机中 /etc/写hosts

[[email protected] aming.com]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

127.0.0.1 www.123.com www.0000000.com www.8888.com aming.com

192.168.11.136   www.123.com

14.测试,不指定-x访问

[[email protected] aming.com]# curl https://aming.com/

curl: (60) Peer's certificate issuer has been marked as not trusted by the user.

More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"

 of Certificate Authority (CA) public keys (CA certs). If the default

 bundle file isn't adequate, you can specify an alternate file

 using the --cacert option.

If this HTTPS server uses a certificate signed by a CA represented in

 the bundle, the certificate verification probably failed due to a

 problem with the certificate (it might be expired, or the name might

 not match the domain name in the URL).

If you'd like to turn off curl's verification of the certificate, use

 the -k (or --insecure) option.

[[email protected] vhost]# 

  • 就是说你这个证书被标记为不可信任了,因为这个证书是自己颁发的,但是实际上是已经配置成功了

15.在windows中的host文件添加,并保存

192.168.11.136 www.abc.com www.123.com 111.com aming.com

16.浏览器访问aming.com,会看到加载超时

17.这时查看虚拟机防火墙iptables -nvL,若是防火墙存在,可以直接ipbables -F清空所有规则,若不想清空所有规则可以增加443端口的规则

[[email protected] aming.com]# iptables -nvL

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination         

 4561 6712K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           

    4   240 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           

    1    52 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22

   33  3501 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination         

    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 4142 packets, 1003K bytes)

 pkts bytes target     prot opt in     out     source               destination         

[[email protected] aming.com]# iptables -F

[[email protected] aming.com]# 

18.这时再来访问https://aming.com,会提醒不安全;若想继续访问,点击高级,继续前往即可

技术分享图片技术分享图片

技术分享图片

19.这个就是自己颁发证书,浏览器不被信任的时候,会显示红色不安全 ,而不是绿色的

20.以后若想正常的访问https,可以去沃通买证书

技术分享图片技术分享图片


以上是关于十二周五次课的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习笔记十二周五次课(4月27日)

2018.3.16 12周5次课

十四周五次课

十五周五次课

七周五次课(1月26日)

?十四周五次课(3月30日)