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優先順序