篇幅較長,乾貨滿滿,需花費較長時間,轉載請註明出處!
php
Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫爲俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。css
Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特色是佔有內存少,併發能力強,事實上nginx的併發能力在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。html
代理服務器根據其代理對象的不一樣,能夠分爲正向代理服務器與反向代理服務器。這裏的「正」與「反」均是站在客戶端角度來講的。linux
正向代理是對客戶端的代理。客戶端C想要從服務端S獲取資源,但由於某些緣由不能直接訪問服務端,而是經過另外一臺主機P向服務端發送請求。當服務端處理完畢請求後,將響應發送給主機P,主機P在接收到來自服務端的響應後,將響應又轉給了客戶端C。此時的主機P,就稱爲客戶端C的正向代理服務器。nginx
客戶端在使用正向代理服務器時是知道其要訪問的目標服務器的地址等信息的。c++
正向代理服務器是服務器的用戶(客戶端)架設的主機,與服務器無關,正向代理服務器的出現,使服務端根本就不知道真正客戶端的存在。程序員
反向代理,其實客戶端對代理是無感知的,由於客戶端不須要任何配置就能夠訪問,咱們只須要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據後,在將響應返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器IP地址。web
在知乎上找了2張圖,能夠幫助咱們更好的理解。正則表達式
Nginx結合多進程機制和異步機制對外提供服務,異步機制使用的是異步非阻塞方式。Nginx的master進程會生成多個worker進程,master進程負責管理這些worker進程的生命週期、接受外部命令、解析perl腳本等。而worker進程則用於接受和處理客戶端請求。算法
每一個worker進程可以使用異步非阻塞方式處理多個客戶端請求。當某個worker進程接收到客戶端的請求後,會調用IO進程處理,若是不能當即獲得結果,worker進程就去處理其餘的請求。當IO返回結果後,就會通知worker進程,而worker進程獲得通知後,就會掛起當前正在處理的事務,拿IO返回結果去響應客戶端請求,worker進程採用的是epoll事件驅動模型與IO進行通訊的。epoll模型底層採用的是「回調callback」代替裏輪詢,使效率高於select模型。
nginx的官網:http://nginx.org/
注:主線版,是最新的版本;穩定版,推薦生產環境下使用;舊版,之前的版本。
連接:https://pan.baidu.com/s/1kjQST_x1Sf_thg3XDmqx6w 密碼:18sc
由於nginx是C語言寫的,並且是源碼安裝,安裝前需安裝C語言環境!!!
yum install -y gcc-c++ gcc
基本的Nginx功能依賴於一些基本的庫,在安裝Nginx以前須要提早安裝這些庫。
pcre-devel:pcre,Perl Compatible Regular Expressions,Perl腳本語言兼容正則表達式,爲Nginx提供正則表達式庫。
openssl-devel:爲Nginx提供SSL(安全套接字層)密碼庫,包含主要的密碼算法,經常使用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其餘目的使用。
在安裝以前須要注意,不少庫具備devel庫與非devel庫兩種。devel庫表示development開發庫,比非devel庫會多出一些頭文件、靜態庫、源碼包等。而這些包在運行時不可能用到,但在開發時有可能用到。因此對於程序員來講,通常都是須要安裝devel庫的。不過在yum安裝devel庫時,因爲其依賴於非devel庫,因此其會先自動安裝非devel庫,然後再安裝devel庫。因此真正安裝時,只需顯示的安裝devel庫便可。
yum -y install pcre-devel openssl-devel
tar -zxvf nginx-1.16.1.tar.gz -C /opt/apps
./configure --help
此時Nginx解壓路徑下會多出一個:Makefile
配置成功後,再次查看Nginx解壓目錄,發現其中多出一個文件Makefile。後面的編譯就是依靠該文件進行的。
這是兩個命令,make:爲編譯命令;make install:爲安裝命令,能夠分別執行。這裏使用&&將兩個命令鏈接執行,會在前面命令執行成功的前提下才會執行第二個命令。
編譯安裝完成後,會在/usr/local下出現nginx目錄
ln -n /usr/local/nginx/sbin/nginx /usr/local/sbin
格式:
ln -n 源路徑 目標路徑
注:軟連接創建完成後就能夠在任意路徑下使用nginx命令
nginx -t:測試配置文件是否正確,默認只測試默認的配置文件conf/nginx.conf
nginx -T:測試配置文件是否正確,並顯示配置文件內容
nginx -tq:在配置文件測試過程當中,禁止顯示非錯誤信息,即只顯示錯誤信息
啓動後,並查看,發現有2個線程,一個master,一個worker
注:linux需關閉防火牆!!!!
worker_processes,工做進程,用於指定Nginx的工做進程數量。該值應該設置爲多少合適呢?其數值通常設置爲cpu內核數量,或內核數量的整數倍。注意,現代的cpu通常都是多核,即一塊cpu中包含多個內核。
若當前系統具備2塊cpu,而每塊cpu中包含2個內核,那麼worker_processes的值通常能夠設置爲4或8個。固然也能夠爲2個。
不過須要注意,該值不只僅取決於cpu內核數量,還與硬盤數量及負載均衡模式相關,在不肯定時還能夠指定其值爲auto。
爲了進一步提升系統性能,咱們會將worker進程與具體的內核進行綁定。該綁定操做是經過worker_cpu_affinity屬性進行設置的。affinity,密切關係。
不過,若指定worker_processes的值爲auto,則沒法設置worker_cpu_affinity。該設置是經過二進制進行的。每一個內核使用一個二進制表示,0表明內核關閉;1表明內核開啓。也就是說,有幾個內核,就須要使用幾個二進制位。
下面經過幾個例子來增進對worker_processes與worker_cpu_affinity的理解
注:字打錯了,應該是「歡迎來到陳彥斌的Nginx!!」
Nginx靜態代理是指,將全部的靜態資源,如:css、js、html、jpg等資源存放到Nginx服務器,而不存在應用服務器Tomcat中,當客戶端發出的請求是對這些靜態資源的請求時,Nginx直接將這些靜態資源響應給客戶端,而無需提交給應用服務器處理。這樣就下降了應用服務器的壓力。
同時,Nginx對於靜態資源的處理較Tomcat,性能更高,效率更高。因此,在實際生產環境下,會使用Nginx做爲靜態代理服務器,專門處理靜態資源的響應。
Nginx對於靜態資源請求的攔截方式,能夠經過靜態資源名稱的擴展名攔截,也能夠經過靜態資源所在的目錄名稱攔截。
負載均衡,Load Balancing,就是將對請求的處理分攤到多個操做單元上進行。這個均衡是指在大批量訪問前提下的一種基本均衡,並不是是絕對的平均。
對於Web工程中的負載均衡,就是將相同的Web應用部署到多個不一樣的Web服務器上,造成多個Web應用服務器。當請求到來時,由負載均衡服務器負責將請求按照事先設定好的比例向Web應用服務器進行分發,從而增加系統的總體吞吐量。
該機羣包含一臺Nginx服務器,兩臺Tomat服務器。
首先開發一個web工程,將其打包。而後,在克隆出兩臺Tomcat主機,前面的web工程分別部署到這兩臺Tomcat主機上。而後,在Nginx服務器上設置對這兩臺Tomcat主機的均在均衡。
項目結構圖
具體配置,請參考另外一篇博客:點我直達
克隆上面配置好的Tomcat主機
注:weight權重
jsp項目
百度雲盤
連接:https://pan.baidu.com/s/18z5c93jM6S-qvoT2cUZi7g 密碼:u08i
動靜分離,就是將JSP、Servlet等動態資源交由Tomcat或其餘Web服務器處理,將CSS、js、image等靜態資源交由Nginx或其餘Http服務器處理,充分發揮各自的優點,減輕其餘服務器的壓力,搭建更爲高效的系統架構。
下面要搭建Nginx,環境中有三臺Nginx主機;一臺用於完成負載均衡,兩臺Nginx用於存放前面項目中的靜態資源。另外,還包含前面的兩臺Tomcat主機。
將原來安裝有Nginx的主機做爲母機,克隆一臺Nginx主機,用於存放靜態資源:css、js、image。
重複上面,複製的那臺Nginx操做!!!
設置靜態資源的負載均衡代理,兩臺nginx的ip分別爲:192.168.31.2十二、192.168.31.213
因爲圖片太大,截成2段了
1 #user nobody; 2 worker_processes 1; 3 4 #error_log logs/error.log; 5 #error_log logs/error.log notice; 6 #error_log logs/error.log info; 7 8 #pid logs/nginx.pid; 9 10 11 events { 12 worker_connections 1024; 13 } 14 15 16 http { 17 include mime.types; 18 default_type application/octet-stream; 19 20 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 21 # '$status $body_bytes_sent "$http_referer" ' 22 # '"$http_user_agent" "$http_x_forwarded_for"'; 23 24 #access_log logs/access.log main; 25 26 sendfile on; 27 #tcp_nopush on; 28 29 #keepalive_timeout 0; 30 keepalive_timeout 65; 31 32 #gzip on; 33 # 配置上傳流,用於負載均衡 34 upstream tomcat.cyb.com{ 35 server 192.168.31.214:8080 weight=1; 36 server 192.168.31.215:8080 weight=1; 37 } 38 upstream static.cyb.com{ 39 server 192.168.31.212:80 weight=1; 40 server 192.168.31.213:80 weight=1; 41 } 42 server { 43 listen 80; 44 server_name localhost; 45 46 #charset koi8-r; 47 48 #access_log logs/host.access.log main; 49 50 location / { 51 # root html; 52 # index index.html index.htm; 53 proxy_pass http://tomcat.cyb.com; 54 } 55 location ~.*\.(jpg|jpeg|js|css|html)$ { 56 proxy_pass http://static.cyb.com; 57 } 58 #error_page 404 /404.html; 59 60 # redirect server error pages to the static page /50x.html 61 # 62 error_page 500 502 503 504 /50x.html; 63 location = /50x.html { 64 root html; 65 } 66 67 # proxy the PHP scripts to Apache listening on 127.0.0.1:80 68 # 69 #location ~ \.php$ { 70 # proxy_pass http://127.0.0.1; 71 #} 72 73 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 74 # 75 #location ~ \.php$ { 76 # root html; 77 # fastcgi_pass 127.0.0.1:9000; 78 # fastcgi_index index.php; 79 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 80 # include fastcgi_params; 81 #} 82 83 # deny access to .htaccess files, if Apache's document root 84 # concurs with nginx's one 85 # 86 #location ~ /\.ht { 87 # deny all; 88 #} 89 } 90 91 92 # another virtual host using mix of IP-, name-, and port-based configuration 93 # 94 #server { 95 # listen 8000; 96 # listen somename:8080; 97 # server_name somename alias another.alias; 98 99 # location / { 100 # root html; 101 # index index.html index.htm; 102 # } 103 #} 104 105 106 # HTTPS server 107 # 108 #server { 109 # listen 443 ssl; 110 # server_name localhost; 111 112 # ssl_certificate cert.pem; 113 # ssl_certificate_key cert.key; 114 115 # ssl_session_cache shared:SSL:1m; 116 # ssl_session_timeout 5m; 117 118 # ssl_ciphers HIGH:!aNULL:!MD5; 119 # ssl_prefer_server_ciphers on; 120 121 # location / { 122 # root html; 123 # index index.html index.htm; 124 # } 125 #} 126 127 }
1 #user nobody; 2 worker_processes 1; 3 4 #error_log logs/error.log; 5 #error_log logs/error.log notice; 6 #error_log logs/error.log info; 7 8 #pid logs/nginx.pid; 9 10 11 events { 12 worker_connections 1024; 13 } 14 15 16 http { 17 include mime.types; 18 default_type application/octet-stream; 19 20 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 21 # '$status $body_bytes_sent "$http_referer" ' 22 # '"$http_user_agent" "$http_x_forwarded_for"'; 23 24 #access_log logs/access.log main; 25 26 sendfile on; 27 #tcp_nopush on; 28 29 #keepalive_timeout 0; 30 keepalive_timeout 65; 31 32 #gzip on; 33 34 server { 35 listen 80; 36 server_name localhost; 37 38 #charset koi8-r; 39 40 #access_log logs/host.access.log main; 41 42 # location / { 43 # root html; 44 # index index.html index.htm; 45 # } 46 # 經過擴展名方式攔截 47 location ~.*\.(jpg|jpeg|js|css|html)$ { 48 root /opt; 49 } 50 51 #error_page 404 /404.html; 52 53 # redirect server error pages to the static page /50x.html 54 # 55 error_page 500 502 503 504 /50x.html; 56 location = /50x.html { 57 root html; 58 } 59 60 # proxy the PHP scripts to Apache listening on 127.0.0.1:80 61 # 62 #location ~ \.php$ { 63 # proxy_pass http://127.0.0.1; 64 #} 65 66 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 67 # 68 #location ~ \.php$ { 69 # root html; 70 # fastcgi_pass 127.0.0.1:9000; 71 # fastcgi_index index.php; 72 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 73 # include fastcgi_params; 74 #} 75 76 # deny access to .htaccess files, if Apache's document root 77 # concurs with nginx's one 78 # 79 #location ~ /\.ht { 80 # deny all; 81 #} 82 } 83 84 85 # another virtual host using mix of IP-, name-, and port-based configuration 86 # 87 #server { 88 # listen 8000; 89 # listen somename:8080; 90 # server_name somename alias another.alias; 91 92 # location / { 93 # root html; 94 # index index.html index.htm; 95 # } 96 #} 97 98 99 # HTTPS server 100 # 101 #server { 102 # listen 443 ssl; 103 # server_name localhost; 104 105 # ssl_certificate cert.pem; 106 # ssl_certificate_key cert.key; 107 108 # ssl_session_cache shared:SSL:1m; 109 # ssl_session_timeout 5m; 110 111 # ssl_ciphers HIGH:!aNULL:!MD5; 112 # ssl_prefer_server_ciphers on; 113 114 # location / { 115 # root html; 116 # index index.html index.htm; 117 # } 118 #} 119 120 }
1 #user nobody; 2 worker_processes 1; 3 4 #error_log logs/error.log; 5 #error_log logs/error.log notice; 6 #error_log logs/error.log info; 7 8 #pid logs/nginx.pid; 9 10 11 events { 12 worker_connections 1024; 13 } 14 15 16 http { 17 include mime.types; 18 default_type application/octet-stream; 19 20 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 21 # '$status $body_bytes_sent "$http_referer" ' 22 # '"$http_user_agent" "$http_x_forwarded_for"'; 23 24 #access_log logs/access.log main; 25 26 sendfile on; 27 #tcp_nopush on; 28 29 #keepalive_timeout 0; 30 keepalive_timeout 65; 31 32 #gzip on; 33 34 server { 35 listen 80; 36 server_name localhost; 37 38 #charset koi8-r; 39 40 #access_log logs/host.access.log main; 41 42 # location / { 43 # root html; 44 # index index.html index.htm; 45 # } 46 # 經過擴展名方式攔截 47 location ~.*\.(jpg|jpeg|js|css|html)$ { 48 root /opt; 49 } 50 51 #error_page 404 /404.html; 52 53 # redirect server error pages to the static page /50x.html 54 # 55 error_page 500 502 503 504 /50x.html; 56 location = /50x.html { 57 root html; 58 } 59 60 # proxy the PHP scripts to Apache listening on 127.0.0.1:80 61 # 62 #location ~ \.php$ { 63 # proxy_pass http://127.0.0.1; 64 #} 65 66 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 67 # 68 #location ~ \.php$ { 69 # root html; 70 # fastcgi_pass 127.0.0.1:9000; 71 # fastcgi_index index.php; 72 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 73 # include fastcgi_params; 74 #} 75 76 # deny access to .htaccess files, if Apache's document root 77 # concurs with nginx's one 78 # 79 #location ~ /\.ht { 80 # deny all; 81 #} 82 } 83 84 85 # another virtual host using mix of IP-, name-, and port-based configuration 86 # 87 #server { 88 # listen 8000; 89 # listen somename:8080; 90 # server_name somename alias another.alias; 91 92 # location / { 93 # root html; 94 # index index.html index.htm; 95 # } 96 #} 97 98 99 # HTTPS server 100 # 101 #server { 102 # listen 443 ssl; 103 # server_name localhost; 104 105 # ssl_certificate cert.pem; 106 # ssl_certificate_key cert.key; 107 108 # ssl_session_cache shared:SSL:1m; 109 # ssl_session_timeout 5m; 110 111 # ssl_ciphers HIGH:!aNULL:!MD5; 112 # ssl_prefer_server_ciphers on; 113 114 # location / { 115 # root html; 116 # index index.html index.htm; 117 # } 118 #} 119 120 }
虛擬主機,就是將一臺物理服務器虛擬爲多個服務器來使用,從而實現在一臺服務器上配置多個站點,便可以在一臺物理主機上配置多個域名。Nginx中,一個server標籤就是一臺虛擬主機,配置多個server標籤就虛擬出了多臺主機。
Nginx虛擬主機的實現方式有兩種:域名虛擬方式與端口虛擬方式。域名虛擬方式是指不一樣的虛擬機使用不一樣的域名,經過不一樣的域名虛擬出不一樣的主機;端口虛擬方式是指不一樣的虛擬機使用相同的域名不一樣的端口號,經過不一樣的端口號虛擬出不一樣的主機。基於端口的虛擬方式不經常使用。。。
如今不少生活服務類網絡平臺都具備這樣的功能:不一樣城市的用戶能夠打開不一樣城市專屬的站點。用戶首先打開的是平臺總的站點,而後容許用戶切換到不一樣的城市。其實,不一樣的城市都是一個不一樣的站點。
這裏咱們要實現的功能是爲平臺總站點、北京、上海兩個城市站點分別建立一個虛擬主機。每一個虛擬主機都具備兩臺Tomcat的負載均衡主機。因爲有三個站點,因此共需六臺Tomcat主機。
首先要建立一個web工程,其中就一個index.jsp頁面,頁面除了顯示當前城市外,還要顯示城市切換的超連接。爲了可以明細的區分出當前訪問的Tomcat,在頁面中顯示出客戶端ip和服務器ip。
注:字打錯了,北京應該是:bj.cyb.com
直接複製前面的web工程,只須要一個jsp便可。
百度雲盤
連接:https://pan.baidu.com/s/14n1tluHohe5Il_9vi1w9SA 密碼:n2sc
修改hosts文件,域名綁定ip(綁定的是nginx負載均衡的ip地址!!),不能直接修改hosts文件,須要複製出來後,修改完畢後,在覆蓋回去
操做步驟:訪達->shift+command+G->/private/etc
文件位置:C:\Windows\System32\Drivers\etc
nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#gzip on;
# 總站
upstream entry.com{
server 192.168.1.111:8080 weight=1;
server 192.168.1.112:8080 weight=1;
}
#北京
upstream bj.com{
server 192.168.1.113:8080 weight=1;
server 192.168.1.114:8080 weight=1;
}
#上海
upstream sh.com{
server 192.168.1.115:8080 weight=1;
server 192.168.1.116:8080 weight=1;
}
server{
listen 80;
server_name www.entry.com;
# 負載均衡
location / {
proxy_pass http://entry.com;
}
}
server{
listen 80;
server_name bj.entry.com;
# 負載均衡
location / {
proxy_pass http://bj.com;
}
}
server{
listen 80;
server_name sh.entry.com;
# 負載均衡
location / {
proxy_pass http://sh.com;
}
}
}
搞定!!!!