追蹤
NEIL's_學而時習之x不學無術~私藏IT技術經驗分享部落
關於部落格
NEIL. Cheng....寫作只是為了日後工作之備忘操作參考

本部落格文章撰寫前進邁向第五年(since 2009 ~至今)仍繼續推進分享IT學習!!About Windows/Linux Server,Virtualization


分享網誌: 由於,本人預先完成LAB後,才補上撰寫文章與截圖,若發現文圖對照說明有誤..本人將盡快校正,也請不吝指教! Thanks!

  • 168105

    累積人氣

  • 35

    今日人氣

    0

    追蹤人氣

Nginx_高效能輕量Web Server 配置實務By Near

 (A)Nginx , PHP-FPM 安裝與初始化組態

      本人是參考此篇進行快速安裝_您可以參考此篇預先組態完成

      http://blog.shian.tw/centos-install-nginx-and-php-fpm.html

      %安裝完成後,展示一下本LAB使用套件%

>  yum -y install nginx php-fpm     #本例使用的是Nginx 0.8.54 版本
     

%THEN 我們組態/etc/nginx/nginx.conf         #nginx.conf 組態檔

  #本LAB 客制化修改如下,本例將web root 指定為/var/www/html

 
server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        access_log  logs/host.access.log  main;
        location / {
            root   /var/www/html;
            index  index.html index.htm;
        }
        error_page  404              /404.html;
        location = /404.html {
            root   /var/www/html;
        }



#修改支援PHP語法組態,本利將php-fpm 修改為9999 port

location ~ .php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9999;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
            include        fastcgi_params;
        }


#由於我們上面修改了php-fpm 設定Port,我們另需修改php-fpm 組態檔指定正確port

vi /etc/php-fpm.d/www.conf

listen = 127.0.0.1:9999


THEN 我們依序啟動php-fpm 與nginx 服務,並檢測該Port是否有listen?

/etc/init.d/nginx start

/etc/init.d/php-fpm start

chkconfig nginx on

chkconfig php-fpm on

> netstat -tuln | grep '^9'

> netstat -tuln | grep '80'         #下圖中可得知9999與80 Port 皆ON 起來了



(B). 虛擬主機配置,靜態HTML 與動態PHP配置

 本利建立5個Name-Based 虛擬主機檔案,規劃測試用途如下

  Virtual Web Root :  集中於/var/www/html/v1~v5 底下 

 v1.conf ->  v1.qyun.com    /v1   #靜態網頁,測試Nginx 存取權限與資料夾重新導向

 v2. conf -> v2.qyun.com    /v2    #動態網頁,
測試PHP網頁執行與SSL(https://)

 v3.conf  -> v3.qyun.com   /v3     #動態網頁: 測試PHP連結MySQL資料庫測試

 v4.conf ->  v4.qyun.com   /v4    #靜態網頁: 測試.htpasswd 網頁登入用戶驗證

 v5.conf ->  v5.qyun.com    /v5   #靜態網頁:  與v1配合被從新導向之目的網頁

[靜態網頁配置範例]    v1.conf , v4.conf , v5.conf

vi /etc/nging/conf.d/v1.conf    #以v1為例,其餘依照此例自建

server {
    listen       80;
    server_name  v1.qyun.com;
 
    location / {
        root   /var/www/html/v1;
        index  index.php index.html index.htm;
    }
 
  location ~* ^.+.(htm|html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
        access_log off;
        expires max;
        root /var/www/html/v1;
   }
}

 
[動態PHP網頁配置範例] v2.conf , v3.conf

vi /etc/nginx/conf.d/v2.conf   #以v2為例,其餘依照此例自建

server {
    listen   80;
    server_name
v2.qyun.com
;   
    location / {
        root   /var/www/html/v2;
        index index.php index.htm index.html;
        if (-f $request_filename) {
                        expires 30d;
                        break;
        }
        if (!-e $request_filename) {
                        rewrite ^(.+)$ /index.php?q=$1 last;
        }
    }
    location ~ .php$ {
        fastcgi_pass   127.0.0.1:9999;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/www/html/v2$fastcgi_script_name;
        fastcgi_param  PATH_INFO $fastcgi_script_name;
        include        /etc/nginx/fastcgi_params;
    }
    location ~ /.ht {
        deny  all;
    }
}


PS>請重新啟動NGINX生效上述修改設定

THEN 我們建立PHP測試頁PHP執行狀況,我們建立在v3

 vi /var/www/html/v3/test.php

<?php

phpinfo();

?>

THEN 我們打開Chrome 瀏覽器檢視 http://v3.qyun.com/   #PHP已正常運行



(C). PHP+MYSQL 資料庫連線測試 MySQL_ver. 5.6

       我們預計實驗在 v3.qyun.com 此台虛擬主機上,請確定MySQL順利安裝與啟動
 

登入MySQL 建立Test帳號


> grant all on *.*  to qyun@localhost identified by 'qyun520';

> flush privileges;  


編寫簡易連線MYSQL程式

vi   /var/www/html/v3/index.php

<?php
$link = mysql_connect('localhost', 'qyun', 'qyun520');
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
?>;
echo 'This v3.qyum.com host'

THEN 我們打開Chrome 瀏覽器檢視 http://v3.qyun.com/index.php

 #Conncted Successfully , PHP連線資料庫測試OK



(D). SSL(https) Virtual Host 實務測試

我們預計實驗在 v2.qyun.com 此台虛擬主機上

建立privkey 與憑證申請書.csr

mkdir -p  /var/www/html/ssl/v2       
#本人習慣建置一個SSL資料夾存取所有金鑰,憑證

cd  /var/www/html/ssl/v2

openssl genrsa -out privkey.pem 2048        #建立privkey key

openssl req -new -key privkey.pem -out cert.csr     #憑證申請書

openssl req -new -x509 -days 3650 -key privkey.pem -out cacert.pem   

#自我簽署憑證

#上述完後應該會成立三個檔案 
 cacert.pem  cert.csr  privkey.pem  

THEN 接著我們需編輯 /etc/nginx/conf.d/v2.conf     
  #組態SSL相關設定如下


server {                                                #本人在server 敘述式插入粉色字支援ssl設定
    listen   443;
    server_name v2.qyun.com;
    ssl on;
    ssl_certificate     /var/www/html/ssl/v2/cacert.pem;
    ssl_certificate_key /var/www/html/ssl/v2/privkey.pem;
    ssl_session_timeout 5m;
    ssl_protocols SSLv2 SSLv3 TLSv1;

.......} 以下省略        #設定OK請重啟NGINX 服務


THEN 我們打開Chrome 瀏覽器檢視 https://v2.qyun.com   #SSL TEST OK



(E). 網址重新導向至v5.qyun.com 與 Nginx 網頁權限存取配置 

      我們預計實驗在 v1.qyun.com 此台虛擬主機上


編輯/etc/nginx/conf.d/v1.conf   

#我們預計將
v1.qyun.com  連線從導至v5.qyun.com

Near於下圖函式中插入以下設定

 if ($host = 'v1.qyun.com' ){
        rewrite ^/(.*)$
http://v5.qyun.com$1 permanent;


THEN 我們打開Chrome 瀏覽器檢視  http://v1.qyun.com/

當我們鍵入URL: http://v1.qyun.com 時將快速重導至 http://v5.qyun.com


   封鎖特定IP禁止存取特定Web Site

   編輯403錯誤訊息導向網頁403.htm

    vi /var/www/html/v1/403.htm

<html>
<head><title>Error 403 - IP Address Blocked</title></head>
<body>
Your IP Address is blocked. <br>
If you this an error, please contact webmaster with your IP at
near@seed.net.tw
</body>
</html>

THEN 修改/etc/nginx/conf.d/v1.conf    加入以下設置

error_page 403 /403.htm;             # main  location 區段插入此行
------


deny 192.168.0.198;                    #Server宣告示,我們指定封所.198 網址

 allow all;

location = /403.htm{                 # 新增Location 敘述如下,修改完成後請重新啟動NGINX
root /var/www/html/v1;
allow all;
}



THEN 我們打開Chrome 瀏覽器檢視 http://v1.qyun.com/   #Client 端IP 192.168.0.199

 當Client IP被BLOCK 時除現403錯誤,Client 端將顯示以下Message
  

 Your IP Address is blocked..... 
 
(F). .htpasswd 網頁登入使用者驗證存取網頁配置

       我們預計實驗在 v4.qyun.com 此台虛擬主機上


#配置User 網頁存取帳密

  mkdir  -p   /var/www/html/htpv4/                              #建立存放網頁驗證資料夾

  htpasswd -c /var/www/html/htpv4/htpv4 near    
  #建立使用者near 帳密

  > cat  /var/www/html/htpv4/htpv4                 # 檢視建置OK成果
 

THEN 我們編輯/etc/nginx/conf.d/ v4.conf 檔案,修改組態支援網頁使用者驗證登入

 
 auth_basic "LT-COUNT-TongJi";                                #插入Main Location敘述式區段
 auth_basic_user_file /var/www/html/htpv4/htpv4 ;  #修改完成請重新啟動Nginx 生效設定

THEN 我們打開Chrome 瀏覽器檢視 http://v4.qyun.com/  

  進入網頁前要求:  輸入使用著帳號/密碼,當輸入正確才可存取該網頁


   當登入成功後,我們就可以順利取得網頁資訊了
  
(G). Nginx : Linux 核心參數優化

       編輯  /etc/  /etc/sysctl.conf    

 #Optimization                                        #參考官方手冊,插入以下優化參數
  
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn =32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_timestamps = 0
net.core.wmem_max = 16777216
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000

/sbin/sysctl -p       #生效該敘述設定,若打錯字將顯示錯誤.請修正


 
(H.) 實現日誌分割設計

日誌路徑:  /var/log/nginx/access.log

編寫Shell Script  如下

vi /usr/local/bin//cut_nginx_logs.sh

chmod +x  /usr/local/bin/cut_nginx_logs.sh

#此Script 將依日期時間歸納Access.log,方便系統管理員日後檢查日誌track#

#當日誌過舊超過30日時,將自動刪除過舊網誌

  
#!/bin/bash

#set the path to nginx log files
log_files_path="/var/log/nginx/"
log_files_dir=${log_files_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
#set nginx log files you want to cut
log_files_name=(access)
#set the path to nginx.
nginx_sbin="/usr/sbin/nginx"
#Set how long you want to save
save_days=30

mkdir -p $log_files_dir

log_files_num=${#log_files_name[@]}

#cut nginx log files
for((i=0;i<$log_files_num;i++));do
mv ${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d").log
done

#delete 30 days ago nginx log files
find $log_files_path -mtime +$save_days -exec rm -rf {} ;

$nginx_sbin -s reload


排程執行  cut_nginx_logs.sh  日誌切割 00:00  每次零點零分執行

00 00 * * * /usr/local/bin/cut_nginx_logs.sh /dev/null 2>&1

手動執行日誌備分

source  /usr/local/bin/cut_nginx_logs.sh   

#下圖中,已成功切割日製,方便系統管理員日後追蹤log

 
LAB: 實作時所參考部分資料

http://www.21andy.com/blog/20100203/1609.html

http://linux-guys.blogspot.com/     蚊子館_Near_強力推薦:對NGINX初學者很有幫助


相簿設定
標籤設定
相簿狀態