顯示亂碼問題
server {
listen 80;
server_name example.com;
root /var/www/example;
location / {
charset utf-8; #一般是在個別的location中加入此項左权,具體情況具體對待
rewrite .* /index.html break;
}
}
index顯示列表(一般為企業(yè)內(nèi)部使用)
可在在location server 或 http段中加入
autoindex on;//自動顯示目錄
autoindex_exact_size off;//人性化方式顯示文件大小否則以byte顯示
autoindex_localtime on;//按服務器時間顯示楼咳,否則以gmt時間顯示
location用法
=:對URI做精確匹配苛蒲;
location = / {
...
}
~:對URI做正則表達式模式匹配霞扬,區(qū)分字符大小寫撒顿;
~*:對URI做正則表達式模式匹配,不區(qū)分字符大小寫;
^~:對URI的左半部分做匹配檢查,不區(qū)分字符大小寫煤篙;
不帶符號:匹配起始于此uri的所有的url;
location /lizi {
...
}
例如www.example.com/lizi/xxx/xxx
只要是路徑以/lizi開頭的都匹配毁腿,這種一般用于最后的通用匹配辑奈。
注意:匹配優(yōu)先級:=, ^~, ~/~*,不帶符號已烤;
具體匹配方式 http://seanlook.com/2015/05/17/nginx-location-rewrite/
常用優(yōu)化配置
1.網(wǎng)絡連接的優(yōu)化:
只能在events模塊設(shè)置鸠窗,用于防止在同一一個時刻只有一個請求的情況下,出現(xiàn)多個睡眠進程會被喚醒但只能有一個進程可獲得請求的尷尬草戈,如果不優(yōu)化塌鸯,在多進程的nginx會影響以部分性能侍瑟。
events {
accept_mutex on; #優(yōu)化同一時刻只有一個請求而避免多個睡眠進程被喚醒的設(shè)置唐片,on為防止被同時喚醒,默認為off涨颜,因此nginx剛安裝完以后要進行適當?shù)膬?yōu)化费韭。
}
2.隱藏ngxin版本號:
當前使用的nginx可能會有未知的漏洞,如果被黑客使用將會造成無法估量的損失庭瑰,但是我們可以將nginx的版本隱藏星持,如下:
server_tokens off; #在http 模塊當中配置
3.選擇事件驅(qū)動模型:
Nginx支持眾多的事件驅(qū)動,比如select弹灭、poll督暂、epoll揪垄,只能設(shè)置在events模塊中設(shè)置:
events {
accept_mutex on;
multi_accept on;
use epoll; #使用epoll事件驅(qū)動,因為epoll的性能相比其他事件驅(qū)動要好很多
}
4.配置單個工作進程的最大連接數(shù):
通過worker_connections number逻翁;進行設(shè)置饥努,numebr為整數(shù),number的值不能大于操作系統(tǒng)能打開的最大的文件句柄數(shù)八回,使用ulimit -n可以查看當前操作系統(tǒng)支持的最大文件句柄數(shù)酷愧,默認為為1024.
events {
worker_connections 102400; #設(shè)置單個工作進程最大連接數(shù)102400
}
5.配置允許sendfile方式傳輸文件:
是由后端程序負責把源文件打包加密生成目標文件,然后程序讀取目標文件返回給瀏覽器缠诅;這種做法有個致命的缺陷就是占用大量后端程序資源溶浴,如果遇到一些訪客下載速度巨慢,就會造成大量資源被長期占用得不到釋放(如后端程序占用的CPU/內(nèi)存/進程等)管引,很快后端程序就會因為沒有資源可用而無法正常提供服務士败。通常表現(xiàn)就是 nginx報502錯誤,而sendfile打開后配合location可以實現(xiàn)有nginx檢測文件使用存在褥伴,如果存在就有nginx直接提供靜態(tài)文件的瀏覽服務拱烁,因此可以提升服務器性能.
sendfile on; # 可以配置在http、server或者location模塊噩翠,配置如下:
sendfile_max_chunk 512k; #Nginxg工作進程每次調(diào)用sendfile()傳輸?shù)臄?shù)據(jù)最大不能超出這個值戏自,默認值為0表示無限制,可以設(shè)置在http/server/location模塊中伤锚。
6.會話保持時間:
用戶和服務器建立連接后客戶端分配keep-alive鏈接超時時間擅笔,服務器將在這個超時時間過后關(guān)閉鏈接,我們將它設(shè)置低些可以讓ngnix持續(xù)工作的時間更長屯援,1.8.1默認為65秒猛们,一般不超過120秒。
keepalive_timeout 65 60; #后面的60為發(fā)送給客戶端應答報文頭部中顯示的超時時間設(shè)置為60s:如不設(shè)置客戶端將不顯示超時時間狞洋。
Keep-Alive:timeout=60 #瀏覽器收到的服務器返回的報文
如果設(shè)置為0表示關(guān)閉會話保持功能弯淘,將如下顯示:
Connection:close #瀏覽器收到的服務器返回的報文
7.配置nginx worker進程最大打開文件數(shù)
worker_rlimit_nofile 65535;
8.配置nginx gzip壓縮實現(xiàn)性能優(yōu)化
圖片、視頻(流媒體)等文件盡量不要壓縮吉懊,因為這些文件大多都是經(jīng)過壓縮的庐橙,如果再壓縮很可能不會減小或減小很少,或者有可能增大借嗽,而在壓縮時還會消耗大量的CPU态鳖、內(nèi)存資源
gzip on; #表示開啟壓縮功能
gzip_min_length 1k; #表示允許壓縮的頁面最小字節(jié)數(shù),頁面字節(jié)數(shù)從header頭的Content-Length中獲取恶导。默認值是0浆竭,表示不管頁面多大都進行壓縮,建議設(shè)置成大于1K。如果小于1K可能會越壓越大
gzip_buffers 432k; #壓縮緩存區(qū)大小
gzip_http_version 1.1; #壓縮版本
gzip_comp_level 9; #壓縮比率
gzip_types text/css text/xml application/javascript; #指定壓縮的類型
gzip_vary on; #vary header支持
9.nginx expires功能
為用戶訪問網(wǎng)站的內(nèi)容設(shè)定一個過期時間邦泄,當用戶第一次訪問到這些內(nèi)容時删窒,會把這些內(nèi)容存儲在用戶瀏覽器本地,這樣用戶第二次及之后繼續(xù)訪問該網(wǎng)站顺囊,瀏覽器就會檢查已經(jīng)緩存在用戶瀏覽器本地的內(nèi)容易稠,就不會去瀏覽器下載了,直到緩存的內(nèi)容過期或者被清除為止包蓝。
## Add expires header according to URI(path or dir).
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
常用正則(跟Linux上的正則沒什么區(qū)別)
. : 匹配除換行符以外的任意字符
? : 重復0次或1次
+ : 重復1次或更多次
* : 重復0次或更多次
\d :匹配數(shù)字
^ : 匹配字符串的開始
$ : 匹配字符串的結(jié)束
{n} : 重復n次
{n,} : 重復n次或更多次
[c] : 匹配單個字符c
[a-z] : 匹配a-z小寫字母的任意一個
類似分組():小括號()之間匹配的內(nèi)容驶社,可以在后面通過
2表示的是前面第二個()里的內(nèi)容测萎。正則里面容易讓人困惑的是\轉(zhuǎn)義特殊字符亡电。
rewrite實例
http {
# 定義image日志格式
log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
# 開啟重寫日志
rewrite_log on;
server {
root /home/www;
location / {
# 重寫規(guī)則信息
error_log logs/rewrite.log notice;
# 注意這里要用‘’單引號引起來,避免{}
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
# 注意不能在上面這條規(guī)則后面加上“l(fā)ast”參數(shù)硅瞧,否則下面的set指令不會執(zhí)行
set $image_file $3;
set $image_type $4;
}
location /data {
# 指定針對圖片的日志格式份乒,來分析圖片類型和大小
access_log logs/images.log mian;
root /data/images;
# 應用前面定義的變量。判斷首先文件在不在腕唧,不在再判斷目錄在不在或辖,如果還不在就跳轉(zhuǎn)到最后一個url里
try_files /$arg_file /image404.html;
}
location = /image404.html {
# 圖片不存在返回特定的信息
return 404 "image not found\n";
}
}
if語句塊
- 例子是網(wǎng)上找的,if語句塊長用在做單獨的限制枣接,如限制訪問特定的資源颂暇,然后對此類請求做處理,rewire或者deny或者proxy_pass等等但惶。
- 例子中的set語句沒怎么用過耳鸯。也沒再去查資料,用的時候再查 = =
if ($http_user_agent ~ MSIE) {proxy_pass
rewrite ^(.*)$ /msie/$1 break;
} //如果UA包含"MSIE"膀曾,rewrite請求到/msid/目錄下
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
} //如果cookie匹配正則县爬,設(shè)置變量$id等于正則引用部分
if ($request_method = POST) {
return 405;
} //如果提交方法為POST,則返回狀態(tài)405(Method not allowed)添谊。return不能返回301,302
if ($slow) {
limit_rate 10k;
} //限速财喳,$slow可以通過 set 指令設(shè)置
if (!-f $request_filename){
break;
proxy_pass http://127.0.0.1;
} //如果請求的文件名不存在,則反向代理到localhost 斩狱。這里的break也是停止rewrite檢查
if ($args ~ post=140){
rewrite ^ http://example.com/ permanent;
} //如果query string中包含"post=140"耳高,永久重定向到example.com
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.jefflei.com www.leizhenfang.com;
if ($invalid_referer) {
return 404;
} //防盜鏈
}
https
- 定義一個新的server,配置如下喊废,必須的配置有l(wèi)isten ,server_name, ssl ,ssl_certificate, ssl_certificate_key,一般配置的時候我都是直接復制祝高,然后改主機名,證書私鑰文件污筷,日志路徑,root的根目錄這幾項。
- 如果想讓訪問80的轉(zhuǎn)到443瓣蛀,可用rewrite語句
listen 443;
server_name agent.t.jlhcar.com;
ssl on;
ssl_certificate, "/usr/local/certificate/agent.t.jlhcar.com.pem";\\證書
ssl_certificate_key "/usr/local/certificate/agent.t.jlhcar.com.key";\\私鑰
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\\協(xié)議
...
//日志以及root根目錄的其他配置
server {
listen 80;
server_name agent.xxx.com;
rewrite ^/(.*)$ https://agent.xxx.com/$1;
}
注意:曾經(jīng)遇到過這么一個坑陆蟆,http轉(zhuǎn)https的時候會將POST轉(zhuǎn)換為GET請求,此時需要這樣配置
server {
listen 80;
server_name dev-payment.xxxx.cn;
return 307 https://dev-payment.xxxx.cn$request_uri;
}
php后端處理(fastcgi)
location ~ \.php($|/) {
fastcgi_pass unix:/dev/shm/php-fpm.unix; //最重要的一項惋增,根據(jù)實際情況來配置(根據(jù)php的配置文件listen的配置來配置,其值可以是一個域名叠殷、IP地址:端口、或者是一個Unix的Socket文件诈皿。
)
fastcgi_index index.php; //當請求以/結(jié)尾的時候林束,會將請求傳遞給所設(shè)置的index.php文件處理。
fastcgi_split_path_info ^(.+\.php)(.*)$; //Nginx默認獲取不到PATH_INFO的值稽亏,得通過fastcgi_split_path_info指定定義的正則表達式來給$fastcgi_path_info賦值壶冒。
fastcgi_param PATH_INFO $fastcgi_path_info; //
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}
負載均衡和反向代理
- 在http配置段要配置一個upstream
upstream ucart{
server 119.29.48.27:80;
server 119.29.48.27:80;
}
注意:nginx中不識別_(下劃線),否則會出現(xiàn)400錯誤
然后再server配置段截歉,將所需要處理的請求反向代理至后端服務器胖腾,在可根據(jù)需要和服務器配置情況來定義權(quán)重,實現(xiàn)負載均衡
location /ucarapi/ {
proxy_pass http://ucar_t/;
proxy_connect_timeout 3; //連接超時時間
proxy_read_timeout 30;
proxy_set_header Host tapi.51ucar.cn; //HTTP頭信息,后端服務器根據(jù)此來找到特定虛擬主機
proxy_set_header X-Real-IP $remote_addr; //HTTP頭信息瘪松,真實IP
proxy_set_header X-Scheme $scheme;
}
喜歡我寫的東西的朋友可以關(guān)注一下我的公眾號,上面有我的學習資源以及一些其他福利咸作。:Devops部落