十二週五次課

十二週五次課php

12.17 Nginx負載均衡
12.18 ssl原理
12.19 生成ssl密鑰對
12.20 Nginx配置ssl
html

12.17 Nginx負載均衡mysql

Nginx負載均衡目錄概要

  • vim /usr/local/nginx/conf/vhost/load.conf // 寫入以下內容

upstream qq_comlinux

{nginx

    ip_hash;web

    server 61.135.157.156:80;算法

    server 125.39.240.113:80;sql

}vim

serverwindows

{

    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

[root@tianqi-01 ~]# yum install -y bind-utils

[root@tianqi-01 ~]# 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

[root@tianqi-01 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,回去訪問默認虛擬主機

[root@tianqi-01 ~]# curl -x127.0.0.1:80 www.qq.com
This is the default site.
[root@tianqi-01 ~]# 

8.測試訪問qq.com

9.檢查配置文件語法,並從新加載

[root@tianqi-01 ~]# /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
[root@tianqi-01 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@tianqi-01 ~]# 

10.這時再來訪問qq.com,會看到的是qq.com的主頁,反饋回來的是網頁的源碼

11.這個就是負載均衡

[root@tianqi-01 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;
    }
}
[root@tianqi-01 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的請求給服務器;
    • 服務器要有一套數字證書,能夠本身製做(後面的操做就是阿銘本身製做的證書),也能夠向組織申請,區別就是本身頒發的證書須要客戶端驗證經過,才能夠繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面,這套證書其實就是一對公鑰(加密)和私鑰(解密);
    • 服務器會把公鑰傳輸給客戶端;
    • 客戶端(瀏覽器)收到公鑰後,(這個過程是瀏覽器判斷的)會驗證其是否合法有效,無效會有警告提醒,有效則會生成一串隨機數,並用收到的公鑰加密;
    • 客戶端把加密後的隨機字符串傳輸給服務器;
    • 服務器收到加密隨機字符串後,先用私鑰解密(公鑰加密,私鑰解密),獲取到這一串隨機數後,再用這串隨機字符串加密傳輸的數據(該加密爲對稱加密,所謂對稱加密,就是將數據和私鑰也就是這個隨機字符串經過某種算法混合在一塊兒,這樣除非知道私鑰,不然沒法獲取數據內容);
    • 服務器把加密後的數據傳輸給客戶端;
    • 客戶端收到數據後,再用本身的私鑰也就是那個隨機字符串解密;

輸入圖片說明

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/目錄下

[root@tianqi-01 ~]# cd /usr/local/nginx/conf/
[root@tianqi-01 conf]# 

3.如果沒有openssl工具,能夠安裝下

4.查看openssl工具是由哪一個安裝包安裝的

[root@tianqi-01 conf]# rpm -qf `which openssl`
openssl-1.0.2k-8.el7.x86_64
[root@tianqi-01 conf]# 

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

[root@tianqi-01 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
[root@tianqi-01 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 表示指定輸出的

[root@tianqi-01 conf]# openssl rsa -in tmp.key -out gurui.key
Enter pass phrase for tmp.key:    //輸入tmp.key的密碼
writing RSA key
[root@tianqi-01 conf]# 

8.這時候tmp.key和gurui.key是屬於同一個

  • tmp.key,有密碼
  • gurui.key,沒有密碼

9.刪除tmp.key

[root@tianqi-01 conf]# rm -f tmp.key
[root@tianqi-01 conf]# 

10.生成證書請求文件,須要拿這個請求文件和私鑰一塊兒生產公鑰文件

[root@tianqi-01 conf]# openssl req -new -key gurui.key -out gurui.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 []:cgjtaiyang@126.com    //郵箱

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456    //設置密碼123456
An optional company name []:    //一個可選的公司名稱

//用請求證書文件和私鑰文件,生成一個公鑰
[root@tianqi-01 conf]# 

  • 這裏的信息能夠不用填寫,直接回車也行

11.由於這是本身給本身頒發的證書,能夠隨意填寫,如果購買那些正式的證書,那證書的信息就須要填寫相對應的信息

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

[root@tianqi-01 conf]# openssl x509 -req -days 365 -in gurui.csr -signkey gurui.key -out gurui.crt
Signature ok
subject=/C=cn/ST=GuangDong/L=ShenZhen/O=cao/OU=cao/CN=tianqi/emailAddress=cgjtaiyang@126.com
Getting Private key
[root@tianqi-01 conf]# 

  • -days 365 證書的日期是一年

13.gui.crt是公鑰,gurui.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

[root@tianqi-01 ~]# 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 gurui.crt;        //指定公鑰
    ssl_certificate_key gurui.key;        //指定私鑰
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    //ssl 的協議
}

保存退出

  • ssl 的協議,通常狀況下,三種協議都配置上

2.建立/data/wwwroot/aming.com目錄

[root@tianqi-01 ~]# mkdir /data/wwwroot/aming.com
[root@tianqi-01 ~]# 

3.檢查配置文件語法

[root@tianqi-01 ~]# /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
[root@tianqi-01 ~]# 

報錯:

  • 由於不知道這個ssl 配置,先前在編譯nginx的時候,並無額外配置支持SSL的參數

[root@tianqi-01 ~]# /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
[root@tianqi-01 ~]# 

解決辦法

  • 從新編譯nginx

4.從新編譯nginx

[root@tianqi-01 ~]# cd /usr/local/src/nginx-1.12.1/
[root@tianqi-01 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
[root@tianqi-01 nginx-1.12.1]# 

  • 編譯的時候須要加上--with-http_ssl_module

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

[root@tianqi-01 nginx-1.12.1]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module

6.編譯make && make install

[root@tianqi-01 nginx-1.12.1]# make && make install

7.查看nginx的編譯參數,會看到增長了--with-http_ssl_module

[root@tianqi-01 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
[root@tianqi-01 nginx-1.12.1]# 

8.檢查配置文件語法錯誤

[root@tianqi-01 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
[root@tianqi-01 nginx-1.12.1]# 

9.重啓nginx

[root@tianqi-01 nginx-1.12.1]# /etc/init.d/nginx restart
Restarting nginx (via systemctl):                          [  OK  ]
[root@tianqi-01 nginx-1.12.1]# 

10.查看監聽端口,會看到多出一個443端口

[root@tianqi-01 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         
[root@tianqi-01 nginx-1.12.1]# 

11.切換目錄路徑,並建立一個測試文件

[root@tianqi-01 nginx-1.12.1]# cd /data/wwwroot/aming.com/
[root@tianqi-01 aming.com]# ls
[root@tianqi-01 aming.com]# vim index.html

This is ssl.

保存退出

12.測試,如果直接訪問會報400,這種狀況不對的

[root@tianqi-01 aming.com]# curl -x127.0.0.1:443 https://aming.com/
curl: (56) Received HTTP code 400 from proxy after CONNECT
[root@tianqi-01 aming.com]# 

13.要直接訪問,在虛擬機中 /etc/寫hosts

[root@tianqi-01 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訪問

[root@tianqi-01 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.
[root@tianqi-01 vhost]# 

  • 就是說你這個證書被標記爲不可信任了,由於這個證書是本身頒發的,可是其實是已經配置成功了

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

192.168.11.136 aming.com

16.瀏覽器訪問aming.com,會看到以下畫面

17.這時查看虛擬機防火牆iptables -nvL,如果防火牆存在,能夠直接ipbables -F清空全部規則,若不想清空全部規則能夠增長443端口的規則

[root@tianqi-01 aming.com]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1057 81940 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           
    2   120 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
  224 33866 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 1113 packets, 174K bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@tianqi-01 aming.com]# iptables -F
[root@tianqi-01 aming.com]# 

18.這時再來訪問https://aming.com,依然會提醒不安全,此時點擊高級,繼續訪問,會出現 如下畫面

19.這個就是本身頒發證書,瀏覽器不被信任的時候,會顯示紅色 不安全 ,而不是綠色

20.之後若想正常的訪問https,能夠去沃通買證書

友情連接:阿銘linux

相關文章
相關標籤/搜索