Nginx中文文檔 - https://www.nginx.cn/doc/html
Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。 Nginx 是由 Igor Sysoev 爲俄羅斯訪問量第二的 Rambler.ru 站點開發的,第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。node
Nginx 解決了服務器的C10K(就是在一秒以內鏈接客戶端的數目爲10k即1萬)問題。它的設計不像傳統的服務器那樣使用線程處理請求,而是一個更加高級的機制—事件驅動機制
,是一種異步事件驅動結構。它能夠輕鬆在百萬併發鏈接下實現高吞吐量的Web服務,同時諸多應用場景下的問題均可以經過種種Nginx模塊得以解決,而咱們所需的工做量也並不大linux
高併發請求的同時保持高效的服務nginx
熱部署程序員
低內存消耗/很高的可靠性docker
處理響應請求很快shell
非阻塞、高併發鏈接-IO多路複用epoll(IO複用)ubuntu
輕量級後端
CPU親和跨域
Nginx接收用戶請求是異步的,即先將用戶請求所有接收下來,再一次性發送到後端Web服務器,極大減輕後端Web服務器的壓力。
支持內置服務器檢測。Nginx可以根據應用服務器處理頁面返回的狀態碼、超時信息等檢測服務器是否出現故障,並及時返回錯誤的請求從新提交到其它節點上
採用Master/worker多進程工做模式
Nginx的功能包括基本HTTP功能和擴展功能。和Apache服務器同樣,Nginx服務器爲了提供更多的功能而且可以有效地擴展這些功能。每個模塊都提供了一個功能,經過編譯這些功能模塊來實現功能的擴展
a)提供靜態文件和index文件,處理靜態文件,索引文件以及自動索引,打開文件描述符緩存;
b)使用緩存加速反向代理,反向代理加速(無緩存),簡單的負載均衡和容錯;
c)使用緩存機制加速遠程FastCGI,簡單的負載均衡和容錯;
d)模塊化的結構。過濾器包括gzipping,byte ranges,chunked responses,以及 SSI-filter。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求併發處理;
e)支持SSL 和 TLS SNI 支持;
f)IMAP/POP3代理服務功能;
g)使用外部 HTTP 認證服務器重定向用戶到 IMAP/POP3 後端;
h)使用外部 HTTP 認證服務器認證用戶後鏈接重定向到內部的 SMTP 後端;
下載地址:http://nginx.org/en/download.html
docker run --name nginx -p 8080:80 -d nginx
sudo apt-get install software-properties-common sudo add-apt-repository ppa:nginx/stable sudo apt-get update sudo apt-get install nginx
安裝完成後,檢查Nginx服務的狀態sudo systemctl status nginx
和 版本nginx -V
啓動時候若顯示端口80被佔用: Starting nginx: [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use),
修改文件:/etc/nginx/sites-available/default,把 listen 後面的 80 端口號改成本身的端口,訪問是須要添加端口號。
安裝完後如出現403錯誤,那多是nginx配置文件裏的網站路徑不正確
sudo apt-get remove nginx nginx-common # 卸載刪除除了配置文件之外的全部文件。 sudo apt-get purge nginx nginx-common # 卸載全部東東,包括刪除配置文件。 sudo apt-get autoremove # 在上面命令結束後執行,主要是卸載刪除Nginx的再也不被使用的依賴包。 sudo apt-get remove nginx-full nginx-common #卸載刪除兩個主要的包。
- sudo nginx #打開 nginx - nginx -s reload|reopen|stop|quit #從新加載配置|重啓|中止|退出 nginx - nginx -t #測試配置是否有語法錯誤 nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives] -?,-h : 打開幫助信息 -v : 顯示版本信息並退出 -V : 顯示版本和配置選項信息,而後退出 -t : 檢測配置文件是否有語法錯誤,而後退出 -q : 在檢測配置文件期間屏蔽非錯誤信息 -s signal : 給一個 nginx 主進程發送信號:stop(中止), quit(退出), reopen(重啓), reload(從新加載配置文件) -p prefix : 設置前綴路徑(默認是:/usr/local/Cellar/nginx/1.2.6/) -c filename : 設置配置文件(默認是:/usr/local/etc/nginx/nginx.conf) -g directives : 設置配置文件外的全局指令
驗證配置是否正確: nginx -t
配置文件修改重裝載命令:nginx -s reload
中止nginx: sudo systemctl stop nginx
啓動nginx: sudo systemctl start nginx
默認,nginx是隨着系統啓動的時候自動運行,sudo systemctl disable nginx
能夠禁止nginx開機啓動.
從新配置nginx開機自動啓動: sudo systemctl enable nginx
重啓nginx: sudo systemctl restart nginx
平滑加載配置(不會斷開用戶訪問):sudo systemctl reload nginx
網站文件位置
服務器配置
日誌文件
所謂熱部署,就是配置文件nginx.conf修改後,不須要stop Nginx,不須要中斷請求,就能讓配置文件生效!(nginx -s reload 從新加載/nginx -t檢查配置/nginx -s stop)
經過上文咱們已經知道worker進程負責處理具體的請求,那麼若是想達到熱部署的效果,能夠想象:
方案一: 修改配置文件nginx.conf後,主進程master負責推送給woker進程更新配置信息,woker進程收到信息後,更新進程內部的線程信息。(有點valatile的味道)
方案二: 修改配置文件nginx.conf後,從新生成新的worker進程,固然會以新的配置進行處理請求,並且新的請求必須都交給新的worker進程,至於老的worker進程,等把那些之前的請求處理完畢後,kill掉便可。
Nginx採用的就是方案二來達到熱部署的!
啓動Nginx後,其實就是在80端口啓動了Socket服務進行監聽,如圖所示,Nginx涉及Master進程和Worker進程
Master進程的做用是?
Worker進程的做用是?
首先,Nginx在啓動時,會解析配置文件,獲得須要監聽的端口與IP地址,而後在Nginx的master進程裏面,先初始化好這個監控的socket(建立socket,設置addrreuse等選項,綁定到指定的IP地址端口,再listen),而後再fork(一個現有進程能夠調用fork函數建立一個新進程。由fork建立的新進程被稱爲子進程 )出多個子進程出來,而後子進程會競爭accept新的鏈接。
此時,客戶端就能夠向Nginx發起鏈接了。當客戶端與Nginx進行三次握手,與Nginx創建好一個鏈接後,某一個子進程會accept成功,獲得這個創建好的鏈接的socket,而後建立Nginx對鏈接的封裝,即ngx_connection_t結構體。
接着,設置讀寫事件處理函數並添加讀寫事件來與客戶端進行數據的交換。最後,Nginx或客戶端來主動關掉鏈接
上文已經說起Nginx的worker進程個數與CPU綁定、worker進程內部包含一個線程高效迴環處理請求,這的確有助於效率,但這是不夠的。
做爲專業的程序員,咱們能夠開一下腦洞:BIO/NIO/AIO、異步/同步、阻塞/非阻塞...
要同時處理那麼多的請求,要知道,有的請求須要發生IO,可能須要很長時間,若是等着它,就會拖慢worker的處理速度。
Nginx採用了Linux的epoll模型,epoll模型基於事件驅動機制,它能夠監控多個事件是否準備完畢,若是OK,那麼放入epoll隊列中,這個過程是異步的。worker只須要從epoll隊列循環處理便可。
Nginx既然做爲入口網關,很重要,若是出現單點問題,顯然是不可接受的。
答案是:Keepalived+Nginx實現高可用。
Keepalived是一個高可用解決方案,主要是用來防止服務器單點發生故障,能夠經過和Nginx配合來實現Web服務的高可用。(其實,Keepalived不只僅能夠和Nginx配合,還能夠和不少其餘服務配合)
Keepalived+Nginx實現高可用的思路:
第一:請求不要直接打到Nginx上,應該先經過Keepalived(這就是所謂虛擬IP,VIP)
第二:Keepalived應該能監控Nginx的生命狀態(提供一個用戶自定義的腳本,按期檢查Nginx進程狀態,進行權重變化,,從而實現Nginx故障切換)