LNMP架構(三)

12.17 Nginx負載均衡

和簡單的代理不一樣,負載均衡多了一個upstream,在這裏定義後端的Web Server,能夠是一個,也能夠是多個。php

咱們用dig命令查看www.baidu.com域名對應的IP:html

能夠看到兩個IP,這兩個IP均可以訪問到www.baidu.com:nginx

能夠看到兩個IP返回的結果是同樣的,有兩個IP就能夠走負載均衡了,配置過程以下:算法

#vim /usr/local/nginx/conf/vhost/load.confvim

寫入以下內容:後端

upstream baidu_com
{
    ip_hash;
    server 220.181.57.216:80;
    server 123.125.115.110:80;
}

server
{
    listen 80;
    server_name www.baidu.com;

    location /
    {
        proxy_pass      http://baidu_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,能夠是一個,也能夠是多個。其中ip_hash爲負載均衡的算法,它表示根據IP地址把請求分到不一樣的服務器上。下面進行測試:瀏覽器

能夠看到,咱們的虛擬機也能夠訪問www.baidu.com了,這就是代理的做用。另外,nginx不支持代理https。安全


12.18 ssl原理

HTTPS,是一種加密的HTTP協議,若是HTTP通訊的數據包在傳輸過程當中被截獲,咱們能夠破譯這些數據包裏面的信息,這裏面不乏一些用戶名、密碼、手機號等敏感信息。而若是使用HTTPS通訊,即便數據包被截獲,咱們也沒法破譯裏面的內容。服務器

HTTPS的通訊過程大體以下:負載均衡

(1)、瀏覽器發送一個HTTPS請求給服務器。

(2)、服務器要有一套數字證書,能夠本身製做,也能夠向組織申請,區別在於本身頒發的證書須要客戶端驗證經過,才能夠繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面,這套證書其實就是一對公鑰和私鑰。

(3)、服務器會把公鑰傳輸給客戶端。

(4)、客戶端收到公鑰後,會驗證其是否合法有效,無效會有警告提醒,有效則會生成一串隨機字符串,並用收到的公鑰加密。

(5)、客戶端把加密後的隨機字符串傳輸給服務器。

(6)、服務器收到加密隨機字符串後,先用私鑰解密(公鑰加密,私鑰解密),獲取到這一串隨機字符串後,再用這串隨機字符串加密傳輸的數據。

(7)、服務器把加密後的數據傳輸給客戶端。

(8)、客戶端收到數據後,再用本身的私鑰(就是那個隨機字符串)解密。

 


12.19 生產ssl密鑰對

過程以下:

生成兩個文件:公鑰zhangjin.crt和私鑰zhangjin.key。


12.20 Nginx配置ssl

新建配置文件:#vim /usr/local/nginx/conf/vhost/ssl.conf,並寫入如下內容:

server
{
    listen 443;
    server_name zhangjin.com;
    index index.html index.php;
    root /data/nginx/zhangjin.com;

    ssl on;
    ssl_certificate zhangjin.crt;
    ssl_certificate_key zhangjin.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    location ~ \.php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/nginx/aming.com$fastcgi_script_name;
    }
    access_log /tmp/1.log combined_realip;
}

保存文件後,檢查配置是否有問題:

啓動失敗,說明當前的Nginx並不支持ssl,這是由於以前編譯時,並無額外配置支持ssl的參數,解決的方法是從新編譯一遍Nginx:

[root@zhangjin-120:/usr/local/nginx/conf]#cd /usr/local/src/nginx-1.12.1/
[root@zhangjin-120:/usr/local/src/nginx-1.12.1]#./configure --prefix=/usr/local/nginx --with-http_ssl_module
[root@zhangjin-120:/usr/local/src/nginx-1.12.1]#make & make install

編譯完成後,再來檢驗一下:

沒有問題,咱們再建立對應的目錄和測試文件:

[root@zhangjin-120:~]#mkdir /data/nginx/zhangjin.com
[root@zhangjin-120:~]#echo "<?php phpinfo(); ?>" > /data/nginx/zhangjin.com/test.php
[root@zhangjin-120:~]#/etc/init.d/nginx restart
Restarting nginx (via systemctl):                          [  肯定  ]

而後編輯hosts文件,寫入一行:

192.168.6.120 zhangjin.com

用瀏覽器訪問https://zhangjin.com/test.php會提示不安全:


12.21 php-fpm的pool

Nginx能夠配置多個虛擬主機,php-fpm一樣也支持配置多個pool,每個pool能夠監聽一個端口,也能夠監聽一個socket。

咱們把php-fpm.conf配置文件作一個更改:

#vim php-fpm.conf

[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
include = etc/php-fpm.d/*.conf

保存後,再建立配置文件目錄和子配置文件:

[root@zhangjin-120:/usr/local/php-fpm/etc]#vim php-fpm.conf
[root@zhangjin-120:/usr/local/php-fpm/etc]#
[root@zhangjin-120:/usr/local/php-fpm/etc]#mkdir /usr/local/php-fpm/etc/php-fpm.d
[root@zhangjin-120:/usr/local/php-fpm/etc]#cd /usr/local/php-fpm/etc/php-fpm.d/
[root@zhangjin-120:/usr/local/php-fpm/etc/php-fpm.d]#vim www.conf

[www]
listen = /tmp/php-fcgi.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

保存後,再編輯另外的配置文件:

[root@zhangjin-120:/usr/local/php-fpm/etc]#vim php-fpm.conf

[zhangjin]
listen = /tmp/zhangjin.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

保存,這樣就有兩個子配置文件了,也就是說有兩個pool了,第一個pool監聽了/tmp/www.sock,第二個pool監聽了/tmp/zhangjin.sock。這樣,就能夠在Nginx不一樣的虛擬主機中調用不一樣的pool,從而達到相互隔離的目的,兩個pool互不影響。下面來驗證下配置是否有問題:

而後重啓下php-fpm服務:

再來查看/tmp/目錄下面的sock文件:


12.22 php-fpm慢執行日誌

經過php-fpm的慢執行日誌,咱們能夠很是清晰地瞭解到PHP的腳本哪裏執行時間長,它能夠定位到具體的行。

開啓和查看php-fpm的慢執行日誌,操做步驟以下:

#vim /usr/local/php-fpm/etc/php-fpm.d/www.conf

第一行定義超時時間,即PHP的腳本執行時間只要超過1秒就會記錄日誌,第二行定義慢執行日誌的路徑和名字。


12.23 open_basedir

open_basedir的目的就是安全。httpd能夠針對每一個虛擬主機設置一個open_basedir,php-fpm一樣也能夠針對不一樣的pool設置不一樣的open_basedir:

[root@zhangjin-120:/usr/local/php-fpm]#vim /usr/local/php-fpm/etc/php-fpm.d/zhangjin.conf

[zhangjin]
listen = /tmp/zhangjin.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
php_admin_value[open_basedir]=/data/www/:/tmp/ #在最後面加這一行內容

只要在對應的Nginx虛擬主機配置文件中調用對應的pool,就可使用open_basedir來物理隔離多個站點了,從而達到安全的目的。


12.24 php-fpm進程管理

#cat /usr/local/php-fpm/etc/php-fpm.d/www.conf  #查看配置文件內容
pm = dynamic   #定義php-fpm的子進程啓動模式,dynamic爲動態模式;一開始只啓動少許的子進程,根據實際需求,動態地增長或減小子進程,最多不會超過pm.max_children定義的數值。另一種模式爲static,這種模式下的子進程數量由pm.max_children決定,一次性啓動這麼多,不會減小也不會增長。
pm.max_children = 50   
pm.start_servers = 20  #針對dynamic模式,它定義php-fpm服務在啓動服務時產生的子進程數量。
pm.min_spare_servers = 5  #針對dynamic模式,它定義在空閒時段子進程數的最少數量,若是達到這個數值時,php-fpm服務會自動派生新的子進程。
pm.max_spare_servers = 35  #也是針對dynamic模式的,它定義在空閒時段子進程數的最大值,若是高於這個數值就開始清理空閒的子進程。
pm.max_requests = 500  #針對dynamic模式,它定義一個子進程最多處理的請求數,也就是說在一個php-fpm的子進程中最多能夠處理這麼多請求,當達到這個數值時,它會自動退出。
相關文章
相關標籤/搜索