1.選擇nginx的理由javascript
(1)支持高併發;(官方5w併發,實測3w併發,由於採用epoll網絡IO模型)php
(2)內存消耗少;(nginx+php-fcgi在3w併發下開啓10個nginx進程,消耗150mb內存,64個nginx進程消耗內存1280mb)css
(3)成本低廉;(開源免費,可用於商業,相對硬件f5成本低)html
(4)節省帶寬;java
(5)穩定高;nginx
(6)內置健康檢查功能;web
(7)支持反向代理;正則表達式
(8)支持負載均衡;(應用層)數據庫
2.網絡IO鏈接方法apache
分2種:阻塞IO(block IO)和多路複用IO(如今服務器多用);
阻塞IO:一個請求過來,只能幹這個事情,別的事情不能幹;(如同窗來找你,告訴他你的地址,且在宿舍門口等,在這個過程當中,一直等待,直到同窗找到你,期間你不能作任何事情)
多路複用IO:包含select和epoll模型;(select模型舉例如同窗來找你,告訴你同窗地址並在宿舍等,同窗來到宿舍門口仍是找不到你,就找樓管,樓管挨個宿舍去找,效率很慢;epoll模型舉例如同窗來找你,告訴你同窗地址並在宿舍等,同窗來到宿舍門口仍是找不到你,就找樓管,樓管處有人員登記數據庫,查看登記名冊,告訴你同窗在哪層樓多少號房間,這樣就快速找到你了)
3.nginx虛擬主機及相關配置
(1)nginx配置文件結構圖
......
event{
......
}
http{
......
server{
......
}
server{
......
}
}
(2)nginx虛擬主機
定義server,能夠基於端口、ip、域名作虛擬主機。
(3)nginx匹配規則
location語法:location=[=|~|~*|^~]/uri/{...}
~ 區分大小寫
~* 不區分大小寫
^~ 禁止表達式匹配
= 精確匹配
舉例如:
location =/{
#只匹配/的查詢
}
location /{
#匹配任何以/開頭的查詢,但正則與一些較長字符串被首先匹配
#./document/index.html
}
location ^~ /p_w_picpaths/{
#匹配任何以/p_w_picpaths/開頭的查詢,且中止搜索,不檢查正則
#./p_w_picpaths/1.gif
}
location ^* .(gif|jpg|jpeg)${
#匹配任何以gif,jpg,jpeg結尾的文件,但全部/p_w_picpaths/目錄的請求在上面處理,精確匹配
#./document/1.gif
}
解釋:url和uri
url:統一資源定位符,如http://www.onon.com/news/a10.html
uri:統一資源標示符,指具體的路徑,如news/a10.html
(4)自定義錯誤頁面
error_page 403 404 /40x.html;
location = /40x.html{
root /var/web/error/;
}
解釋:server中定義,其中/40x.html前面的/是指定義server指定文件root的路徑。
另針對error指定專門存放路徑,如上面的「root /var/web/error/」,至此就能夠將40x.html頁面放到改目錄下。
對於50x錯誤也一樣定義:
error_page 500 502 503 504 /50x.html
location = /50x.html{
root /var/web/error/;
}
(5)自動索引及別名功能
location /onon{
root /web/html;
index index.html;
autoindex on;
}
解釋:將/web/html目錄下的文件索引顯示
location /over/{
alias /data/web3/p_w_picpaths/toto/;
}
解釋:訪問/data/web3/p_w_picpaths/toto/top.jpg文件時,可使用/over/top.jpg訪問
(6)控制站點訪問
location /onon{
root /web/html;
index index.html;
autoindex on;
deny 192.168.0.110;
allow 192.168.0.0/24;
allow 192.168.1.12;
deny all;
}
(7)目錄身份驗證
/usr/local/apache/bin/htpasswd -c /home/nginx/conf/authdb webadmin
nginx auth_basic認證採用apache兼容的密碼文件,建立webadmin用戶,輸入密碼便可。
當訪問/onon時就會提示輸入用戶名和密碼。
location /onon{
root /web/html;
index index.html;
autoindex on;
auth_basic "Enter your user and password";
auth_basic_user_file /home/nginx/conf/authdb;
deny 192.168.0.110;
allow 192.168.0.0/24;
allow 192.168.1.12;
deny all;
}
(8)nginx狀態檢查
location /nginx_status{
stub_status on;
access_log off;
}
解釋:不須要開啓訪問日誌access_log;訪問目錄/nginx_status添加認證,見上;編譯的時候須要添加此模塊:--with-http_stub_status_module
(9)nginx rewrite
編譯時須要添加pcre庫,prel兼容正則表達式;
nginx rewrite是實現url/uri重寫;
語法指令:set、if、return、break、rewrite
語法規則:
=和!=
~ 區分大小寫
~* 不區分大小寫
!~和!~*
-f和!-f 判斷文件是否存在
-d和!-d 判斷目錄是否存在
-e和!-e 判斷文件或目錄是否存在
-x和!-x 判斷文件是否能夠執行
$1 - $9 位置化參數
全局變量(系統已定義好)
$arg_PARAMETER#這個變量包含GET請求中,若是有變量PARAMETER時的值。
$args #這個變量等於請求行中(GET請求)的參數,例如foo=123&bar=blahblah;
$binary_remote_addr#二進制的客戶地址。
$body_bytes_sent#響應時送出的body字節數數量。即便鏈接中斷,這個數據也是精確的。
$content_length#請求頭中的Content-length字段。
$content_type#請求頭中的Content-Type字段。
$cookie_COOKIE#cookie COOKIE變量的值
$document_root#當前請求在root指令中指定的值。
$document_uri#與$uri相同。
$host#請求主機頭字段,不然爲服務器名稱。
$hostname#Set to the machine’s hostname as returned by gethostname
$http_HEADER
$is_args#若是有$args參數,這個變量等於」?」,不然等於」",空值。
$http_user_agent#客戶端agent信息
$http_cookie#客戶端cookie信息
$limit_rate#這個變量能夠限制鏈接速率。
$query_string#與$args相同。
$request_body_file#客戶端請求主體信息的臨時文件名。
$request_method#客戶端請求的動做,一般爲GET或POST。
$remote_addr#客戶端的IP地址。
$remote_port#客戶端的端口。
$remote_user#已經通過Auth Basic Module驗證的用戶名。
$request_completion#若是請求結束,設置爲OK. 當請求未結束或若是該請求不是請求鏈串的最後一個時,爲空(Empty)。
$request_method#GET或POST
$request_filename#當前請求的文件路徑,由root或alias指令與URI請求生成。
$request_uri#包含請求參數的原始URI,不包含主機名,如:」/foo/bar.php?arg=baz」。不能修改。
$scheme#HTTP方法(如http,https)。
$server_protocol#請求使用的協議,一般是HTTP/1.0或HTTP/1.1。
$server_addr#服務器地址,在完成一次系統調用後能夠肯定這個值。
$server_name#服務器名稱。
$server_port#請求到達服務器的端口號。
$uri#不帶請求參數的當前URI,$uri不包含主機名,如」/foo/bar.html」。該值有可能和$request_uri 不一致。$request_uri是瀏覽器發過來的值。該值是rewrite後的值。例如作了internal redirects後。
if指令:
if($http_user_agent ~MSIE){
rewrite ^(.*)$ /msie/$1 break;
}
解釋:$http_user_agent用戶代理,如瀏覽器ie,firefox等;
~區分大小寫,MSIE瀏覽器ie;
^以什麼開始,$以什麼結尾,.*匹配任意字符串;$1位置符,/msie/$1指的是web所指向的root路徑下
的/msie/$1,如/data/web3/p_w_picpaths/toto/msie/index.html
return指令:
若是訪問url以「.sh」或「.bash」結尾,則返回狀態碼403
location ~.*.(sh|bash)?$
{
return 403;
}
解釋:「~」匹配大小寫,「.*」前面不論是什麼字符,「.(sh|bash)?$」以sh或bas,用$標識,「\」去掉其後面「.」的特殊意義的。403錯誤就是指error_page定義的錯誤。
rewrite指令:
最後一項參數flag標記,有如下:
last:完成rewrite,至關於apache的[L]標記,瀏覽器url地址不變;
break:本條規則匹配後就完成,終止匹配,瀏覽器url地址不變;
redirect:返回302臨時重定向,瀏覽器顯示跳轉後的url;
permanent:返回301永久重定向,瀏覽器顯示跳轉後的url;
案例:
1)將/bbs目錄重寫到/data
rewrite ^/bbs/?$ /data/ permanent;
location /data{
index index.html;
}
location /bbs{
rewrite ~/bbs/?$ /data/ permanent;
}
2)根據不一樣的瀏覽器將獲得不一樣的結果
if($http_user_agent ~MSIE){
rewrite ^(.*)$ /msie/$1 break;
}
server{
listen 80 default_server;
server_name www.onon.com;
index index.html;
root /data/www/onon;
if($http_user_agent ~Firefox){
rewrite ^(.*)$ /firefox/$1 break;
}
if($http_user_agent ~MSIE){
rewrite ^(.*)$ /msie/$1 break;
}
}
3)防止盜鏈
所謂防盜鏈就是別人網站的圖片引用咱們的網站上的,且點擊別人網站上的那個圖片,使用的是咱們網站的流量,只引用咱們網站的圖片,不會跳轉到咱們網站上來。
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv)$ {
valid_referers none blocked www.onon.com *.onon.com;
if ($invalid_referer) {
rewrite ^/(.*) http://www.onon.com/block.html;
}
}
4)實現域名跳轉
訪問www.onon.com跳轉到www.onbing.com
server{
listen 80 default_server;
server_name www.onon.com;
index index.html;
root /data/www/onon;
location / {
rewrite ~(.*)$ http://www.onbing.com$1 permanent;
}
}
5)URL rewrite和反向代理同時進行
location /news/ {
proxy_pass http://10.0.0.10;
}
location /health/ {
proxy_pass http://10.0.0.20;
}
(10)nginx日誌管理
語法以下:log_format name format (format ....)
自定義日誌格式以下:
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer"';
'"$http_user_agent" "$http_x_forwarded_for"';
$http_x_forwarded_for 記錄遠程用戶真實ip地址,不是緩存/代理服務器地址;
$remote_user 記錄遠程客戶端用戶名稱,通常不會記錄的;
$time_local 記錄訪問時間及地區,記錄用戶訪問時的本地時間;
$request 記錄請求的URL與HTTP協議,具體訪問的頁面;
$status 記錄請求的狀態,第一次成功訪問狀態爲200,再次訪問頁面未更新狀態爲304,頁面找不到時爲404
$body_bytes_sent 記錄發送給客戶端的文件主體內容大小
$http_referer 記錄是從哪一個頁面連接訪問過來的,如百度連接過來的;
$http_user_agent 記錄客戶端瀏覽器的相關信息
注意:上面定義的日誌格式,跟在access_log後面,error_log後面跟錯誤級別,以下:
access_log /data0/logs/nginx/www.onon.com-access.log main;
access_log /data0/logs/$server_name.log mylogformat buffer=32k;
解釋:main、mylogformat爲定義日誌格式時取名;$server_name爲自動獲取訪問地址,如www.onon.com,消耗資源;buffer=32k爲設置緩存區大小,只記錄日誌文件描述符。
error_log /data0/logs/nginx/www.onon.com-error.log warn;
解釋:warn爲錯誤級別,日誌等級有8個,分別爲:emerg、alert、crit、err、warn、notice、info、debug
開啓日誌緩存
每一條日誌記錄,日誌文件先打開文件,寫入日誌記錄,立刻關閉。
如何提升包含變量的日誌文件存放路徑性能?開啓open_log_file_cache
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;
解釋:max最大文件描述符數量,inactive設定時間內沒有使用此文件描述符,則自動刪除此描述符,
min_uses在inactive指定時間範圍內,若日誌文件超過被使用次數,則計入緩存,默認10秒,valid多長時間檢查一次,看日誌文件路徑和文件名是否仍然存在,默認60秒。
nginx日誌分割
vim /data/sh/nginxlog_cut.sh
#! /bin/bash
#nginx log 存放位置
logs_path="/data/logs/nglogcut/"
#將日誌更名
mkdir -p ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "%m")/
mv ${logs_path}access.log ${logspath}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "%m")/access$(date -d "yesterday" + "%Y%m%d").log
從新加載nginx服務
service nginx reload
添加計劃任務
chmod +x /data/sh/nginxlog_cut.sh
#crontab -l
01 01 * /bin/bash /data/sh/nginxlog_cut.sh
(11)nginx壓縮輸出
在http{}中間啓用壓縮
模塊:HttpGzipModule和HttpGzipStaticModule
前者用於啓用在文件傳輸過程當中使用gzip壓縮,然後者的做用是將一個文件以壓縮的方式傳遞到一個支持壓縮功能的客戶端以前,首先檢查是否已經存在相應的*.gz結尾的文件名格式,這樣避免重複壓縮而形成資源浪費。
對於nginx的網頁壓縮傳輸在nginx中的配置是將其分到兩種模式:一種是動態的,實時壓縮輸出(邊壓縮邊輸出),另外一種是靜態的,找到同名文件的.gz格式文件就輸出。
啓用gzip功能須要zlib庫的支持,--with-http_gzip_module;
編譯時須要指定--with-http_gzip_static_module
gzip(GNU-ZIP)是一種壓縮技術。通過gzip壓縮後頁面大小能夠變爲原來的30%甚至更小,這樣,用戶瀏覽頁面的時候速度會塊得多。gzip的壓縮頁面須要瀏覽器和服務器雙方都支持,實際上就是服務器端壓縮,傳到瀏覽器後瀏覽器解壓並解析。瀏覽器那裏不須要咱們擔憂,由於目前的巨大多數瀏覽器都支持解析gzip過的頁面。
#vim nginx.conf
http{
gzip on;
gzip_min_length 1k;
gzip_buffer 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
}
解釋:gzip on開啓gzip模塊,關閉使用off;
gzip_min_length設置容許壓縮的頁面最小字節數,頁面字節數從header頭的content-length中進行獲取。默認爲0,無論頁面多大都壓縮。建議設爲1k,小於1k可能會越壓越大;
gzip_buffer設置系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流。上面的設置爲以16k爲單位的4倍申請內存;
gzip_http_version識別http協議的版本,早期的瀏覽器不支持gzip壓縮,用戶會看到亂碼,因此爲了支持前期版本加了此選項,目前此項基本能夠忽略;
gzip_comp_level爲gzip壓縮比,分1-9等級,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu);
gzip_types匹配mime類型進行壓縮,不管是否指定,」text/html」類型老是會被壓縮的;
gzip_vary和http頭有關係,加個vary頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,因此避免浪費不支持的也壓縮,因此根據客戶端的HTTP頭來判斷,是否須要壓縮;
(12)nginx的瀏覽器本地緩存設置
#vim nginx.conf
location ~.*.(gif|jpg|jpeg|png|bmp|swf|flv)${
expires 30d;
}
location ~.*.(js|css|jsp)?${
expires 1h;
}
(13)設定限速(常見流媒體)
location /download {
limit_rate 256k;
proxy_pass http://www.onbing.com;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /movie {
limit_rate_after 10m;
limit_rate 100k;
}
解釋:前10m不限速,以後限速爲100k。
if($http_user_agent ~Google|Yahoo|baidu){
limit_rate 20k;
}
解釋:經過google,yahoo或baidu搜索引擎訪問進來的,限速爲20k。
(14)反向代理
正向代理和反向代理?正向就是一個從內向外的訪問,反向則是一個從外向內的訪問。正向和反向是一個相對的概念。
正向:典型應用爲在防火牆內的局域網客戶端提供訪問Internet的途徑;
相對於用戶,就是正向代理,代理用戶去請求; 讓nginx成爲正向代理,而將外網視爲整個後端在給咱們提供服務。
反向:典型應用爲將防火牆後面的服務器提供給Internet用戶訪問;
相對於內部的服務那麼nginx就是反向代理,代理接受用戶請求;
http {
client_body_buffer_size 600;
client_header_buffer_size 600;
client_max_body_size 300M;
proxy_buffering on;
proxy_cache_min_uses 3;
proxy_ignore_client_abort off;
proxy_intercept_errors on;
proxy_next_upstream error timeout invalid_header;
proxy_redirect off;
proxy_connect_timeout 60;
proxy_send_timeout 600;
proxy_read_timeout 600;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_temp_path /usr/local/nginx/proxy_temp;
proxy_cache_path /usr/local/nginx/proxy_cache/ levels=1:2
keys_zone=cache_onon:10m inactive=10m max_size=1000M;
location /weibo {
proxy_pass http://192.168.10.213;
proxy_set_header Host $host;
proxy_cache cache_onon;
proxy_set_header X-Forward-For $remote_addr;
}
location ~.*.(gif|jpg|jpeg|png|bmp|swf|flv|js|css|html)${
#狀態碼
proxy_cache cache_onon;
proxy_cache_valid 200 10m;
proxy_cache_valid 304 1m;
proxy_cache_valid 301 302 1h;
proxy_cache_valid any 1m;
#哈希key值
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forward-For $remote_addr;
proxy_pass http://192.168.1.66;
}
}
(15)負載均衡
upstream news_server_pool{
server 10.0.0.21:80 weight=1 max_fails=2 fail_timeout=30s;
server 10.0.0.22:80 weight=1 max_fails=2 fail_timeout=30s;
}
upstream tv_server_pool{
server 10.0.0.31:80 weight=1 max_fails=2 fail_timeout=30s;
server 10.0.0.32:80 weight=2 max_fails=2 fail_timeout=30s;
}
解釋:30s內檢測2次,失效就找下一個服務器。
location /news {
proxy_pass http://news_server_pool;
proxy_set_header Host $host;
proxy_set_header X-Forward-For $remote_addr;
}
location /tv {
proxy_pass http://tv_server_pool;
proxy_set_header Host $host;
proxy_set_header X-Forward-For $remote_addr;
}