1. 程式人生 > >第十二章、LNMP架構(下)

第十二章、LNMP架構(下)

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再次從頭開始執行所有規則,哪個匹配執行哪個。
301(permanent)與302(redirect)區別 域名變化用301 域名沒變化用302 2、location的優先級 location優先級 = 高於 ^~ 高於 *~高於 ~ 高於 / 3、502問題 1.配置錯誤 因為nginx找不到php-fpm了,所以報錯,一般是fastcgi_pass後面的路徑配置錯誤了,後面可以是socket或者是ip:port 2.資源耗盡 lnmp架構在處理php時,nginx的直接調取後端的PHP-fpm的服務,如果nginx的的請求量偏高,我們又沒有給PHP-fpm的配置足夠的子進程,那麽PHP-FPM就會資源耗盡,一旦資源耗盡nginx的找不到PHP-FPM就會出現502錯誤, 解決方案 去調整PHP-fpm.conf中的pm.max_children數值,使其增加,但是也不能無限增加,畢竟資源有限,一般4G內存機器如果跑PHP-FPM和nginx,不跑mysql可以設置為150,8G為300以此類推 3.除了上面的兩種錯誤還有其他的原因,很少有,我們可以借助nginx的錯誤日誌來進行排查vim / usr / local /nginx/logs/nginx_error.log我們也可以給日誌定義級別vim / usr / local / nginx / conf / nginx.conf找到error_log,默認是crit最嚴謹的就行,也可以改成debug顯示的信息最全面,但 是很容易撐爆我們的磁盤。 首先我們需要讓瀏覽器進行訪問 修改nginx的配置文件 [root @ wqslinux~] #vim / usr / local / nginx / conf / vhosts / 111.conf server { listen 80; 服務器名稱www.111.com ; //域名地址 索引index.html index.htm index.php; root / data / www /; location~ \ .php $ { include fastcgi_params; fastcgi_pass unix:/tmp/www.sock ; //修改襪子 #fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME / data / www $ fastcgi_script_name; } } 檢查語法是否正常 [根@ wqslinux?]#的/ usr /本地/ nginx的/ sbin目錄/ nginx的-t 重新加載配置文件 [根@ wqslinux?]#的/ usr /本地/ nginx的/ sbin目錄/ nginx的-S重載 [ root @ wqslinux~]#/ etc / init.d / nginx reload 檢查nginx是那個用戶跑的 [root @ wqslinux~] #ps aux | grep nginx 編輯php-fpm文件 我們要在這個php-fpm文件裏面設置nginx的用戶主,跟組這樣才不會顯示502 [root @ wqslinux~] #vim / usr / local / php / etc / php-fpm.conf [global] pid = /usr/local/php/var/run/php-fpm.pid error_log = / usr / local / php / var / log / php-fpm.log [www] listen = /tmp/www.sock user = php-fpm group = php-fpm listen.owner = nobody //定義屬主 listen.group = nobody //定義屬組 pm =動態 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 [root @ wqslinux~]#/ etc / init.d / php -fpm restart ps:再補充一個,是近期很多同學遇到的問題 這種情況下,使用的是socket,版本高於5.4(含5.4)默認監聽的socket文件權限是所有者只讀,屬組和其他用戶沒有任何權限。所以,nginx的啟動用戶(咱們配置的是沒有)就沒有辦法去讀這個socket文件,最終導致502,這個問題可以在nginx的錯誤日誌中發現。解決辦法很簡單,上面給出的配置文件中就有避免這個問題的配置 .shop.owner =沒人 //定義屬主 listen.group = nobody //定義屬組 這兩個配置就是定義socket的屬主和屬組是誰。除了這個還有一種方法 listen.mode = 777 這樣nobody也可以有讀取權限了。 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

第十二章、LNMP架構(下)