一、nginx 介紹
1.1 特性:
模塊化設計,較好的擴展性
高可靠性
支持熱部署:不停機更新配置文件,升級版本,更換日志文件
低內存消耗:10000 個keep-alive 連接模式下的非活動連接,僅需要2.5M 內存
event-driven,aio,mmap,sendfile
基本功能:
靜態資源的web 服務器
http 協議反向代理服務器,負載均衡
pop3/imap4 協議反向代理服務器
FastCGI(lnmp),uWSGI(python) 等協議
模塊化(非DSO ),如zip ,SSL模塊
web 服務相關的功能:
虛擬主機(server)
支持 keep-alive 和管道連接
訪問日志(支持基於日志緩沖提高其性能)
url rewirte
路徑別名
基於IP 及用戶的訪問控制
支持速率限制及並發數限制
重新配置和在線升級而無須中斷客戶的工作進程
Memcached 的GET 接口
1.2 nginx 架構
nginx 的程序架構:master/worker 結構
一個master 進程:
負載加載和分析配置文件、管理worker 進程、平滑升級
一個或多個worker 進程
處理並響應用戶請求
緩存相關的進程:
cache loader :載入緩存對象
cache manager:管理緩存對象
1.3 nginx 高度模塊化
但其模塊早期不支持DSO 機制;1.9.11版本支持動態裝載和卸載
模塊分類:
核心模塊:core module
標准模塊:
• HTTP : 模塊: ngx_http_*
HTTP Core modules 默認功能
HTTP Optional modules 需編譯時指定
• Mail 模塊 ngx_mail_*
• Stream 塊 模塊 ngx_stream_*
第三方模塊
1.4 nginx 的功用
靜態的web 資源服務器
html,圖片,js ,css ,txt 等靜態資源
結合FastCGI/uWSGI/SCGI等協議反向代理動態資源請求:
http/https 協議的反向代理
imap4/pop3 協議的反向代理
tcp/udp 協議的請求轉發(反向代理)
二、nginx 目錄結構和命令
2.1 nginx 命令
ls /usr/local/nginx/
html 是測試頁,sbin 是主程序 ls/usr/local/nginx/sbin/
nginx 只有一個程序文件 ls/usr/local/nginx/html/
50x.html index.html 測試網頁
Nginx:
默認為啟動nginx
-h 查看幫助選項
-V 查看版本和配置選項
-t 測試nginx語法錯誤
-c filename 指定配置文件(default:/etc/nginx/nginx.conf)
-s signal 發送信號給master 進程,signal 可為:
stop, quit,reopen, reload 示例:-s stop 停止nginx -s
reload 加載配置文件
注意:不要和systemctl 混合使用
-g directives 在命令行中指明全局指令
2.2 配置文件的組成部分:
主配置文件:nginx.conf
子配置文件:include conf.d/*.conf
fastcgi,uwsgi ,scgi 等協議相關的配置文件
mime.types :支持的mime 類型
主配置文件的配置指令:
directive value [value2 ...];
注意:
(1) 指令必須以分號結尾
(2) 支持使用配置變量
內建變量:由Nginx 模塊引入,可直接引用
自定義變量:由用戶使用set 命令定義
set variable_name value;
引用變量:$variable_name
三、nginx 主配置文件的介紹和設置
3.1 Main 全局配置段常見的配置指令分類
3.1.1 介紹
- 正常運行必備的配置
- 優化性能相關的配置
- 用於調試及定位問題相關的配置
- 事件驅動相關的配置
3.1.2 一些設置
3.2 http 協議段的相關配置
格式介紹
3.3 與套接字相關的配置
1)server 配置虛擬主機
2)listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number]
[rcvbuf=size] [sndbuf=size]
default_server 設定為默認虛擬主機
ssl 限制僅能夠通過ssl 連接提供服務
backlog=number 超過並發連接數后,新請求進入后援隊列的長度
rcvbuf=size 接收緩沖區大小
sndbuf=size 發送緩沖區大小
注意:
(1)基於port:
listen PORT; 指令監聽在不同的端口
(2)基於ip 的虛擬主機:
listen IP:PORT; IP 地址不同
(3)基於hostname:
server_name fqdn; 指令指向不同的主機名
3) server_name name ...;
虛擬主機的主機名稱后可跟多個由空白字符分隔的字符串
支持* 通配任意長度的任意字符
server_name .magedu.com www.magedu.
支持~ 起始的字符做正則表達式模式匹配,性能原因慎用
server_name ~^www\d+.magedu.com$
\d 表示 [0-9]
匹配優先級機制從高到低:
(1)首先是字符串精確匹配 如:www.magedu.com
(2)左側 通配符 如:.magedu.com
(3)右側 通配符 如:www.magedu.
(4)正則表達式 如: ~^.*.magedu.com$ ,因為消耗cpu運算
(5)default_server
4)tcp_nodelay on | off;
在長連接的情況下,是否延遲
在keepalived 模式下的連接是否啟用TCP_NODELAY 選項
當為off 時,延遲發送,合並多個請求后再發送
默認On 時,不延遲發送
可用於:http, server, location
5)sendfile on | off;
是否啟用sendfile功能,在內核中封裝報文直接發送,默認Off
6)server_tokens on | off | build | string
是否在響應報文的Server 首部顯示nginx版本
3.4 定義路徑相關的配置
7)root
設置web 資源的路徑映射;用於指明請求的URL 所對應的文檔的主目錄路徑。
示例:
注意:root 不僅可以用在server段,還可用於http、server、location、if in locatin
8)location [ = | ~ | ~* | ^~ ] uri { ... }
主要控制URL路徑
location @name { … }
在一個server 中location 配置段可存在多個,用於實現從uri到文件系統的路徑映射;ngnix 會根據用戶請求的URI 來檢查定義的所有location ,並找出一個最佳匹配,而后應用其配置
示例:
(1)
http://www.magedu.com/images/logo.jpg –> /data/imgs/images/logo.jpg
(2) = :對URI 做精確匹配;
http://www.magedu.com/index.html 不匹配
(3) 正則符號的作用
^~ :對URI 的最左邊部分做匹配檢查,不區分字符大 小寫
~ :對URI 做正則表達式模式匹配,區分字符大小寫
~* :對URI 做正則表達式模式匹配,不區分字符大小寫
不帶符號:匹配起始於此uri 的所有的uri
(4) 匹配優先級從高到低:
=, ^~, ~/ ~*, 不帶符號
9)alias path;
路徑別名,文檔映射的另一種機制;僅能用於location 上下文
示例:
注意:location 中使用root 指令和alias 指令的意義不同
(a) root ,給定的路徑對應於location 中的/uri/左 側的/
(b) alias ,給定的路徑對應於location 中的/uri/右 側的/,完全置換
(10)index file ... ;
指定默認網頁資源,注意:ngx_http_index_module
模塊
例:
(11)error_page code ... [=[response]] uri;
錯誤頁面
基於ngx_http_core_module
模塊。
定義錯誤頁, 以指定的響應狀態碼進行響應
可用位置:http, server,location, if in location
(12)try_files file ... uri ;
try_files file ... =code ;
按順序檢查文件是否存在,返回第一個找到的文件或文件夾(結尾加斜線表示為文件夾),如果所有的文件或文件夾都找不到,會進行一個內部重定向到最后一個參數。只有最后一個參數可以引起一個內部重定向,之前的參數只設置內部URI 的指向。最后一個參數是回退URI 且必須存在,否則會出現內部500 錯誤
3.5 定義客戶端請求的相關配置
(13)keepalive_timeout timeout [header_timeout];
設定保持長連接超時時長,0 表示禁止長連接,默認為75s
(14)keepalive_requests number;
在一次長連接上所允許請求的資源的最大數量,默認為100
(15)keepalive_disable none | browser …
略,沒有那么老版本的瀏覽器對哪種瀏覽器禁用長連接
(16)send_timeout time;
向客戶端發送響應報文的超時時長,此處是指兩次寫操作之間的間隔時長,而非整個響應過程的傳輸時長
(17)client_body_buffer_size size; 緩存,hash值,取32位的后1位,2位,2位做幾級目錄
用於接收每個客戶端請求報文、上傳的body 部分的緩沖區大小;默認為16k ;超出此大小時,其將被暫存到磁盤上的由client_body_temp_path指令所定義的位置
(18)client_body_temp_path path
[level1 [level2 [level3]]];
設定用於存儲客戶端請求報文的body 部分的臨時存儲路徑及子目錄結構和數量
目錄名為16 進制的數字;
1級目錄占1 位16進制,即2^4=16個目錄 0-f
2級目錄占2 位16進制,即2^8=256個目錄 00-ff
3級目錄占2 位16進制,即2^8=256個目錄 00-ff
3.6 對客戶端進行限制的相關配置
(19)limit_rate rate; 限速
限制響應給客戶端的傳輸速率,單位是bytes/second,默認值0表示不限速
(20)limit_except method … { … } ,僅用於location,限制客戶端使用除了指定的請求方法之外的其它方法
method
:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK, PATCH
上述代碼的意思是:除了GET 和HEAD 之外的其它方法,僅允許192.168.1.0/24網段主機
3.7文件操作優化的配置
(21)aio on | off | threads[=pool]; 是否啟用aio 異步io功能,異步寫磁盤
(22)directio size | off; 是否同步(直接)寫磁盤,而非寫緩存,在Linux 主機啟用O_DIRECT標記, 則文件大於等於給定大小時使用,例如directio 4m
(23)open_file_cache off;
nginx 可以緩存以下三種信息:(緩存詳細介紹見我的下一篇博客
Nginx實現負載均衡&Nginx緩存功能)
① 文件元數據:文件的描述符、文件大小和最近一次的修改時間
② 打開的目錄結構
③ 沒有找到的或者沒有權限訪問的文件的相關信息
max=N:可緩存的緩存項上限;達到上限后會使用LRU (最近最少使用)算法實現管理
inactive=time:緩存項的非活動時長,在此處指定的時長內未被命中的或命中的次數少於open_file_cache_min_uses 指令所指定的次數的緩存項,即為非活動項,將被刪除
(24)open_file_cache_errors on | off;
是否緩存查找時發生錯誤的文件一類的信息 ,默認值為off
(25)open_file_cache_min_uses number;
open_file_cache 指令的inactive 參數指定的時長內,至少被命中此處指定的次數方可被歸類為活動項,默認值為1
(26)open_file_cache_valid time;
緩存項有效性的檢查頻率,默認值為 為60s
四、nginx重要配置
4.1 權限控制
實現權限控制的是ngx_http_access_module
模塊,他是用來實現基於ip
的訪問控制功能:
設置語法如下:
這個設置在http
,server
,location
,limit_except
段都可以使用。
在讀取的時候,是自上而下的檢查,一旦匹配,就會生效,所以,我們在設置的時候,需要把條件嚴格的置前。
示例:
4.2 身份驗證
nginx
中實現身份驗證的模塊是ngx_http_auth_basic_module
,這個模塊是用來實現基於用戶的訪問控制,使用basic
機制進行用戶認證。
我們使用以下命令來控制該驗證是否開啟:
具體的設置語法如下:
下面我們來看看用戶口令文件:
1)明文文本
格式為:
2)加密文本
由htpasswd
命令實現。該命令由httpd-tools
包提供。具體實現如下圖:
我們來具體說一下選項的作用:
-c
創建新用戶-m
使用基於md5的加密
4.3 狀態信息頁面
該頁面是基於ngx_http_stub_status_module
模塊實現的。用於輸出nginx
的基本狀態信息。
我們可以用瀏覽器來查看一下這個狀態頁面:
其中的“1 1 1”,這三個數字分別對應accepts,handled,requests 三個值。
上圖中每一段的含義如下: Active connections
: 當前狀態,活動狀態的連接數 accepts
:統計總值,已經接受的客戶端請求的總數 handled
:統計總值,已經處理完成的客戶端請求的總數 requests
:統計總值,客戶端發來的總的請求數 Reading
:當前狀態,正在讀取客戶端請求報文首部的連接的連接數 Writing
:當前狀態,正在向客戶端發送響應報文過程中的連接數 Waiting
:當前狀態,正在等待客戶端發出請求的空閑連接數
4.4 日志的設置
基於ngx_http_log_module
模塊,該模塊可以指定日志格式記錄的請求:
log_format name string …;
用來定義日志的格式,其中,string
可以使用nginx核心模塊及其他模塊內嵌的變量。
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
用來調用日志。定義了訪問日志文件的路徑,格式及相關的緩沖的配置。其中:
buffer=size
緩存大小
flush=time
多長時間清除緩存
示例如下:
(略) open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
緩存個日志文件相關的元數據信息,其中: max
:緩存的最大文件描述符數量; min_uses
:在inactive指定的市場內訪問大於等於此值,方可被當做活動項; inactive
:非活動時長; valid
:驗證緩存中各個緩存項是否為活動項的時間間隔。
4.5 壓縮
基於ngx_http_gzip_module
模塊。使用gzip方法壓縮相應數據,節約帶寬,默認設置沒有開啟。
gzip on | off ;
啟用或禁用gzip壓縮
gzip_comp_level level ;
壓縮比由低到高:1-9。默認為1。
gzip_disable regex … ;
匹配到客戶端瀏覽器不執行壓縮
gzip_min_length length ;
啟用壓縮功能的響應報文大小
gzip_http_version 1.0 | 1.1 ;
設定啟用壓縮功能時,協議的最小版本。默認為:1.1版本。
gzip_buffers number size ;
支持實現壓縮功能時緩沖區數量及每個緩存區的大小。默認為324k或168k。
gzip_types mime-type … ;
指明僅對哪些類型的資源執行壓縮操作;即壓縮過濾器
默認包含有text/html,不用顯示指定,否則會出錯
查看nginx的mime類型:cat /etc/nginx/mime.types
gzip_vary on | off ;
如果啟用壓縮,是否在響應報文首部插入“Vary: Accept-Encoding”
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any … ;
nginx:對於代理服務器請求的響應報文,在何種條件下啟用壓縮功能
off :對被代理的請求不啟用壓縮
expired,no-cache, no-store ,private :對代理服務器請求的響應報文首部Cache-Control 值任何一個,啟用壓縮功能
示例:
我們來測試一下壓縮效果:
4.6 ssl 加密的實現
1)server中的選項:
ssl on | off ;
為指定虛擬機啟用HTTPS protocol,建議用listen 指令代替
ssl_certificate file ;
當前虛擬主機使用PEM 格式的證書文件路徑
ssl_certificate_key file ;
當前虛擬主機上與其證書匹配的私鑰文件路徑
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] ;
支持ssl 協議版本,默認為后三個
ssl_session_cache off | none | [builtin[:size]] [shared:name:size] ;
builtin[:size]
:使用OpenSSL 內建緩存,為每worker 進程私有
[shared:name:size]
:在各worker 之間使用一個共享的緩存
ssl_session_timeout time;
客戶端連接可以復用ssl session cache 中緩存的ssl 參數的有效時長,默認5m
示例:
下面的實驗會講到在nginx中實現ssl加密的具體步驟,有興趣的走傳送器。
4.7 地址重寫
基於ngx_http_rewrite_module
模塊。
The ngx_http_rewrite_module module is used to change request URI using PCRE regular expressions,return redirects, and conditionally select configurations.
將用戶請求的URI 基於PCRE regex 所描述的模式進行檢查,而后完成重定向替換
示例:
4.7.1 rewrite 用法
將用戶請求的URI基於regex所描述的模式進行檢查,匹配到時將其替換為replacement指定的新的URI。
其語法是:
注意:如果在同一級配置塊中存在多個rewrite規則,那么會自下而下逐個檢查;被某條件規則替換完成后,會重新一輪的替換檢查。
隱含有循環機制,但不超過10次;如果超過,提示500響應碼, [flag]
所表示的標志位用於控制此循環機制。
如果replacement是以http://或https://開頭,則替換結果會直接以重向返回給客戶端。
下面我們來說一說flag
的具體選項: [flag]
:
last
:重寫完成后停止對當前URI在當前location中后續的其它重寫操作,而后對新的URI啟動新一輪(從第一個開始)重寫檢查;提前重啟新一輪循環。break
:重寫完成后停止對當前URI在當前location中后續的其它重寫操作,而后直接跳轉至重寫規則配置塊之后的其它配置;結束循環,建議在location中使用。redirect
:臨時重定向,重寫完成后以臨時重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發起請求;不能以http://或https://開頭,使用相對路徑,狀態碼: 302。permanent
:重寫完成后以永久重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發起請求,狀態碼:301。
由下圖我們可以更清楚的看出跳轉到的位置:
4.7.2 return用法
return的用法語法如下:
停止處理,並返回給客戶端指定的響應碼。
例:連續跳轉,image永久重定向到img,img又跳到www.baidu.com
4.7.3 一些其他的用法
rewrite_log on | off ;
把跳轉的信息寫到日志中
是否開啟重寫日志, 發送至error_log (notice level)
set $variable value ;
用戶自定義變量,注意:變量定義和調用都要以$ 開頭
if (condition) { … }
引入新的上下文, 條件滿足時,執行配置塊中的配置指令;server, location。其中: condition
可以為以下內容:
比較操作符:
== 相同
!= 不同
~ :模式匹配,區分字符大小寫
~* :模式匹配,不區分字符大小寫
!~ :模式不匹配,區分字符大小寫
!~* :模式不匹配,不區分字符大小寫
文件及目錄存在性判斷:
-e, !-e 存在(包括文件,目錄,軟鏈接)
-f, !-f 文件
-d, !-d 目錄
-x, !-x 執行
舉例:
實驗一:搭建lnmp及類小米等商業網站的實現
環境:關閉防火牆,selinux
1、安裝包,開啟服務
2、修改nginx的配置文件
我們將模板例子復制一份,去覆蓋我們的配置文件,接着,對配置文件進行修改:
修改下面幾類:
1)user nobody;
使用用戶 error_log /var/log/nginx/error.log info;
錯誤日志
2)
3)
4)
5)
以上五段全部修改完成后,可以使用nginx -t
檢查有沒有語法錯誤,如果沒有錯誤,就可以開啟服務了:
我們重啟服務,發現有warn(警告),這是因為我們的文件描述符最大值超出了系統的設置:
我們可以使用上述的命令來查看linux系統里打開文件描述符的最大值,一般缺省值是1024,對一台繁忙的服務器來說,這個值偏小,所以有必要重新設置linux系統里打開文件描述符的最大值
現在我們就可以再次重啟服務了,就不會有問題了。
3、修改php-fpm的配置文件
然后我們就可以重啟服務了:
4、運行mysql ,創建一會網頁需要的庫
5、把事先找好的小米網站傳進來 rz
6、網頁登錄
1)用戶:admin
密碼:123456
2)參數設置:就是連接上自己的數據庫
也可以在命令行連上自己的數據庫:
3)把數據寫到數據庫中,恢復數據
7、實驗成功,登錄查看
后台登錄,可以自己隨便修改:http://192.168.30.107/admin
8、ab 可以壓力測試
實驗二:實現ssl 加密
1、 修改總配置文件
在/etc/nginx/nginx.conf中加一行:
2、修改子配置文件
3、創建自簽名證書
由於我們之前設定了秘鑰加密,這樣接下來比較不方便。所以,我們把私鑰解密: