IO復用
單進程:阻塞
多進程:每個進程響應一個請求
進程量,進程切換次數過多
每個進程的地址空間是獨立,很多空間是重復的數據,所以內存使用效率較低
線程:thread
Light Weight Process
Linux 支持多少種類型的線程庫?如何切換線程庫?
每個線程響應一個請求:
線程依然切換:切換較之進程屬于輕量級
同一個進程的線程可共享進程的諸多資源,比如打開的文件
對內存的需求較之進程略有下降
快速切換時會帶來線程抖動
多進程多線程
多線程:N個請求
一個線程響應多個請求
Nginx
web服務器
反向代理
web
模塊化
Tengine
varnish,squid
nginx:cache(disk)
httpd:cache(disk,memory)
memcached
nginx:
server{}: 虛擬主機
location /URI/{
root "/web/htdocs"
}
httpd
<DocumentRoot>
</DocumentRoot>
<Location "/bbs">
</Location>
location[=|~|~*|^~|]uri{...}
location URI{}:
對當前路徑及子路徑下的所有對象都生效
locati URI {}:
精確匹配指定的路徑,不包括子路徑,因此,只對當前資源生效
location ~URI{}:
location ~*URI{}:
模式匹配URI,此處的URI可使用正則表達式,~區分字符大小寫,~*不區分字符大小寫
location ^~URI{}:
不使用正則表達式
htpasswd :第二次不能使用-選項
Stub Status模塊
已經接受連接的個數,已經處理的連接的個數,已經處理的請求的個數
reading :Nginx正在讀取其首部請求的個數
writing:Nginx正在讀取其主體的請求的個數、正處理著其請求的個數或者正在向其客戶發送響應的個數
waiting:長連接模式的保持的連接個數
傳統上基于進程或線程模型架構的web服務通過每進程或每線程處理并發連接請求,這勢必會在網絡和I/O操作時產生阻塞,其另一個必然結果則是對內存或CPU的利用率低下。生成一個新的進程/線程需要事先備好其運行時環境,這包括為其分配堆內存和棧內存,以及為其創建新的執行上下文等。這些操作都需要占用CPU,而且過多的進程/線程還會帶來線程抖動或頻繁的上下文切換,系統性能也會由此進一步下降。
在設計的最初階段,nginx的主要著眼點就是其高性能以及對物理計算資源的高密度利用,因此其采用了不同的架構模型。受啟發于多種操作系統設計中基于“事件”的高級處理機制,nginx采用了模塊化、事件驅動、異步、單線程及非阻塞的架構,并大量采用了多路復用及事件通知機制。在nginx中,連接請求由為數不多的幾個僅包含一個線程的進程worker以高效的回環(run-loop)機制進行處理,而每個worker可以并行處理數千個的并發連接及請求。
如果負載以CPU密集型應用為主,如SSL或壓縮應用,則worker數應與CPU數相同;如果負載以IO密集型為主,如響應大量內容給客戶端,則worker數應該為CPU個數的1.5或2倍。
Nginx會按需同時運行多個進程:一個主進程(master)和幾個工作進程(worker),配置了緩存時還會有緩存加載器進程(cache loader)和緩存管理器進程(cache manager)等。所有進程均是僅含有一個線程,并主要通過“共享內存”的機制實現進程間通信。主進程以root用戶身份運行,而worker、cache loader和cache manager均應以非特權用戶身份運行。
主進程主要完成如下工作:
1. 讀取并驗正配置信息;
2. 創建、綁定及關閉套接字;
3. 啟動、終止及維護worker進程的個數;
4. 無須中止服務而重新配置工作特性;
5. 控制非中斷式程序升級,啟用新的二進制程序并在需要時回滾至老版本;
6. 重新打開日志文件,實現日志滾動;
7. 編譯嵌入式perl腳本;
worker進程主要完成的任務包括:
1. 接收、傳入并處理來自客戶端的連接;
2. 提供反向代理及過濾功能;
3. nginx任何能完成的其它任務;
cache loader進程主要完成的任務包括:
1. 檢查緩存存儲中的緩存對象;
2. 使用緩存元數據建立內存數據庫;
cache manager進程的主要任務:
1. 緩存的失效及過期檢驗;
Nginx的配置有著幾個不同的上下文:main、http、server、upstream和location(還有實現郵件服務反向代理的mail)。配置語法的格式和定義方式遵循所謂的C風格,因此支持嵌套,還有著邏輯清晰并易于創建、閱讀和維護等優勢。
Nginx的代碼是由一個核心和一系列的模塊組成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;還用于啟用網絡協議,創建必要的運行時環境以及確保不同的模塊之間平滑地進行交互。不過,大多跟協議相關的功能和某應用特有的功能都是由nginx的模塊實現的。這些功能模塊大致可以分為事件模塊、階段性處理器、輸出過濾器、變量處理器、協議、upstream和負載均衡幾個類別,這些共同組成了nginx的http功能。事件模塊主要用于提供OS獨立的(不同操作系統的事件機制有所不同)事件通知機制如kqueue或epoll等。協議模塊則負責實現nginx通過http、tls/ssl、smtp、pop3以及imap與對應的客戶端建立會話。
在nginx內部,進程間的通信是通過模塊的pipeline或chain實現的;換句話說,每一個功能或操作都由一個模塊來實現。例如,壓縮、通過FastCGI或uwsgi協議與upstream服務器通信,以及與memcached建立會話等。
LEMP:
Enginx (FastCGI) + php-fpm
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
}
fastcgi
Nginx配置文件
main,
worker_process
error_log
user
group
events {
}
事件驅動相關
httpd {
}
關于http相關的配置
server {
}
虛擬主機
location URI {
directive <parameters>;
}
URI訪問屬性;
上下文
server {
listen 80;
server_name www.test.com;
location / {
后端服務器;
}
}
GET、POST、HEAD、PUT、TRACE、OPTIONS、CONNECTION、DELETE
nginx:
round-robin
ip_hash
least_conn
Nginx
cache:共享內存(存儲鍵和緩存對象元數據)
磁盤空間:存儲數據
proxy_cache_path: 不能定義在server{}上下文中;
緩存目錄:子目錄級別
proxy_cache_path /nginx/cache/first levels=1:2:1 keys_z max_size=1G;
cache_manager: LRU
WebDAV (Web-based Distributed Authoring and Versioning) 一種基于 HTTP 1.1協議的通信協議。它擴展了HTTP 1.1,在GET、POST、HEAD等幾個HTTP標準方法以外添加了一些新的方法,使應用程序可直接對Web Server直接讀寫,并支持寫文件鎖定(Locking)及解鎖(Unlock),還可以支持文件的版本控制。
另外常用的三種緩存:
open_log_cache:日志緩存
open_file_cache:
fastcgi_cache:
而nginx的limit限制也基于共享內存實現。
nginx: gzip
upstream phpsrvs {
server
server
}
upstream imgsrvs {
server
server
}
upstream staticfilesrvs {
server
server
}
location / {
root /web/htdocs;
index index.php index.html;
}
location ~* \.php$ {
fastcgi_pass http://phpsrvs;
}
location ~* "\.(jpg|jpeg|gif|png)$" {
proxy_pass http://imgsrvs;
}
rewirte: URL重寫模塊
if (condition) {
}
測試:
雙目測試:
~, !~
=, !=
~*, !~*
if ($request_method="POST") {
}
if ($request_uri ~* "/forum") {
}
單目測試:
location /images/ {
rewrite http://172.16.100.19/images/
}
支持正則表達式:
location / {
root html;
index index.html;
rewrite "^/bbs/(.*)/images/(.*)\.jpg$" http://www.test.com/bbs/$2/images/$1.jpg last;
}
http://www.test.com/bbs/a/images/b.jpg --> http://www.test.com/bbs/b/images/a.jpg --> http://www.test.com/bbs/a/images/b.jpg
http://www.test.com/bbs/index.html --> http://www.test.com/forum/index.html
last: 本次重寫完成之后,重啟下一輪檢查;
break: 本次重寫完成之后,直接執行后續操作;
memcached: 緩存服務器,但本身無法決定緩存任何數據
一半依賴于客戶端,一半依賴于服務器
set key 5 60 hello
lazy: 惰性, LRU,最近最少使用
內存緩存服務器:
48bytes
1MB
buddy system: 伙伴系統
避免內存外碎片
slab allocator: slab分配器
避免內存內碎片
memcached: 不通信分布式緩存服務器
event-driven:
libevent


