LNMP(二)Nginx默認虛擬主機、用戶認證、域名重定向、訪問日誌、日誌切割、防盜鏈、訪問控制、靜態文件不記錄日誌和過時時間、Nginx解析php相關配置、Nginx代理

任務列表:
12.7 Nginx默認虛擬主機
12.8 Nginx用戶認證
12.9 Nginx域名重定向
12.10 Nginx訪問日誌
12.11 Nginx日誌切割
12.12 靜態文件不記錄日誌和過時時間
12.13 Nginx防盜鏈
12.14 Nginx訪問控制
12.15 Nginx解析php相關配置
12.16 Nginx代理php

擴展
nginx.conf 配置詳解  
https://coding.net/u/aminglinux/p/nginx/git/tree/master/3z
nginx rewrite四種flag  
http://unixman.blog.51cto.com/10163040/1711943
https://coding.net/u/aminglinux/p/nginx/git/blob/master/rewrite/break.md
502問題彙總  http://ask.apelearn.com/question/9109
location優先級 https://coding.net/u/aminglinux/p/nginx/git/blob/master/location/priority.md
擴展:Nginx訪問日誌+日誌切割+靜態文件不記錄和過時時間設置:https://www.okay686.cn/524.htmlcss

5.15筆記html

LAMP 以模塊的形式存在linux

LNMP 以服務的形式nginx

市場佔有率https://w3techs.com/technologies/overview/web_server/all        https://news.netcraft.com/archives/2018git

正向代理\反向代理https://coding.net/u/aminglinux/p/nginx/gitgithub

爲何基於事件驅動的服務器能實現高併發?https://github.com/aminglinux/nginx/blob/master/4z/IO.mdweb

 

 

 

 

1、默認虛擬主機apache

在Nginx中也有默認虛擬主機,跟httpd相似,第一個被Nginx加載的虛擬主機就是默認主機,但和httpd不相同的地方是,它還有一個配置用來標記默認虛擬主機,也就是說,若是沒有這個標記,第一個虛擬主機爲默認虛擬主機。vim

編輯nginx.conf主配置文件

vim /usr/local/nginx/conf/nginx.conf

在配置文件中httpd段插入 include vhost/*.conf;   把默認的虛擬主機刪除

建立vhost目錄,並新建aaa.com.conf默認虛擬主機配置內容

vhost目錄:在conf目錄下建立一個vhost子目錄

建立vhost目錄,並新建aaa.com.conf默認虛擬主機配置內容

server
{
    listen 80 default_server;      default_server默認虛擬主機
    server_name aaa.com;
    index index.html index.htm index.php;
    root /data/wwwroot/default;

    location ~ \.php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;            注意此處default與上面一致
    }
}

建立默認虛擬主機的網站目錄/data/wwwroot/default,創建index.html文件,寫入一些內容

檢測語法,從新加載配置文件;測試相關網站;任意的域名,都會指向默認主機的網站名

/usr/local/nginx/sbin/nginx -t  檢測語法

/usr/local/nginx/sbin/nginx -s reload   從新加載

無論訪問什麼域名,只要解析過來,指向到服務器,都能訪問到aaa.com這個站點,即默認的虛擬主機

如何去定義一個默認虛擬主機
1.放在第一個位置,如何區分第一個位置:作一個vhost:能夠把第一個的名字改成00.conf,以名字區分


2.加上特殊的標記爲default_server

也能夠在nginx.conf中最後一行加include vhost/*.conf;就是包含了默認主機的配置,也能夠把默認主機配置內容放置到下面,效果是同樣的;

2、Nginx用戶認證

建立虛擬主機:test.com.conf

 cd /usr/local/nginx/conf/vhost/

vim test.com.conf

auth_basic              "Auth";  定義用戶認證的名字
auth_basic_user_file   /usr/local/nginx/conf/htpasswd;   用戶名密碼文件

location /:針對整個目錄作認證 也能夠針對某一個目錄或url作認證,好比: location /admin/:針對admin目錄作認證 location ~ admin.php:針對某個請求的url作認證 auth_basic_user_file:用戶認證文件路徑
## 添加如下內容,要記得添加在 location ~ \.php$ 上面
    location ~ admin.php
    {
        auth_basic              "Auth";
        auth_basic_user_file    /usr/local/nginx/conf/htpasswd;  # 密碼文件路徑
    }

建立用戶;
因爲nginx沒有自帶建立用戶的工具,所以須要藉助httpd工具:htpasswd;假如沒有,則用此命令 yum install -y httpd;由於本機已經安裝,所以直接執行

/usr/local/apache2.4/bin/htpasswd -c /usr/local/nginx/conf/htpasswd tobe1   建立用戶tobe1,  -c會覆蓋以前建立的用戶文件

 /usr/local/apache2.4/bin/htpasswd  /usr/local/nginx/conf/htpasswd tobe2    建立第二個用戶,不加-c

 cat /usr/local/nginx/conf/htpasswd     此時有兩個密碼文件生成

測試前須要檢查語法錯誤,以及從新加載配置文件

/usr/local/nginx/sbin/nginx -t

 /usr/local/nginx/sbin/nginx -s reload

curl -x127.0.0.1:80 test.com        出現401碼,須要用戶認證

用戶認證測試主機

有時候咱們須要對某個訪問目錄或者頁面進行認證,而不是全站。因此咱們須要對配置文件進行更改:

針對目錄:

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

curl -x127.0.0.1:80 test.com  此時正常訪問

 curl -x127.0.0.1:80 test.com/admin/  訪問admin報錯401

建立admin目錄,並在目錄下建立index.html,寫入內容

 curl -utobe1:tobe -x127.0.0.1:80 test.com/admin/  加上用戶正常訪問

針對某個請求的url作認證

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

 curl -x127.0.0.1:80 test.com/admin/  此時不須要用戶認證

curl -x127.0.0.1:80 test.com/admin.php  此時須要用戶認證

 

3、Nginx域名重定向

在Nginx配置中,server_name後面能夠跟多個域名,permanent爲永久重定向,至關於httpd的R=301.另外還有一個經常使用的redirect,至關於httpd的R=302。

cd /usr/local/nginx/conf/vhost/

 vim test.com.conf

test.com爲主域名,當訪問test2.com和test3.com時,跳轉到test.com使用rewrite實現,
 if ($host != 'test.com' ) {           若是域名不是test.com
        rewrite  ^/(.*)$  http://test.com/$1  permanent;        跳轉到test.com,$1表明^/(.*)$
    }

permanent:永久跳轉,也就是301
redirect:臨時跳轉,302

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

curl -x127.0.0.1:80 test2.com/index.html -I   訪問test2.com會重定向到test.com

curl -x127.0.0.1:80 test2.com/admin/index.html -I   也會重定向到test.com

curl -x127.0.0.1:80 test4.com/admin/index.html -I  

curl -x127.0.0.1:80 test4.com/admin/index.html -I   返回404,會重定向到默認虛擬主機aaa.com.conf

4、Nginx訪問日誌

名詞

釋義

$remote_addr

客戶端ip(公網ip)

$http_x_forwarded_for

代理服務器的ip

$time_local

服務器本地時間

$host

訪問主機名(域名)

$request_uri

訪問的url地址

$status

狀態碼

$http_referer

referer

$http_user_agent

user_agent

日誌格式:

在nginx配置文件定義日誌的,其中combined_realip爲日誌的名稱,這個名稱能夠自定義,好比這裏自定義爲tobe

vim /usr/local/nginx/conf/nginx.conf     //搜索log_format

紅框中的名稱能夠修改爲任意名稱,能夠自定義

除了在主配置文件nginx.conf裏定義日誌格式外,還須要在虛擬主機配置文件中增長  access_log /tmp/test.com.log tobe;

vim /usr/local/nginx/conf/vhost/test.com.conf

檢測、加載配置後,進行測試;

 /usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

 cat /tmp/test.com.log   查看日誌

5、Nginx日誌切割

因爲Nginx不像Apache有本身的切割工具,所以咱們須要寫個腳本完成需求

腳本放到/usr/local/sbin/目錄下,寫入以下內容

vim /usr/local/sbin/nginx_log_rotate.sh

#! /bin/bash
d=`date -d "-1 day" +%Y%m%d`
logdir="/tmp/"  ## 假設nginx的日誌存放路徑爲/tmp/
nginx_pid="/usr/local/nginx/logs/nginx.pid"
cd $logdir
for log in `ls *.log`
do
    mv $log $log-$d
done
/bin/kill -HUP `cat $nginx_pid`

腳本語句解釋:

 date -d "-1 day" +%Y%m%d    生成昨天的日期

nginx_pid=」/usr/local/nginx/logs/nginx.pid」; 是爲了最後一行而設定的。

/bin/kill -HUP cat $nginx_pid

最後一行的意思和以前使用的 -s reload 是一個意思 重載nginx.pid,而後就會再次生成一個新的日誌文件。不然不生成日誌文件

for循環,把ls列舉的log文件,以日期格式重命名

for log in `ls *.log`
do
    mv $log $log-$d
done
/bin/kill -HUP `cat $nginx_pid`

sh -x 執行腳本   -x查看執行過程

查看生成的test.com日誌

日誌清理

刪除超過一個月的日誌(也能夠寫在腳本里面),志只保留一個月,還須要往crontab裏添加如下這一行,每月的1號就刪除一次舊的日誌文件

find /tmp/ -name *.log-* -type f -mtime +30 |xargs rm

* * 1 * * /usr/bin/find /usr/local/php-fpm/var/log/ -name *.log.* -type f -mtime +30 |xargs rm

建立執行腳本的計劃:好比:天天0時0分進行切割

crontab -e

0 0 * * * /bin/bash /usr/local/sbin/nginx_logrotate.sh            天天的0時0分執行此腳本

6、靜態文件不記錄日誌和過時時間

虛擬主機配置文件location~能夠指定對應的靜態文件,expires配置過時時間,而access_log 配置爲off就能夠不記錄訪問日誌了

配置文件

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ //匹配.gif等格式的靜態文件不計入日誌

{

expires 7d; //有效期7天

access_log off; //不記錄日誌

}

location ~ .*\.(js|css)$ //匹配js或者css文件

{

expires 12h; //有效期12小時

access_log off;

}

/usr/local/nginx/sbin/nginx -t

 /usr/local/nginx/sbin/nginx -s reload
cd /data/wwwroot/test.com/   在該目錄下建立gif和css文件進行測試

訪問1.gif、2.js、index.html只有index.html記錄日誌,gif和js結尾的不記錄 

curl -x127.0.0.1:80 test.com/1.gif
 curl -x127.0.0.1:80 test.com/2.js
 curl -x127.0.0.1:80 test.com/index.html

經過expires設置過時時間,過時時間以下圖

7、Nginx防盜鏈

編輯配置文件vim /usr/local/nginx/conf/vhost/test.com.conf

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; //不符合,無效的引用者,則返回403;
}
access_log off;
}

檢查語句,並加載配置文件,進行測試,針對有效referer和無效referer的對比

curl -e "http://www.baidu.com/1.txt" -x127.0.0.1:80 test.com/1.gif -I    無效referer,返回403

curl -e "http://www.test.com/1.txt" -x127.0.0.1:80 test.com/1.gif -I        白名單的referer,正常

8、Nginx訪問控制

1. 針對某個目錄設置

需求:訪問/admin/目錄的請求,只容許某幾個IP訪問,須要將某些頁面加密處理,配置以下:

location /admin/
{
    allow 127.0.0.1;
    allow 192.168.83.3;
    deny all;
}

測試,經過容許192.168.83.3和禁止127.0.0.1來作實驗,這兩個IP主機都能鏈接到

編輯完成後,檢查,加載

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

curl -x127.0.0.1:80 test.com/admin/ -I

curl -x192.168.83.3:80 test.com/admin/ -I        兩個IP主機都能鏈接到

 

 把allow 192.168.83.3註釋,在訪問,報錯403

2. 匹配正則,根據正則去控制

主要是爲了防止上傳php文件,以避免形成木馬文件,影響安全;

把能上傳文件的目錄禁掉解析php,只要匹配upload,以php結尾的都禁掉

 vim /usr/local/nginx/conf/vhost/test.com.conf

location ~ .*(upload|image)/.*\.php$    //匹配.php文件
{
deny all;        //禁止所有
}

測試:在upload目錄下,分別建立1.txt和1.php文件,可以訪問1.txt,不可以訪問1.php;

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

mkdir /data/wwwroot/test.com/upload

echo "1111" > /data/wwwroot/test.com/upload/1.php

echo "2222" > /data/wwwroot/test.com/upload/1.txt

curl -x127.0.0.1:80 test.com/upload/1.php

curl -x127.0.0.1:80 test.com/upload/1.txt

3. 根據user-agent限制

不想被蜘蛛爬本身的網站,咱們徹底能夠根據user-agent去禁止掉

禁止相關的user-agent,訪問網站;

 vim /usr/local/nginx/conf/vhost/test.com.conf   配置文件中加入以下配置:

if ($http_user_agent ~* 'Spider/3.0|YoudaoBot|Tomato')        //$http_user_agent ~* (最後加的*忽略大小寫)

{

return 403;

}

檢查語句,並加載配置文件

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

測試user_agent,不一樣值的試驗

curl -A "YoudaoBot" -x127.0.0.1:80 test.com/upload/1.txt -I     user_agent爲YoudaoBot,禁止訪問

curl -A "Tomato" -x127.0.0.1:80 test.com/upload/1.txt -I        user_agent爲Tomato,禁止訪問

curl -A "baidu.com" -x127.0.0.1:80 test.com/upload/1.txt -I        user_agent爲除設置的3個外,任意指定,能夠訪問

9、Nginx解析php相關配置

先建立一個3.php文件進行測試

vim /data/wwwroot/test.com/3.php

寫入 
<?php

phpinfo();

curl -x127.0.0.1:80 test.com/3.php   此時不能解析

修改配置文件   vim /usr/local/nginx/conf/vhost/test.com.conf

加入以下內容

location ~ \.php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
    }

檢查語句,並加載配置文件

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

curl -x127.0.0.1:80 test.com/3.php  能夠正常解析

解析php代碼釋義:

其中fastcgi_pass用來指定php-fpm的地址,若是php-fpm監聽的是一個tcp:port的地址(好比127.0.0.1:9000),那麼也須要在這裏改爲fastcgi_pass 127.0.0.1:9000。這個地址必定要和php-fpm服務監聽的地址匹配,不然會報502錯誤.

 cat /usr/local/php-fpm/etc/php-fpm.conf      php配置中的listen = /tmp/php-fcgi.sock是/tmp/php-fcgi.sock,  fastcgi_pass 也要是fastcgi_pass unix:/tmp/php-fcgi.sock;

還有一個地方要注意fastcgi_param SCRIPT_FILENAME 後面跟的路徑爲該站點的根目錄,和前面定義的root那個路徑保持一致,若是這裏配置不對,訪問PHP頁面會出現404;還有一種502的現象,若是內存中出現大量的php-fpm進程佔據了內存,也會一樣致使此問題

10、Nginx代理

原理:Nginx代理是一種反向代理。反向代理(Reverse Proxy)方式是指以代理服務器來接受Internet上的鏈接請求,而後將請求轉發給內部網絡上的服務器;並將從服務器上獲得的結果返回給Internet上請求鏈接的客戶端,此時代理服務器對外就表現爲一個服務器。

cd /usr/local/nginx/conf/vhost  改目錄下,建立proxy.conf配置文件,寫入如下配置:

server
{
    listen 80;
    server_name ask.apelearn.com;

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


由於是代理服務器因此不須要訪問本地服務器的任何文件; ask.apelearn.com; 定義一個域名;

proxy_pass http://223.94.95.10/;真實WEB服務器的IP地址,要確保被代理的ip能訪問
$host; 也就是我們的server_name

檢查語句,並加載配置文件 

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload
開始測試:127.0.0.1就是本身的代理機,訪問論壇

 curl -x127.0.0.1:80 ask.apelearn.com -I

 curl ask.apelearn.com/robots.txt            測試網站的robots

相關文章
相關標籤/搜索