Nginx學習筆記

Nginx特性:

模塊化設計,較好的擴展性

高可靠性:採用master/worker模型。

支持熱部署

不需要停機即可更新配置文件、更換日誌、更新服務器版本

低內存消耗

10000個keep-alive連接模式下的非活動連接僅消耗2.5M內存

支持event-driven,alo,mmap


Nginx基本功能:

靜態資源的web服務器:

http協議的反向代理服務器:

pop3,smtp,imap4等郵件協議的反向代理(很少用)

能緩存打開的文件(元數據)、支持FastCGI(php-fpm),uWSGI(Python Web Framwork)等協議

模塊化(非DSO機制),過濾器壓縮zip、SSI、SSL

web服務相關的功能:

支持虛擬主機(server),keepalive,訪問日誌(支持基於日誌緩衝,提高其性能)、url rewirte 、支持路徑別名、基於IP及用戶的訪問控制、支持速率限制及連接數限制

Nginx架構:

master/worker

一個master進程,可生成一個或者多個worker進程

事件驅動:epoll(Linux),kqueue(FreeBSD),/dev/poll(Solaris)

支持sendFile,sendfile64

支持AIO,mmap(內存映射)

master:加載配置文件,管理worker進程,平滑級。。

worker:http服務,http代理,fastcgi代理

模塊類型:

核心模塊:core module

Standard HTTP module

OptionalHTTP module

Mail modules

3rd part modules

用來做什麼?

靜態資源的web服務器

http服務器反向代理

Nginx安裝配置:


yum groupinstall "Develop Tools " "Server platform"


yum install openssl-devel zlib-devel pcre-devel


#./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_status_module --with-debug


#make && make install



配置文件的組成部分:

主配置文件:nginx.conf

包含文件:include conf.d/*.conf -->/etc/nginx/conf.d/*.conf

fastcgi的配置文件:fastcgi_params

  uwcgi_params

  scgi_params



配置文件的配置指令(必須以分號結尾):

Directive value1[value2....];

支持使用變量:

內置變量:由模塊引入;

自定義變量:

set variable value;

引用變量:$variable


配置文件的組織結構:主要有以下三段

main block

event{

.... #配置系統調用的相關

}

http{

.....#http相關的所有配置

}

詳解:

http配置段:

http{

....

upstream{

.....#定義一個負載均衡的容器的反向代理

}

server{

.....

servername

root

alias

location /url{

.....

}

}

server{

.....

}

}

main 配置段:

類別:

正常運行必備的配置:

優化性能相關的配置:

用於調試、定位問題的配置:

詳解:

1、正常運行必備的配置:

1.user USERNAME[GROUPNAME]

指定用於運行worker進程的用戶和組,如果編譯的時候沒有指定用戶,則使用配置文件裏面的

user nginx nginx;

2.pid /PATH/TO/PID_FILE

指定nginx進程的pid文件路徑

pid /var/run/nginx.pid;

3、worker_rlimit_nofile #NUM;

指定一個worker進程可以打開最大的文件描述符數

worker_rlimit_nofile 1024;

4、worker_rlimit_sigpending #NUM;

指定每個用戶能夠發往worker進程的信號的數量;

worker_rlimit_sigpending 1024;

2、性能優化的配置:

1.worker_processes #NUM

worker進程的個數;通常應爲物理CPU核心數減1

可以爲“auto”,實現自動設定

2.worker_cpu_affinlty CPUMASK ..;

CPUMASK:

0001

0010

0100

work_cpu_affinity 00001 00010 00100;

3.work_priority nice:

[-20,19]

調試、定位問題的配置:

1、daemon[on|off]

是否以守護進程方式啓動nginx

2、master_process on|off

是否以master/worker模型運行nginx

3、error_log /PATH/TO/ERROR_LOG level

錯誤日誌文件目錄及級別;出於調試需要,可以設定爲debug,但debug僅在編譯時使用“--with-debug”選項纔有效。

Nginx.conf的配置:

main配置段

event{

...

}

1、worker_connection

每個worker進程所能相應的最大併發請求數量;

總數量 = worker_processes *worker_connection

2、use [epool|rgsig|select|poll]

定義使用的事件模型;建議讓Nginx自動選擇

3、accept_mutex[on|off]

各worker接收用戶的請求的負載均衡鎖;啓動時,表示用於讓多個worker輪流地,序列化地相應新請求;

4、lock_file /PATH/TO/LOCK_FILE;

http配置段:

http{

...

server{

...

server_name 

root 

}

}

套接字相關指令

1、server{}

定義一個虛擬主機;

server{

listen PORT;

server_name NAME;

root /PATH/TO/DOCUMENTROOT;

}

注意:

(1)基於port:

listen指令監聽在不同的端口;

(2)基於hostname

server_name指令指向不同的主機名

2、listen

listen address[:port][default_server][ssl][http2|spdy]

listen port[default_server][ssl][http2 | spdy]

default_server:設置默認虛擬主機;用於基於IP地址,或使用了任意不能對應於任何一個server的name時所返回站點;

ssl:用於限制只能通過ssl連接提供服務;

spdy:SPDY PROTOCOL(speedy),在編譯時必須編譯了spdy模塊的情況下,用於支持SPDY協議

http2:http version2;

3、server_name NAME[NAME2...]

後可跟一個或者多個主機名;名稱還可以使用通配符和正則表達式(~)

匹配順序:

(1)首先做精確匹配,如:www.example.com

(2)匹配左側通配符,如:*.example.com

(3)匹配右側通配符,如:www.example.

(4)匹配正則表達式,如:~^.*\.example\.com$

(5)default_server

4、tcp_nodelay on|off

對keepalive模式下的連接是否啓用TCP_NODELAY選項,默認沒啓動。爲了避免開銷,如果啓動這個選項,自動會把很多小的報文合併成一個大的報文發送出去,這可能會造成一些異常,所以儘量不讓合併,這個要關閉爲好。

5、tcp_nopush on|off;

是否啓用TCP_NOPUSH(freebsd)或者TCP_CORK(linux)選項;盡在sendfile爲on時有用;默認爲off;

6、sendfile on|off;

是否啓用sendfile功能;

路徑相關的指令:

7、root

設置web資源的路徑映射,用於指明請求的URL所對應的文檔目錄路徑;

server{

...

server_name www.example.com;

root /data/www/vhost1;

}

http://www.example.com/p_w_picpaths/logo.jpg -->/d/data/www/vhost1/p_w_picpaths/log.jpg

server{

...

server_name www.example.com;

location /p_w_picpaths/{

root /data/imgs/;

...

}

}

http://www.example.com/p_w_picpaths/logo.jpg -->/data/imgs/log.jpg

8.location [= | ~|~*|^~] url{...}

 location@name{....}

功能;允許根據用戶請求的URL來匹配的各個location,匹配時,此請求將被對應的location塊中的配置所處理;簡言之,即用於爲需要用到專用配置的URL提供特定配置;

server{

...

server_name www.example.com;

root /data/www;

...

location /admin/{

....

root /data/www/admin/; #不指明就是root+ location_name

}

}

操作符:

=:URL的精確匹配;

~:做正則表達式匹配,區分字符大小寫;

~*:做正則表達式匹配,不區分字符大小寫;

^~:URL的左半部分匹配,不區分字符大小寫;

匹配優先級:精確匹配= > ^~ > ~|~* > 不帶符號的url

9、alias

只能用於location配置段,定義路徑別名;

location /p_w_picpaths/{

root /data/imgs/;

}

location /p_w_picpaths/{

alias /data/imgs/;

}

注意:

root指令:相當於指定location所在的目錄

/p_w_picpath/test.jpg --> /data/imgs/p_w_picpaths/test.jpg

alias指令:相當於指定/data/imgs/爲 p_w_picpaths的別名,p_w_picpaths就對應到/data/imgs/目錄 

/p_w_picpath/test.jpg --> /data/imgs/test.jpg

訪問http://../p_w_picpaths/1.jpg

10、index

index file ...;

指定默認主頁面

11、error_page code ..[=[response]] url;

根據http的狀態碼重定向錯誤頁面

error_page 404 /404.html

error_page 404=200 /404.html #以指定的響應碼進行相應,此處指定爲200  上面爲404

12、try_files file1 file2... uri;

try_files file1 file2... = code;

訪問的時候,會嘗試查找從第一個到N-1個文件,第一個找到的就是返回給請求者的資源,若1至N-1個文件都不存在,則跳轉至最後一個URI(必須不能匹配至當前location,由其他location定義的地方,防止死循環),或者返回定義的code

客戶端請求相關的配置:

13、keepalive_time 

設置keepalive連接的超時時長,0表示禁用長連接,默認爲75s

14、keepalive_requests NUM;

在keepalive連接上所允許請求的最大資源數量,默認爲100;

15、keepalive_disable none|browser...;

指明禁止爲何種瀏覽器使用keepalive功能;

16、send_time

發送響應報文的超時時長,默認爲60s。客戶端兩次響應時間間隔超過這個,服務端就會自動斷開連接。

17、client_body_buffer_size 8k|16k;

接收客戶端請求報文body的緩衝區大小,超出此指定大小,數據就不在內存中保存,將其移存到磁盤上,存在的位置,由client_body_temp_path 指定

18、client_body_temp_path path [level1 [ level2[ level3]]]

設定用於存儲客戶端請求body的臨時存儲路徑及子目錄結構和數量

level1 一級子目錄個數

level2 二級子目錄個數

level3 三級子目錄個數

client_body_temp_path /var/tmp/client_body 2 2 ; 

表示

19、limit_excpet METHOD{...}

對指定範圍之外的其他方法進行訪問控制

limit_excpet GET{

allow 192.168.80.0/24;

deny all;

}

20、limit_rate speed;

限制客戶端每秒中能夠傳輸的字節數,默認爲0表示無限制。

文件操作優化相關配置

21、aio on|off;

22、directio size | off;

超過指定大小,不在內存中緩衝,直接和磁盤交互讀取和存儲

23、open_file_cache off|max=N [inactive = time];

Nginx可以緩存一下3中信息:

(1)文件描述符,文件大小和最近一次的修改時間

(2)打開的目錄結構;

(3)沒有找到的或者沒有操作權限的相關信息。

max=N 表示可以緩存的最大條目上限;一但達到上線,則會使用LRU(最近最少算法)算法刪除最近最少使用的緩存項目

inactive =time 表示在指定的時長內沒有被訪問過的緩存項視爲無效項,予以刪除;

24、open_file_cache_errors on|off;

是否緩存找不到其路徑的文件,或者沒有權限訪問的文件相關信息

25、open_file_cache_valid time;

每隔多久檢查一次緩存中的有效項,默認爲60S;

26、open_file_cache_min_users NUM;

緩存項在非活動期限內最少應該被訪問的次數;

ngx_http_access_module模塊的配置(基於IP的訪問控制)

27、allow address | CIDR | unix: | all;

28、deny address | CIDR | unix: | all;

應用上下文:http, server, location, limit_except


ngx_http_auth_basic_module模塊的配置(basic認證)

29、auth_basic string | off;

使用http basic認證協議對用戶進行認證;

30、auth_basic_user_file file;

實現用戶認證的帳號文件;

文件格式:

name1:password1

name2:password2:comment

name3:password3

支持的密碼格式:

(1)encrypted with the crypt() function;

(2)md5

location /admin/{

auth_basic "Admin Area";

auth_basic_user_file /etc/nginx/.ngxhtpasswd;

}

下面爲生成.ngxhtpasswd文件的方法:

需要用到htpasswd命令,在httpd包中,因此需要安裝這個包,但是不用啓動服務。

# yum install -y httpd

# htpasswd -c -m /etc/nginx/.ngxhtpasswd tom  然後輸入2次密碼即可創建好tom用戶

# htpasswd  -m /etc/nginx/.ngxhtpasswd tom    第一次需要創建文件所以需要-c參數

ngx_http_log_module 模塊的配置(訪問日誌)

31、log_format name string ...;

定義日誌格式及其名稱,日誌格式通過調用內置變量來定義。

32、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

access_log off;

訪問日誌文件路徑、格式名稱以及緩存大小和刷寫時間間隔,建議設置緩存,以提升性能,但是會面臨異常退出丟失日誌

example:

log_format compression '$remote_addr - $remote_user [$time_local] '

                       '"$request" $status $bytes_sent '

                       '"$http_referer" "$http_user_agent" "$gzip_ratio"';


access_log /spool/logs/nginx-access.log compression buffer=32k;

33、open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

open_log_file_cache off;

ngx_http_stub_status_module 模塊的配置

34、stub_status;

通過指定的url輸出stub_status

Active connections: 291   #當前活動的客戶端連接數 包括等待的

server accepts handled requests #accepts 已接受的  handled 已處理完成的 requests 總請求數

16630948 16630948 31070465 

Reading: 6 Writing: 179 Waiting: 106 

#reading nginx正在讀取頭信息的數量

#Writing 正在發送響應報文的連接數量

#Waiting 等待nginx發送響應的空閒連接數量

ngx_http_referer_module模塊配置(基於請求報文的Referer首部的值做訪問控制) -->防盜鏈

35、valid_referers none | blocked | server_names | string ...;

none:請求報文不存在referer首部

blocked:請求報文中存在referer首部,但其沒有有效值,或者非以http:// https:// 開頭的

server_name:其值爲一個主機名

arbitrary string:直接字符串,可使用*通配符

regular expression:以~起始的正則表達式

內置變量:$invalid_referer(所有不符合valid_referer指定定義的引用請求均爲不合法引用)

example:

valid_referers none blocked server_names

*.example.com example.* www.example.org/galleries/

~\.google\.;

if($invalid_referer){

return 403; #也可以做重定向,做出類似於“圖片僅供XXX使用”

}

一個示例配置

user  nobody;

worker_processes  1;

error_log  logs/error.log  info;


events {

    worker_connections  1024;

}


http {

    server {

        listen          80;

        server_name     www.linuxidc.com;

        access_log      logs/linuxidc.access.log main;

        location / {

            index index.html;

            root  /var/www/linuxidc.com/htdocs;

        }

    }


    server {

        listen          80;

        server_name     www.Androidj.com;

        access_log      logs/androidj.access.log main;

        location / {

            index index.html;

            root  /var/www/androidj.com/htdocs;

        }

    }

}


mail {

    auth_http  127.0.0.1:80/auth.php;

    pop3_capabilities  "TOP"  "USER";

    imap_capabilities  "IMAP4rev1"  "UIDPLUS";


    server {

        listen     110;

        protocol   pop3;

        proxy      on;

    }

    server {

        listen      25;

        protocol    smtp;

        proxy       on;

        smtp_auth   login plain;

        xclient     off;

    }

}

學習視頻:http://edu.51cto.com/course/course_id-5550.html




























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章