第十二章、LNMP架構(下)
阿新 • • 發佈:2018-09-27
size 名單 con proto 反向代理 asc -h 公司 所有 12.17 Nginx負載均衡
12.18 ssl原理
12.19 生成ssl密鑰對
12.20 Nginx配置ssl
12.21 php-fpm的pool
12.22 php-fpm慢執行日誌
12.23 open_basedir
12.24 php-fpm進程管理
12.25擴展
12.17 Nginx負載均衡
編輯配置虛擬主機文件
? vim /usr/local/nginx/conf/vhost/load.conf
# 寫入如下內容:
upstream qq_com
#upstream名字自定義
{
ip_hash;
#ip_hash這一行的目的是讓同一個用戶始終保持在同一臺機器上
server 61.135.157.156:80;
server 125.39.240.113:80;
}
#server如果不指定端口號,默認80端口
server
{
listen 80;
server_name www.qq.com;
location /
{
proxy_pass http://qq_com;
#這裏寫的是upstream的名字
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
yum install -y bind-utils #安裝dig命令
#dig命令可以查看域名解析到什麽ip地址
用法:dig 域名
dig qq.com
#nginx不支持代理https(端口號443)
12.18 ssl原理
https與http的區別:
https通信是加密的,防止數據傳輸過程中被泄露
SSL工作流程:
1、瀏覽器發送一個https的請求給服務器;
2、服務器要有一套數字證書,可以自己制作(後面的操作就是阿銘自己制作的證書),也可以向組織申請,區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用受信任的公司申請的證書則不會彈出>提示頁面,這套證書其實就是一對公鑰和私鑰;
3、 服務器會把公鑰傳輸給客戶端;
4、 客戶端(瀏覽器)收到公鑰後,會驗證其是否合法有效,無效會有警告提醒,有效則會生成一串隨機數,並用收到的公鑰加密;
5、客戶端把加密後的隨機字符串傳輸給服務器;
6、 服務器收到加密隨機字符串後,先用私鑰解密(公鑰加密,私鑰解密),獲取到這一串隨機數後,再用這串隨機字符串加密傳輸的數據(該加密為對稱加密,所謂對稱加密,就是將數據和私鑰也就是這個隨機字符串>通過某種算法混合在一起,這樣除非知道私鑰,否則無法獲取數據內容);
7、服務器把加密後的數據傳輸給客戶端;
8、 客戶端收到數據後,再用自己的私鑰也就是那個隨機字符串解密;
12.19 生成ssl密鑰對
rpm -qf `which openssl` #查看openssl是什麽包安裝的
一、生成私鑰,設置密碼,保存到/usr/local/nginx/conf目錄下
? cd /usr/local/nginx/conf
? openssl genrsa -des3 -out tmp.key 2048
#genrsa表示類型為rsa,tmp.key是私鑰的名字,2048是密鑰長度
#key文件為私鑰
[root@xinlinux-03 vhost]# cd /usr/local/nginx/conf
[root@xinlinux-03 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:
Verifying - Enter pass phrase for tmp.key:
二、轉換key,取消密碼,刪掉原來key
? openssl rsa -in tmp.key -out xin.key
#-in 指定密鑰轉換文件,-out 指定輸出的文件
? rm -f tmp.key
[root@xinlinux-03 conf]# openssl rsa -in tmp.key -out xin.key
Enter pass phrase for tmp.key:
writing RSA key
[root@xinlinux-03 conf]# rm -f tmp.key
三、生成證書請求文件
? openssl req -new -key xin.key -out xin.csr
四、通過請求文件和私鑰一起生產公鑰文件
? openssl x509 -req -days 365 -in xin.csr -signkey xin.key -out xin.crt
# 這裏的xin.crt為公鑰
[root@xinlinux-03 conf]# openssl x509 -req -days 365 -in xin.csr -signkey xin.key-out xin.crt
Signature ok
subject=/C=12/ST=Guangzhou/L=Tianhe/O=aiqiyi/[email protected]
Getting Private key
12.20 Nginx配置ssl
一、新建ssl.conf,配置ssl
? vim /usr/local/nginx/conf/vhost/ssl.conf
#加入如下內容:!v
server
{
listen 443;
server_name xin.com;
index index.html index.php;
root /data/wwwroot/xin.com;
ssl on;
ssl_certificate xin.crt;
ssl_certificate_key xin.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
二、檢查語法並重載配置文件
?/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
#若報錯unknown directive “ssl” ,需要重新編譯nginx,加上--with-http_ssl_module,然後make&&make install
[root@xinlinux-03 conf]# /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
./configure --prefix=/usr/local/nginx/ --with-http_ssl_module
make&&make install
netstat -lntp #查看是否監聽443端口
[root@xinlinux-03 nginx-1.8.0]# 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 11850/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 769/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 919/master
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 11850/nginx: master
三、創建網站目錄
? mkdir /data/wwwroot/xin.com
四、測試
? echo "This is ssl test page." >/data/wwwroot/xin.com/index.html
? 編輯hosts,增加127.0.0.1 xin.com
vim /etc/hosts
? curl https://xin.com/
[root@xinlinux-03 ~]# vim /etc/hosts
[root@xinlinux-03 ~]# curl https://xin.com/
curl: (60) Peer‘s certificate issuer has been marked as not trusted by the user.
#出現證書不可信任提示,因為這證書是不合法的,自己做的
編輯windows的hosts,增加192.168.233.150 xin.com
打開瀏覽器輸入:https://xin.com
#如果訪問不了,可能是防火墻問題
12.21 php-fpm的pool
目的:使用單獨不同的pool將所有站點隔離開,防止其中一個站點出現問題從而導致其他站點也出現問題
#可以在php-fpm.conf主配置文件內建立多個pool,也可單獨pool單獨一個conf文件
? vim /usr/local/php-fpm/etc/php-fpm.conf
#在[global]部分增加如下內容:
? include = etc/php-fpm.d/*.conf
創建/php-fpm.d/目錄
? mkdir /usr/local/php-fpm/etc/php-fpm.d/
? cd /usr/local/php-fpm/etc/php-fpm.d/
配置www.conf的pool
? vim www.conf
#內容如下:
[www]
listen = /tmp/www.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
?編輯xin.conf的pool
? vim xin.conf
#內容如下
[xin]
listen = /tmp/xin.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-fpm配置文件
? /usr/local/php-fpm/sbin/php-fpm –t
? /etc/init.d/php-fpm restart
[root@xinlinux-03 php-fpm.d]# /usr/local/php-fpm/sbin/php-fpm -t
[27-Sep-2018 10:05:23] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful
[root@xinlinux-03 php-fpm.d]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
ps aux |grep php-fpm #查看php-fpm的pool情況(在最右側)
需要使用pool的話,只需要在網站server配置文件修改為pool對應的sock文件,即可將多個網站隔離開
12.22 php-fpm慢執行日誌
目的:搭建php網站用LNMP時,可以分析php-fpm慢執行日誌,可以找出網站訪問變慢的原因
一、編輯www.conf配置文件
?vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
#加入如下內容
request_slowlog_timeout = 1
#超過一秒就會紀錄日誌(一般都會設置1~2秒之間)
slowlog = /usr/local/php-fpm/var/log/www-slow.log
二、 配置nginx的虛擬主機test.com.conf,(因為www.conf的sock文件是www.sock)
把unix:/tmp/php-fcgi.sock改為unix:/tmp/www.sock
三、檢查語法並重載nginx服務
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
四、測試
? vim /data/wwwroot/test.com/sleep.php
#寫入如下內容
<?php
echo "test slow log";
sleep(2);
echo "done";
?>
#休眠2秒鐘
? curl -x127.0.0.1:80 test.com/sleep.php
? cat /usr/local/php-fpm/var/log/www-slow.log
[root@xinlinux-03 php-fpm.d]# cat /usr/local/php-fpm/var/log/www-slow.log
[27-Sep-2018 10:33:23] [pool www] pid 12132
script_filename = /data/wwwroot/test.com/sleep.php
[0x00007f411ea4f270] sleep() /data/wwwroot/test.com/sleep.php:3
#顯示是哪個文件慢,第幾行慢;這裏是sleep.php的第三行慢,超過一秒都會紀錄
12.23 open_basedir
#通過pool限定網站目錄
適用定義位置:Apache虛擬主機配置文件或者php-fpm配置文件
#open_basedir後面接的是要限定的網站目錄路徑,路徑不對就訪問不了
? vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
#加入如下內容
php_admin_value[open_basedir]=/data/wwwroot/www.com:/tmp/
? 創建測試php腳本,進行測試
curl -x127.0.0.1:80 test.com/sleep.php -I
[root@xinlinux-03 php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php
No input file specified.
[root@xinlinux-03 php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php -I
HTTP/1.1 404 Not Found
Server: nginx/1.8.0
Date: Thu, 27 Sep 2018 02:54:10 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.32
#因為basedir不對,現在將basedir改為test目錄下
[root@xinlinux-03 php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php
test slow logdone
[root@xinlinux-03 php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php -I
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 27 Sep 2018 02:56:28 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.32
兩種查錯方法:
第一種:開啟php-fpm.ini文件的display_error,通過curl後顯示的錯誤信息查找
vim /usr/local/php-fpm/etc/php.ini
display_errors = on
第二種:通過查看錯誤日誌排錯
1、配置錯誤日誌
vim /usr/local/php-fpm/etc/php.ini
指定錯誤日誌位置
error_log=/usr/local/php-fpm/var/log/php_errors.log
指定日誌級別
error_reporting = E_ALL
2、然後檢查語法並重載配置
/usr/local/php/sbin/php-fpm –t
/etc/init.d/php-fpm reload
3、再次測試
4、 查看錯誤日誌
12.24 php-fpm進程管理
#配置pool的內容
?pm = dynamic
#動態進程管理,也可以是static
? pm.max_children = 50
#最大子進程數,ps aux可以查看
? pm.start_servers = 20
#啟動服務時會啟動的進程數
? pm.min_spare_servers = 5
#定義在空閑時段,子進程數的最少數量,如果達到這個數值時,php-fpm服務會自動派生新的子進程。
? pm.max_spare_servers = 35
#定義在空閑時段,子進程數的最大值,如果高於這個數值就開始清理空閑的子進程。
? pm.max_requests = 500
#定義一個子進程最多處理的請求數,也就是說在一個php-fpm的子進程最多可以處理這麽多請求,當達到這個數值時,它會自動退出。
#如果是pm=static時,只有兩句會生效,其他的都不會生效
?pm = static
? pm.max_children = 50
12.25擴展
ssl相關
https://coding.net/u/aminglinux/p/nginx/git/blob/master/ssl/ca.md
https://coding.net/u/aminglinux/p/nginx/git/blob/master/ssl/ssl.md
負載均衡
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/lb.md
nginx算法分析 https://blog.whsir.com/post-1482.html
root和alias
http://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/
12.26課堂筆記
一、nginx虛擬主機配置
increase vhost/*.conf #是在nginx/conf/vhost目錄下的
沒設置default_server時,按文件名排序(ASCII碼排序),第一個conf文件就是默認虛擬主機
二、防盜鏈
#valid_referers 配置referer白名單
#none 代表沒有referer
#blocked 代表有referer但是防火墻或者是代理給去除了(就是搜索網站不加http://也能訪問到網站)
三、Nginx訪問控制
allow、deny只要匹配到就通過,後面的就不執行了
uri(域名後面的東西(路徑或鏈接))
location ~ ... 等同於 if ( $uri ~ ... )
四、Nginx反向代理
#少了$host,客戶端便訪問不了需要的web服務網站,只會訪問到web服務器的ip,通過ip訪問會訪問到網站默認虛擬主機
五、擴展
1、Nginx的四種flag
break與last區別
- 當rewrite規則在location{}外,break和last作用一樣,遇到break或last後,其後續的rewrite/return語句不再執行。但後續有location{}的話,還會近一步執行location{}裏面的語句,當然前提是請求必須要匹配該location。
- 當rewrite規則在location{}裏,遇到break後,本location{}與其他location{}的所有rewrite/return規則都不再執行。
- 當rewrite規則在location{}裏,遇到last後,本location{}裏後續rewrite/return規則不執行,但重寫後的url再次從頭開始執行所有規則,哪個匹配執行哪個。
第十二章、LNMP架構(下)