反向代理(Reverse Proxy)方式是指以代理服務器接收internet上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給internet上請求鏈接的客戶端,此時代理服務器對外就表現爲一個服務器html
從上圖能夠看出:反向代理 服務器位於網站機房,代理網站Web服務器接收http請求,對請求進行轉發.前端
(1) 保護網站安全:任何來自Internet的請求都必須先通過代理服務器mysql
(2) 經過配置緩存功能加速Web請求:能夠緩存真實Web服務器上的某些靜態資源,減輕真實Web服務器的負載壓力nginx
(3) 實現負載均衡:充當負載均衡服務器均衡地分發請求,平衡集羣中各個服務器的負載壓力sql
對於同一個連接中的數據包,負載均衡回將其進行NAT轉換後,轉發至後端固定的服務器進行處理,這是負載均衡最基本,最原始的功能。負載均衡系統內部會專門有一張表來記錄這些鏈接的情況,包括【源IP: 端口】【目的IP: 端口】【服務器IP: 端口】,空閒超時時間(Idle Timeout)等json
因爲負載均衡內部記錄鏈接狀態的這張表須要消耗系統的內部資源。所以這張表不可能無限大,全部廠家都有必定的限制。這張表的大小通常稱之爲最大併發鏈接數,也就是系統同時可以容納的鏈接數量。考慮到創建這些鏈接的客戶端或服務器會發生一些異常狀況,致使這些鏈接不能被正常終結掉,所以負載均衡的當前鏈接狀態表項中,設計了一個空閒超時時間的參數。這個參數定義爲,當該鏈接在必定時間內無流量經過時,負載均衡會自動刪除該鏈接條目,釋放系統資源。後端
https://kb.cnblogs.com/page/559213/ 這個再好好看看瀏覽器
nginx是一款輕量級的網頁服務器,反向代理器以及電子郵件代理服務器,其將源代碼以類BSD許可證的形式發佈,因它的穩定性,豐富的功能集,實例配置文件和低系統資源的消耗而聞名.緩存
說道Web服務器,Apache服務器和IIS服務器是兩大巨頭,可是運行速度更快,更靈活的對手nginx正在迎頭遇上tomcat
(1)跨平臺:Nginx 能夠在大多數 Unix like OS編譯運行,並且也有Windows的移植版本;
(2)配置異常簡單:很是容易上手。配置風格跟程序開發同樣,神通常的配置;
(3)非阻塞、高併發鏈接:數據複製時,磁盤I/O的第一階段是非阻塞的。官方測試可以支撐5萬併發鏈接,在實際生產環境中跑到2~3萬併發鏈接數。(這得益於Nginx使用了最新的epoll模型);
(4)事件驅動:通訊機制採用epoll模型,支持更大的併發鏈接。(總結:經過異步非阻塞的事件處理機制,Nginx實現由進程循環處理多個準備好的事件,從而實現高併發和輕量級。)
(5)Master/Worker結構:一個master進程,生成一個或多個worker進程。
(6)內存消耗小:處理大併發的請求內存消耗很是小。在3萬併發鏈接下,開啓的10個Nginx 進程才消耗150M內存(15M*10=150M)。
(7)內置的健康檢查功能:若是 Nginx 代理的後端的某臺 Web 服務器宕機了,不會影響前端訪問。
(8)節省帶寬:支持 GZIP 壓縮,能夠添加瀏覽器本地緩存的 Header 頭。
(9)穩定性高:用於反向代理,宕機的機率微乎其微。
-- 啓動
sudo /xxx/openresty/nginx/sbin/nginx
-- 中止
sudo /xxx/openresty/nginx/sbin/nginx -s stop
-- 從新加載配置文件
sudo /xxx/openresty/nginx/sbin/nginx -s reload
ng 負載均衡:
http { upstream myapp1 { server srv1.example.com; server srv2.example.com; server srv3.example.com; } server { listen 80; location / { proxy_pass http://myapp1; } } }
1 安裝不管使用何種方法,都須要安裝 pcre 庫 libpcre,這是安裝nginx必須的
2 安裝 libdrizzle 1.0
wget http://agentzh.org/misc/nginx/drizzle7-2011.07.21.tar.gz tar zxvf drizzle7-2011.07.21.tar.gz cd drizzle7-2011.07.21 ./configure --without-server make libdrizzle-1.0 make install-libdrizzle-1.0
3 openresty從新configure一下
./configure --prefix=/usr/local/openresty --with-luajit --with-http_drizzle_module --with-libdrizzle=/usr/local
#user nobody; worker_processes 4; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #gzip on; upstream mysql { drizzle_server 127.0.0.1:3306 dbname=nginx user=root password=root protocol=mysql; } server { listen 80; server_name localhost; location = /mysql-status{ drizzle_status; } location /mysql { drizzle_pass mysql; drizzle_query "select id,name,age from users where id = 1"; rds_json on; } location /hello { default_type 'text/plain'; content_by_lua 'ngx.say("hello, lua")'; # root html; # index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
nginx是一個高效的服務器,可是若是隻是安裝沒有進行什麼配置,只能承受1024個併發請求。那麼如何可讓nginx輕鬆應對5000甚至10000的高併發呢
(1) 調整同時打開文件數量
ulimit -n 20480
(2) TCP最大鏈接數(somaxconn) socat的最大鏈接數
echo 10000 > /proc/sys/net/core/somaxconn
(3) TCP鏈接當即回收、回用(recycle、reuse)
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
(4) 不作TCP洪水抵禦
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
也能夠直接使用優化後的配置,在/etc/sysctl.conf中加入:
net.core.somaxconn = 20480
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_max_syn_backlog = 16384
net.core.netdev_max_backlog = 20000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_orphans = 131072
net.ipv4.tcp_syncookies = 0
使用:sysctl -p 生效
sysctl -p
修改nginx配置文件,nginx.conf增長work_rlimit_nofile和worker_connections數量,並禁用keepalive_timeout。worker_processes 1; #nginx 進程數,建議按照cpu 數目來指定,通常爲它的倍數worker_rlimit_nofile 20000; #一個nginx 進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx 進程數相除,可是nginx 分配請求並非那麼均勻,因此最好與ulimit -n 的值保持一致events {use epoll;#使用epoll的I/O模型worker_connections 20000;#每一個進程容許的最多鏈接數, 理論上每臺nginx 服務器的最大鏈接數爲worker_processes*worker_connectionsmulti_accept on;}http {keepalive_timeout 0;}重啓nginxservice nginx restart