1. Nginx用戶認(rèn)證
我一直很懷疑為什么nginx用戶認(rèn)證要安裝Apache,我仔細(xì)想了想所有的步驟,只有生成htpasswd的時(shí)候會(huì)用到一個(gè)命令htpasswd,所有我就想為啥我自己建一個(gè)密碼文件不行呢?所以我就試了一下,剛開(kāi)始是不能認(rèn)證,想了下應(yīng)該是權(quán)限問(wèn)題,就給htpasswd文件提了權(quán)限,然后能認(rèn)證了,但是密碼一直不對(duì)!所以我就先妥協(xié)的用了htpasswd命令生成密碼文件。后面我會(huì)解釋為什么不行。
其實(shí)并不像老師ppt上說(shuō)的nginx用戶認(rèn)證需要裝Apache,只是我們需要htpasswd這個(gè)命令罷了,我找了以下,咱們機(jī)子上是有的,所以不用裝httpd的。
htpasswd -c -m /usr/local/nginx/conf/htpasswd liuke
回車后輸入兩次密碼即可,然后可以看到在/usr/local/nginx/conf/下面生成了一個(gè)htpasswd
文件,我們cat看一下,原來(lái)里面是密文,難怪之前我自己建的文件不行...
配置nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
在server中加入如下配置
location / {
auth_basic "Authasas"; ? ? ??
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
auth_basic "Authasas";后面的字符串是提示字符。

最后重啟Nginx服務(wù)器,在瀏覽器中測(cè)試成功
但是還有一個(gè)坑,你們有沒(méi)有發(fā)現(xiàn)呢?
當(dāng)我對(duì)根目錄設(shè)置用戶權(quán)限的時(shí)候,我在網(wǎng)址中直接輸入www.kk.com/2.php竟然沒(méi)讓我認(rèn)證,直接取出來(lái)了網(wǎng)頁(yè)的內(nèi)容,這是為啥呢?
為了測(cè)試,我把認(rèn)證的內(nèi)容移到了php解析之前,發(fā)現(xiàn)此時(shí)就需要用戶認(rèn)證了,于是得出結(jié)論,在請(qǐng)求的網(wǎng)址到來(lái)時(shí),從上向下比對(duì),如果文件是php結(jié)尾的,就直接交給php-fpm去解析了,解析后直接傳給了nginx,所以不需要用戶認(rèn)證,但是我把認(rèn)證放在前面的時(shí)候,所有的文件都要進(jìn)行認(rèn)證,包括php文件,此時(shí)能認(rèn)證,但是php文件卻是不能解析的!??!
2. Nginx域名跳轉(zhuǎn)
前面咱們已經(jīng)說(shuō)過(guò)Apache的域名跳轉(zhuǎn)了,其實(shí)都差不多的。但是有幾個(gè)坑要注意一點(diǎn)哦。
現(xiàn)先在你的windows的host中加幾個(gè)域名,解析到你的服務(wù)器ip

配置虛擬主機(jī)配置文件
vim /usr/local/nginx/conf/nginx.conf
在server的大括號(hào)內(nèi)加入如下內(nèi)容:
if ($host != 'www.kk.com' ) {
rewrite ^/(.*)$ http://www.baidu.com/$1 permanent;
}

重啟服務(wù)器,嘗試跳轉(zhuǎn),但是看到的卻是403,我仔細(xì)分析了一下,原來(lái)是以前配置的默認(rèn)虛擬主機(jī)在作祟,不認(rèn)得的域名都被轉(zhuǎn)到了虛擬主機(jī)這里。所以出現(xiàn)403
include /usr/local/nginx/conf/vhosts/*.conf;
我將其刪除之后,正常跳轉(zhuǎn),但是我又想要這個(gè)默認(rèn)虛擬主機(jī)該怎么辦呢?
解決:我們只需要讓服務(wù)器認(rèn)識(shí)我們輸入的域名不就行了嗎?
在server_name這里在寫(xiě)上我們最開(kāi)始在host中加入的一個(gè)域名,然后服務(wù)器不就認(rèn)識(shí)了嘛。最后如下圖

重啟服務(wù)器,在windows服務(wù)器中輸入www.bbb.com正常跳轉(zhuǎn)?。。?/p>
3. Nginx過(guò)濾掉特定日志
打開(kāi)nginx的配置文件
vim /usr/local/nginx/conf/nginx.conf
我們會(huì)發(fā)現(xiàn)在配置文件中定義了錯(cuò)誤日志的位置和日志的格式

我們可以定義日志的格式
log_format? main '$remote_addr - $remote_user [$time_local] "$request"''"$status" $body_bytes_sent "$http_referer"''"$http_user_agent" "$http_x_forwarded_for"''"$gzip_ratio" $request_time $bytes_sent $request_length';
log_format是用來(lái)定義日志的格式的,我覺(jué)得和css樣式表很想,后面跟的main就是這個(gè)格式的名字,自己還因?yàn)檫@個(gè)main困惑了好久。后面這些就是日志的格式了,我們來(lái)看下:
$remote_addr, $http_x_forwarded_for(反向) 記錄客戶端IP地址
$remote_user 記錄客戶端用戶名稱
$request 記錄請(qǐng)求的URL和HTTP協(xié)議
$status 記錄請(qǐng)求狀態(tài)
$body_bytes_sent 發(fā)送給客戶端的字節(jié)數(shù),不包括響應(yīng)頭的大小; 該變量與Apache模塊mod_log_config里的“%B”參數(shù)兼容。
$bytes_sent 發(fā)送給客戶端的總字節(jié)數(shù)。
$connection 連接的序列號(hào)。
$connection_requests 當(dāng)前通過(guò)一個(gè)連接獲得的請(qǐng)求數(shù)量。
$msec 日志寫(xiě)入時(shí)間。單位為秒,精度是毫秒。
$pipe 如果請(qǐng)求是通過(guò)HTTP流水線(pipelined)發(fā)送,pipe值為“p”,否則為“.”。
$http_referer 記錄從哪個(gè)頁(yè)面鏈接訪問(wèn)過(guò)來(lái)的
$http_user_agent 記錄客戶端瀏覽器相關(guān)信息
$request_length 請(qǐng)求的長(zhǎng)度(包括請(qǐng)求行,請(qǐng)求頭和請(qǐng)求正文)。
$request_time 請(qǐng)求處理時(shí)間,單位為秒,精度毫秒; 從讀入客戶端的第一個(gè)字節(jié)開(kāi)始,直到把最后一個(gè)字符發(fā)送給客戶端后進(jìn)行日志寫(xiě)入為止。
$time_iso8601 ISO8601標(biāo)準(zhǔn)格式下的本地時(shí)間。
$time_local 通用日志格式下的本地時(shí)間。
然后我們要打開(kāi)日志,并且調(diào)用這些定義過(guò)的日志格式
語(yǔ)法:
access_log path(存放路徑) format (自定義日志名稱)
實(shí)例:
access_log logs/liuke.access.log main;
其實(shí)如果不指定日志的格式,默認(rèn)就是使用main格式的日志,當(dāng)然我們可以指定其他類型的日志,但是必須要是前面定義過(guò)的格式哦。
錯(cuò)誤日志error_log的定義
error_log 日志路徑 日志級(jí)別
error_log /yourpath/error.log crit;
其中crit是日志級(jí)別,所有的錯(cuò)誤日志級(jí)別如下
debug, info, notice, warn,error, crit
上述排列的日志級(jí)別,記錄的錯(cuò)誤信息由多到少,嚴(yán)重級(jí)別由低到高
錯(cuò)誤日志的默認(rèn)級(jí)別是crit
不記錄某種文件類型的日志
配置nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
在相應(yīng)的server中加入如下配置信息
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
access_log off;
}
重啟服務(wù)器
service nginx restart
即可關(guān)閉以gif|jpg等文件的訪問(wèn)日志了。
4. Nginx日志切割
nginx 沒(méi)有 apache 自動(dòng)切割的工具,但是我們可以自己寫(xiě)腳本,也可以借助 CentOS 自帶的日志歸檔工具 logrotate
4.1. 使用腳本分割日志
首先確定我們的要分割的日志路徑,然后就是要確定我們的nginx的pid文件所在的路徑,對(duì)我我的機(jī)器而言,要切割的日志文件為/usr/local/nginx/logs/liuke-access.log,而我的pid就在/usr/local/nginx/logs/nginx.pid(在nginx的配置文件中可以找到相應(yīng)的配置)
編寫(xiě)腳本
vim /usr/local/sbin/nginx_logrotate.sh
寫(xiě)入如下內(nèi)容:
#! /bin/bash
?d=`date -d "-1 day" +%Y%m%d`?
/bin/mv /home/logs/www_access.log /home/logs/$d_www_access.log?
/bin/kill -HUP `cat /usr/local/nginx/var/nginx.pid`
這是一個(gè)SHELL腳本,d等于的是前一天的當(dāng)前時(shí)間,然后用mv將當(dāng)天的日志更名,然后重新加載服務(wù)器配置
kill -HUP pid : pid 是進(jìn)程標(biāo)識(shí)。更改配置而不kill服務(wù)。在對(duì)配置文件作必要的更改后,發(fā)出該命令以動(dòng)態(tài)更新服務(wù)配置。
然后我們寫(xiě)一個(gè)計(jì)劃任務(wù)書(shū),每天0點(diǎn)0分執(zhí)行這個(gè)腳本
crontab -e
在彈出的頁(yè)面中編輯
0 0 * * * sh /usr/local/sbin/nginx_logrotate.sh
這段代碼意思是每天的0:0執(zhí)行后面的這個(gè)腳本
4.2 借助系統(tǒng)的logrotate工具實(shí)現(xiàn)
Logrotate是Linux下一款日志管理工具,可用于日志文件的轉(zhuǎn)儲(chǔ)(即刪除舊日志文件,創(chuàng)建新日志文件)??梢愿鶕?jù)日志大小或者按照某時(shí)段間隔來(lái)轉(zhuǎn)儲(chǔ),內(nèi)部使用cron程序來(lái)執(zhí)行。Logrotate還可以在壓縮日志,并發(fā)送到指定E-mail。
logrotate的配置文件在/etc/logrotate.d/nginx
vim /etc/logrotated.d/nginx
然后加入以下配置
/home/logs/*.log {
Daily
Missingok
rotate 52
compress
delaycompress
notifempty
create 644 nobody nobody
sharedscripts
postrotate
[ -f /usr/local/nginx/var/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/var/nginx.pid`Endscript
}
我們來(lái)看下logsrotate的參數(shù):
compress 通過(guò)gzip 壓縮轉(zhuǎn)儲(chǔ)以后的日志
nocompress 不需要壓縮時(shí),用這個(gè)參數(shù)
copytruncate 用于還在打開(kāi)中的日志文件,把當(dāng)前日志備份并截?cái)?/p>
nocopytruncate 備份日志文件但是不截?cái)?/p>
create mode owner group 轉(zhuǎn)儲(chǔ)文件,使用指定的文件模式創(chuàng)建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用時(shí),轉(zhuǎn)儲(chǔ)的日志文件到下一次轉(zhuǎn)儲(chǔ)時(shí)才壓縮
nodelaycompress 覆蓋 delaycompress 選項(xiàng),轉(zhuǎn)儲(chǔ)同時(shí)壓縮。
errors address 專儲(chǔ)時(shí)的錯(cuò)誤信息發(fā)送到指定的Email 地址
ifempty 即使是空文件也轉(zhuǎn)儲(chǔ),這個(gè)是 logrotate 的缺省選項(xiàng)。
notifempty 如果是空文件的話,不轉(zhuǎn)儲(chǔ)
mail address 把轉(zhuǎn)儲(chǔ)的日志文件發(fā)送到指定的E-mail 地址
nomail 轉(zhuǎn)儲(chǔ)時(shí)不發(fā)送日志文件
olddir directory 轉(zhuǎn)儲(chǔ)后的日志文件放入指定的目錄,必須和當(dāng)前日志文件在同一個(gè)文件系統(tǒng)
noolddir 轉(zhuǎn)儲(chǔ)后的日志文件和當(dāng)前日志文件放在同一個(gè)目錄下
prerotate/endscript 在轉(zhuǎn)儲(chǔ)以前需要執(zhí)行的命令可以放入這個(gè)對(duì),這兩個(gè)關(guān)鍵字必須單獨(dú)成行
postrotate/endscript 在轉(zhuǎn)儲(chǔ)以后需要執(zhí)行的命令可以放入這個(gè)對(duì),這兩個(gè)關(guān)鍵字必須單獨(dú)成行
daily 指定轉(zhuǎn)儲(chǔ)周期為每天
weekly 指定轉(zhuǎn)儲(chǔ)周期為每周
monthly 指定轉(zhuǎn)儲(chǔ)周期為每月
rotate count 指定日志文件刪除之前轉(zhuǎn)儲(chǔ)的次數(shù),0 指沒(méi)有備份,5 指保留5 個(gè)備份
tabootext [+] list 讓logrotate 不轉(zhuǎn)儲(chǔ)指定擴(kuò)展名的文件,缺省的擴(kuò)展名是:.rpm-orig, .rpmsave, v, 和 ~
size size 當(dāng)日志文件到達(dá)指定的大小時(shí)才轉(zhuǎn)儲(chǔ),Size 可以指定 bytes (缺省)以及KB (sizek)或者M(jìn)B (sizem).