1. 程式人生 > >LNMP架構(二)

LNMP架構(二)

Nginx預設虛擬主機

預設虛擬主機指的是,任何一個域名指向這臺伺服器,只要是沒有對應的虛擬主機,就會由這個預設虛擬主機來處理。 與httpd相同,在Nginx中也有預設虛擬主機,並且類似的,第一個被Nginx載入的虛擬主機就是預設主機。但不同的是,它還有一個配置用來標記預設虛擬主機,也就是說,如果沒有這個標記,第一個虛擬主機為預設虛擬主機。

  • 先修改主配置檔案:
[[email protected] nginx-1.12.1]# vim /usr/local/nginx/conf/nginx.conf
     include vhost/*.conf;      //在結束符號 } 上面加入這行配置
}

上面那行配置就是載入 /usr/local/nginx/conf/vhost/ 下面的所有以.conf結尾的檔案,這樣我們就可以把所有虛擬主機的配置檔案放到vhost目錄下面了

  • 編輯預設主機配置檔案: 
[[email protected] nginx-1.12.1]# mkdir /usr/local/nginx/conf/vhost
[[email protected] nginx-1.12.1]# cd /usr/local/nginx/conf/vhost
[[email protected] vhost]# vim default.conf    //這裡是新檔案,寫入下面內容
server
{
    listen 80 default_server;    // 有這個 default_server 標記的就是預設虛擬主機
    server_name 123.com;
    index index.html index.htm index.php;
    root /data/nginx/default;
}

Nginx使用者認證 

在使用者訪問網站的時候,需要輸入使用者名稱密碼才能順利訪問,一些重要的站點或網站後臺通常會加上使用者認證,目的當然是保障安全。

  • 建立一個新的虛擬主機:
[[email protected] vhost]# cd /usr/local/nginx/conf/vhost/
[[email protected] vhost]# vim test.com.conf     //這是新檔案,寫入下面內容
server
{
   listen 80;
   server_name test.com;
   index index.html index.htm index.php;    
   root /data/nginx/test.com;
   location /
   {
      auth_basic  "Auth";         //auth_basic開啟使用者認證
      auth_basic_user_file   /usr/local/nginx/conf/htpasswd;       //指定使用者密碼檔案
   }
}
  • 驗證上面配置
[[email protected] vhost]# /usr/local/nginx/sbin/nginx -t 
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[[email protected] vhost]# /usr/local/nginx/sbin/nginx -s reload
[[email protected] vhost]# yum install -y httpd   //安裝httpd,因為生成密碼檔案需要用到htpasswd命令
[[email protected] vhost]# htpasswd -c /usr/local/nginx/conf/htpasswd lzx      //建立lzx使用者,並設定密碼
New password: 
Re-type new password: 
Adding password for user lzx
[[email protected] vhost]# mkdir /data/nginx/test.com
[[email protected] vhost]# echo "test" > /data/nginx/test.com/index.html
[[email protected] vhost]# curl -x127.0.0.1:80 test.com -I
HTTP/1.1 401 Unauthorized        //狀態碼401說明該網站需要驗證
Server: nginx/1.12.1
Date: Thu, 05 Jul 2018 08:06:39 GMT
Content-Type: text/html
Content-Length: 195
Connection: keep-alive
WWW-Authenticate: Basic realm="Auth"

另外,如果是針對某個目錄做使用者認證,需要配置location後面的路徑:

location /admin/       //這裡以admin目錄為例
   {
      auth_basic  "Auth";
      auth_basic_user_file   /usr/local/nginx/conf/htpasswd;
   }

 Nginx域名重定向

Nginx和httpd的域名重定向和httpd的類似。

  • 配置虛擬主機檔案:
[[email protected] vhost]# vim test.com.conf
server
{
   listen 80;
   server_name test.com test1.com test2.com;    //Nginx中,server_name 後面可以跟多個域名
   index index.html index.htm index.php;
   root /data/nginx/test.com;
   if ($host != 'test.com')
   {
   rewrite ^/(.*)$ http://test.com/$1 permanent;   //permanent為永久重定向,相當於httpd的R=301;還有個redirect,為臨時重定向,相當於R=302
   }  
} 

Nginx訪問日誌 

先檢視一下Nginx的日誌格式:

[[email protected] vhost]# grep -A2 log_format /usr/local/nginx/conf/nginx.conf
    log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
    ' $host "$request_uri" $status'
    ' "$http_referer" "$http_user_agent"';

和httpd類似,也是在主配置檔案中定義的日誌格式

  • 指定訪問日誌的路徑:
[[email protected] ~]# cd /usr/local/nginx/conf/vhost/
[[email protected] vhost]# vim test.com.conf 
server
{
   listen 80;
   server_name test.com test1.com test2.com;
   index index.html index.htm index.php;
   root /data/nginx/test.com;
   if ($host != 'test.com')
   {
   rewrite ^/(.*)$ http://test.com/$1 permanent;
   }
   access_log /tmp/1.log combined_realip;          //使用access_log來指定日誌的儲存路徑,最後面指定日誌的格式名字
}

Nginx的日誌比較簡單,但沒有像httpd那樣自帶的切割工具,要想切割Ngin日誌需要藉助系統的切割工具或自定義指令碼。 這裡我們自定義一個日誌切割指令碼: 

[[email protected] vhost]# vim /usr/local/sbin/nginx_log_rotate.sh        //寫入下面內容
#! /bin/bash
d= `data -d "-1 day" +%Y%m%d`
logdir="/data/logs"      //假設Nginx的日誌存放路徑為/data/logs
nginx_pid="/usr/local/nginx/logs/nginx.log"
cd $logdir
for log in `ls *.log`
do
  mv $log $log-$d
done
/bin/kill -HUP `cat $nginx_pid`

寫完指令碼之後,還需要增加任務計劃:

[[email protected] vhost]# 0 0 * * * /bin/bash /usr/local/sbin/nginx_log_rotate.sh

靜態檔案不記錄日誌和過期時間 

  • 修改虛擬主機配置檔案: 
[[email protected] vhost]# vim test.com.conf
 listen 80;
   server_name test.com test1.com test2.com;
   index index.html index.htm index.php;
   root /data/nginx/test.com; 
   if ($host != 'test.com')
   {
   rewrite ^/(.*)$ http://test.com/$1 permanent;
   }
   location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$      //指定對於的靜態檔案
   {
     expires   7d;          //配置過期時間
     access_log off;        //off就不記錄訪問日誌了
   } 
   location ~ .*\.(js|css)$
   {
     expires    12h;
     access_log off;
   } 
   access_log /tmp/1.log combined_realip;
}  

Nginx防盜鏈

  • 修改虛擬主機的配置檔案:
[[email protected] vhost]# vim test.com.conf
server
{
   listen 80;
   server_name test.com test1.com test2.com;
   index index.html index.htm index.php;
   root /data/nginx/test.com;
   if ($host != 'test.com')
   {
   rewrite ^/(.*)$ http://test.com/$1 permanent;
   }
   location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$
   {
      expires  7d;
      valid_referers none blocked server_names *.test.com;
      if ($invalid_referer)  
     {
      return 403;
     }
      access_log off;
   }
   access_log /tmp/1.log combined_realip;
} 

Nginx訪問控制

Nginx需要限制某些IP不能訪問或只允許某些IP訪問,配置訪問和httpd類似

  •  使訪問admin目錄的請求只允許192.168.33.128和127.0.0.1訪問:
location /admin/
{
      allow 192.168.33.128;
      allow 127.0.0.1;
      deny all;
}

配置httpd的時候還有個order來先定義allow或deny,在Nginx中沒有,只要逐條匹配規則就結束了

  • 另外,還可以根據正則匹配來限制:
location ~ .*(abc|image)/.*\.php$      //禁止解析PHP
{
    return 403;
}

|為分隔符,表示“或者”的意思,這樣就可以把訪問的URL中帶有abc或者image字串,並且是PHP的請求拒絕訪問

  • 也可以針對user_agent做一些限制:
if ($http_user_agent ~ `Spider/3.0|YoudaoBot|Tomato`)
{
    return 403;
}

~為匹配符,只要user_agent中含有Spider3.0或者YoudaoBot或者Tomato字串的,都會被拒絕

Nginx解析php相關配置 

在LNMP中,PHP是以一個服務(php—fpm)的形式存在的,首先要啟動php-fpm服務,然後Nginx再和php-fpm通訊。

  • 下面是相關配置:
[[email protected] vhost]# vim test.com.conf
server
{
   listen 80;
   server_name test.com test1.com test2.com;
   index index.html index.htm index.php;
   root /data/nginx/test.com;
   if ($host != 'test.com')
   {
   rewrite ^/(.*)$ http://test.com/$1 permanent;
   }
   location ~ \.php$
  {
      include fastcgi_params;
      fastcgi_pass unix:/tmp/php-fcgi.sock;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME /data/nginx/test.com$fastcgi_script_name;
  }
   access_log /tmp/1.log combined_realip;
}

其中fastcgi_pass用來指定php-fom的地址,fastcgi_param SCRIPT_FILENAME後面跟的路徑為該站點的根目錄,必須和前面定義的root的路徑保持一致,否則會報502錯誤 

Nginx代理

Nginx的代理功能非常實用,如果一個沒有公網IP的伺服器要提供web服務,就可以通過Nginx代理來實現。如果Nginx後面有多臺伺服器,如果同時代理,那Nginx在這裡就起到一個負載均衡的作用。

  • 配置Nginx代理: 
[[email protected] ~]# cd /usr/local/nginx/conf/vhost/
[[email protected] vhost]# vim proxy.conf     //寫入下面內容
server
{
        listen 80;
        server_name lzx.com;

        location /
        {
                proxy_pass http://61.135.169.125/;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}  

Proxy_pass指定要代理的域名所在的伺服器IP 後面的三行為定義發往後端web服務取的請求頭,第二行必須有,否則代理不成功,它表示後端web伺服器的域名和當前配置檔案中的server_name保持一致

$remote_addr為訪問網站的使用者的出口ip;

$http_x_forwarded_for為代理伺服器的ip,如果使用了代理則會記錄代理的ip;

擴充套件:

nginx.conf 配置詳解

nginx rewrite四種flag

502問題彙總

location優先順序