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