任務列表:
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