OpenResty? 是一個基于 Nginx 與 Lua 的高性能 Web 平臺,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項。用于方便地搭建能夠處理超高并發、擴展性極高的動態 Web 應用、Web 服務和動態網關。Lua 腳本語言調動 Nginx 支持的各種 C 以及 Lua 模塊, 讓你的Web服務直接跑在 Nginx 服務內部,充分利用 Nginx 的非阻塞 I/O 模型,不僅僅對 HTTP 客戶端請求,甚至于對遠程后端諸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都進行一致的高性能響應。
nginx的優勢: 事件驅動, 高度模塊化, 跨平臺服務
我們可以基于它來做elasticsearch多集群網關.
參考:
- https://segmentfault.com/a/1190000041298011
- https://cloud.tencent.com/developer/article/1518678
- https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Connection_management_in_HTTP_1.x
hello world
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 8080;
location / {
default_type text/html;
content_by_lua_block {
ngx.say("<p>hello, world</p>")
}
}
}
}
示例中的配置其實很好理解:
監聽8080端口, 改寫location根, 全部直接返回.
nginx配置說明
nginx 配置文件有三部分組成:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
1. 全局快
從配置文件開始到 events 塊之間的內容,主要會設置一些影響nginx 服務器整體運行的配置指令,主要包括配 置運行 Nginx 服務器的用戶(組)、允許生成的 worker process 數,進程 PID 存放路徑、日志存放路徑和類型以 及配置文件的引入等。
上述配置: 1 個worker
2. events塊
events 塊涉及的指令主要影響 Nginx 服務器與用戶的網絡連接,常用的設置包括是否開啟對多 work process 下的網絡連接進行序列化,是否 允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等
上述例子就表示每個 work process 支持的最大連接數為 1024.
這部分的配置對 Nginx 的性能影響較大,在實際中應該靈活配置。
3. http塊
配置變動最多的, 且: http 塊也可以包括 http全局塊、server 塊。
● http全局塊
http全局塊配置的指令包括文件引入、MIME-TYPE 定義、日志自定義、連接超時時間、單鏈接請求數上限等。
● server 塊
這塊和虛擬主機有密切關系,虛擬主機從用戶角度看,和一臺獨立的硬件主機是完全一樣的,該技術的產生是為了 節省互聯網服務器硬件成本。
每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當于一個虛擬主機。
而每個 server 塊也分為全局 server 塊,以及可以同時包含多個 locaton 塊。
- 全局 server 塊
最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或IP配置。 - location 塊
一個 server 塊可以配置多個 location 塊。
這塊的主要作用是基于 Nginx 服務器接收到的請求字符串(例如 server_name/uri-string),對虛擬主機名稱 (也可以是IP 別名)之外的字符串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理。 地址定向、數據緩 存和應答控制等功能,還有許多第三方模塊的配置也在這里進行。
● location 指令說明
學習參考: https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247494640&idx=2&sn=3dff37a670abfaf7b64d7bfa798d5f5b&chksm=e9188eecde6f07fad24d3f05853b0b1a029ce44ff43194364ef0510e7613c113ef7b0e39aae9&token=526214436&lang=zh_CN&scene=21#wechat_redirect
該指令用于匹配 URL。
語法如下:
1、= :用于不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,如果匹配 成功,就停止繼續向下搜索并立即處理該請求。
2、~:用于表示 uri 包含正則表達式,并且區分大小寫。
3、~:用于表示 uri 包含正則表達式,并且不區分大小寫。
4、^~:用于不含正則表達式的 uri 前,要求 Nginx 服務器找到標識 uri 和請求字 符串匹配度最高的 location 后,立即使用此 location 處理請求,而不再使用 location 塊中的正則 uri 和請求字符串做匹配。
注意:如果 uri 包含正則表達式,則必須要有 ~ 或者 ~標識。
更詳細的配置
from: https://segmentfault.com/a/1190000041298011
# main段配置信息
user nginx; # 運行用戶,默認即是nginx,可以不進行設置
worker_processes auto; # Nginx 進程數,一般設置為和 CPU 核數一樣
error_log /var/log/nginx/error.log warn; # Nginx 的錯誤日志存放目錄
pid /var/run/nginx.pid; # Nginx 服務啟動時的 pid 存放位置
# events段配置信息
events {
use epoll; # 使用epoll的I/O模型(如果你不知道Nginx該使用哪種輪詢方法,會自動選擇一個最適合你操作系統的)
worker_connections 1024; # 每個進程允許最大并發數
}
# http段配置信息
# 配置使用最頻繁的部分,代理、緩存、日志定義等絕大多數功能和第三方模塊的配置都在這里設置
http {
# 設置日志模式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; # Nginx訪問日志存放位置
sendfile on; # 開啟高效傳輸模式
tcp_nopush on; # 減少網絡報文段的數量
tcp_nodelay on;
keepalive_timeout 65; # 保持連接的時間,也叫超時時間,單位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types; # 文件擴展名與類型映射表
default_type application/octet-stream; # 默認文件類型
include /etc/nginx/conf.d/*.conf; # 加載子配置項
# server段配置信息
server {
listen 80; # 配置監聽的端口
server_name localhost; # 配置的域名
# location段配置信息
location / {
root /usr/share/nginx/html; # 網站根目錄
index index.html index.htm; # 默認首頁文件
deny 172.168.22.11; # 禁止訪問的ip地址,可以為all
allow 172.168.33.44;# 允許訪問的ip地址,可以為all
}
error_page 500 502 503 504 /50x.html; # 默認50x對應的訪問頁面
error_page 400 404 error.html; # 同上
}
}
常用命令
nginx -s reload # 向主進程發送信號,重新加載配置文件,熱重啟
nginx -s reopen # 重啟
Nginxnginx -s stop # 快速關閉
nginx -s quit # 等待工作進程處理完成后關閉
nginx -T # 查看當前 Nginx 最終的配置
nginx -t # 檢查配置是否有問題`
demo
負載均衡
upstream myserver {
server xxx.yyy.ppp.zzz:8080;
server xxx.ppp.zzz.yyy:8082;
}
server {
listen 80;
server_name 208.208.111.222;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://myserver;
#proxy_pass http://127.0.0.1:8081;
index index.html index.htm;
}
負載均衡策略
- 輪詢: 默認不用配置
- weight: 在upstream的每個server后面加上 weight=一個數字server xxx.yyy.ppp.zzz:8080 weight=10; 越大, 其百分比越高, 流量越多
-
ip_hash: 按訪問 ip 的 hash 結果分配,優點這樣每個訪客固定訪問一個后端服務器
a.
image.png -
fair: 后端服務器的響應時間來分配請求,響應時間短的優先分配。
a.
image.png
nginx原理
角色
● nginx 啟動后,是由兩類進程組成的。master(管理者)和worker(工作者)。
● 一個nginx 只有一個master。但可以有多個worker
優點:
● 首先,對于每個 worker 進程來說,獨立的進程,不需要加鎖,所以省掉了鎖帶來的開銷, 同時在編程以及問題查找時,也會方便很多。
● 可以使用 nginx –s reload 熱部署,利用 nginx 進行熱部署操作
● 其次,采用獨立的進程,可以讓互相之間不會 影響,一個進程退出后,其它進程還在工作,服務不會中斷,master 進程則很快啟動新的 worker 進程。當然,worker 進程的異常退出,肯定是程序有 bug 了,異常退出,會導致當 前 worker 上的所有請求失敗,不過不會影響到所有請求,所以降低了風險。
優點
● 首先,對于每個 worker 進程來說,獨立的進程,不需要加鎖,所以省掉了鎖帶來的開銷, 同時在編程以及問題查找時,也會方便很多。
● 可以使用 nginx –s reload 熱部署,利用 nginx 進行熱部署操作
● 其次,采用獨立的進程,可以讓互相之間不會 影響,一個進程退出后,其它進程還在工作,服務不會中斷,master 進程則很快啟動新的 worker 進程。當然,worker 進程的異常退出,肯定是程序有 bug 了,異常退出,會導致當 前 worker 上的所有請求失敗,不過不會影響到所有請求,所以降低了風險。
配置調優
cpu配置
Nginx 同 redis 類似都采用了 io 多路復用機制,每個 worker 都是一個獨立的進程,但每個進 程里只有一個主線程,通過異步非阻塞的方式來處理請求, 即使是千上萬個請求也不在話 下。每個 worker 的線程可以把一個 cpu 的性能發揮到極致。所以 worker 數和服務器的 cpu 數相等是最為適宜的。設少了會浪費 cpu,設多了會造成 cpu 頻繁切換上下文帶來的損耗.
worker_connection配置
瀏覽器都是并發訪問服務的, 即同時建立多個tcp連接, 4~6個. 也就是對于一個客戶端, nginx要被占用4~6個連接
另外對于反向代理(負載均衡), 背后的每個服務器都會與nginx建立連接, 即每個nginx worker消耗的連接數為服務器的個數.