和簡單的代理不一樣,負載均衡多了一個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。安全
HTTPS,是一種加密的HTTP協議,若是HTTP通訊的數據包在傳輸過程當中被截獲,咱們能夠破譯這些數據包裏面的信息,這裏面不乏一些用戶名、密碼、手機號等敏感信息。而若是使用HTTPS通訊,即便數據包被截獲,咱們也沒法破譯裏面的內容。服務器
HTTPS的通訊過程大體以下:負載均衡
(1)、瀏覽器發送一個HTTPS請求給服務器。
(2)、服務器要有一套數字證書,能夠本身製做,也能夠向組織申請,區別在於本身頒發的證書須要客戶端驗證經過,才能夠繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面,這套證書其實就是一對公鑰和私鑰。
(3)、服務器會把公鑰傳輸給客戶端。
(4)、客戶端收到公鑰後,會驗證其是否合法有效,無效會有警告提醒,有效則會生成一串隨機字符串,並用收到的公鑰加密。
(5)、客戶端把加密後的隨機字符串傳輸給服務器。
(6)、服務器收到加密隨機字符串後,先用私鑰解密(公鑰加密,私鑰解密),獲取到這一串隨機字符串後,再用這串隨機字符串加密傳輸的數據。
(7)、服務器把加密後的數據傳輸給客戶端。
(8)、客戶端收到數據後,再用本身的私鑰(就是那個隨機字符串)解密。
過程以下:
生成兩個文件:公鑰zhangjin.crt和私鑰zhangjin.key。
新建配置文件:#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會提示不安全:
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文件:
經過php-fpm的慢執行日誌,咱們能夠很是清晰地瞭解到PHP的腳本哪裏執行時間長,它能夠定位到具體的行。
開啓和查看php-fpm的慢執行日誌,操做步驟以下:
#vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
第一行定義超時時間,即PHP的腳本執行時間只要超過1秒就會記錄日誌,第二行定義慢執行日誌的路徑和名字。
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來物理隔離多個站點了,從而達到安全的目的。
#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的子進程中最多能夠處理這麼多請求,當達到這個數值時,它會自動退出。