【Nginx】Nginx詳解
一、什麼是Nginx?
Nginx是一個使用c語言開發的高效能的http伺服器及反向代理伺服器。Nginx是一款高效能的http 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器。由俄羅斯的程式設計師Igor Sysoev所開發,官方測試nginx能夠支支撐5萬併發連結,並且cpu、記憶體等資源消耗卻非常低,執行非常穩定。
為什麼使用Nginx?
在傳統的Web專案中,併發量小,使用者使用的少。所以在低併發的情況下,使用者可以直接訪問tomcat伺服器,然後tomcat伺服器返回訊息給使用者。比如,我們上傳圖片:
當然我們知道,為了解決併發,可以使用負載均衡:也就是我們多增加幾個tomcat伺服器。當用戶訪問的時候,請求可以提交到空閒的tomcat伺服器上。
但是這種情況下可能會有一種這樣的問題:上傳圖片操作。我們把圖片上傳到了tomcat1上了,當我們要訪問這個圖片的時候,tomcat1正好在工作,所以訪問的請求就交給其他的tomcat操作,而tomcat之間的資料沒有進行同步,所以就發生了我們要請求的圖片找不到。
為了解決這種情況,我們就想出了分散式。我們專門建立一個圖片伺服器,用來儲存圖片。這樣當我們都把圖片上傳的時候,不管是哪個伺服器接收到圖片,都把圖片上傳到圖片伺服器。
圖片伺服器上需要安裝一個http伺服器,可以使用tomcat、apache、nginx。
看到這裡大家可能會問,既然我們要選擇的是http伺服器,為什麼不繼續使用tomcat,而要使用Nginx?
原因如下:nginx常用做靜態內容服務和代理伺服器,直面外來請求轉發給後面的應用服務(tomcat,django什麼的),tomcat更多用來做做一個應用容器,讓java web app跑在裡面的東西,對應同級別的有jboss,jetty等東西。
借鑑部落格:
Nginx的應用場景
1、 http伺服器。Nginx是一個http服務可以獨立提供http服務。可以做網頁靜態伺服器。
2、 虛擬主機。可以實現在一臺伺服器虛擬出多個網站。例如個人網站使用的虛擬主機。
3、 反向代理,負載均衡。當網站的訪問量達到一定程度後,單臺伺服器不能滿足使用者的請求時,需要用多臺伺服器叢集可以使用nginx做反向代理。並且多臺伺服器可以平均分擔負載,不會因為某臺伺服器負載高宕機而某臺伺服器閒置的情況。
二、安裝
2.1 環境要求
- Centos 7
- nginx-1.15.5.tar.gz
2.2 先安裝nginx依賴的包
nginx是C語言開發,建議在linux上執行,本教程使用Centos7作為安裝環境。
- gcc
安裝nginx需要先將官網下載的原始碼進行編譯,編譯依賴gcc環境,如果沒有gcc環境,需要安裝gcc:
yum install gcc-c++
- PCRE
PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 相容的正則表示式庫。nginx的http模組使用pcre來解析正則表示式,所以需要在linux上安裝pcre庫。
yum install -y pcre pcre-devel
注:pcre-devel是使用pcre開發的一個二次開發庫。nginx也需要此庫。
- zlib
zlib庫提供了很多種壓縮和解壓縮的方式,nginx使用zlib對http包的內容進行gzip,所以需要在linux上安裝zlib庫。
yum install -y zlib zlib-devel
- openssl
OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼演算法、常用的金鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程式供測試或其它目的使用。
nginx不僅支援http協議,還支援https(即在ssl協議上傳輸http),所以需要在linux安裝openssl庫。
yum install -y openssl openssl-devel
2.3 把nginx的原始碼上傳到linux系統,並解壓
這一步可以使用軟體,也可以用程式碼的方式。這裡小編使用crt,直接把windows上的nginx-1.15.5.tar.gz包拷貝到“/usr/local/src”下。然後解壓。
tar -zxvf nginx-1.15.5.tar.gz
2.4 安裝
解壓後,會產生nginx-1.15.5的資料夾,進入後
cd nginx-1.15.5
在預設情況下,經過編譯安裝的Nginx包含了大部分可用模組。可以通過“./configure --help”選項設定各個模組的使用情況,例如對不需要的http_ssi模組,可通過“--without-http_ssi_module”方式關閉此模組;同理,如果需要“http_perl”模組,那麼可以通過“--with-http_perl_module”方式安裝此模組
執行configure:
./configure --prefix=/usr/local/nginx
然後執行編譯
make
安裝
make install
查詢安裝路徑:
whereis nginx
2.5 Nginx的啟動、停止
1、啟動、停止nginx
cd /usr/local/nginx/sbin/
./nginx
./nginx -s stop
./nginx -s quit
./nginx -s reload
./nginx -s quit
:此方式停止步驟是待nginx程序處理任務完畢進行停止。./nginx -s stop
:此方式相當於先查出nginx程序id再使用kill命令強制殺掉程序。
查詢nginx程序:
ps aux|grep nginx
重啟 nginx
1.先停止再啟動(推薦):
對 nginx 進行重啟相當於先停止再啟動,即先執行停止命令再執行啟動命令。如下:
./nginx -s quit
./nginx
2.重新載入配置檔案:
當 ngin x的配置檔案 nginx.conf 修改後,要想讓配置生效需要重啟 nginx,使用-s reload
不用先停止 ngin x再啟動 nginx 即可將配置資訊在 nginx 中生效,如下:
./nginx -s reload
啟動成功後,在瀏覽器可以看到這樣的頁面:
如果不能正常訪問注意linux防火牆有沒有配置,下面是CentOs7關閉防火牆的命令:
1:檢視防火狀態
systemctl status firewalld
2:暫時關閉防火牆
systemctl stop firewalld
3:永久關閉防火牆
systemctl disable firewalld
4:重啟防火牆
systemctl enable firewalld
3.開機自啟動
即在rc.local
增加啟動程式碼就可以了。
vi /etc/rc.local
增加一行 /usr/local/nginx/sbin/nginx
設定執行許可權:
chmod 755 rc.local
三、Nginx的配置
在/usr/local/nginx/conf目錄下nginx.conf檔案是nginx的配置檔案。
#開啟程序數 <=CPU數
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 {
#每個程序最大連線數(最大連線=連線數x程序數)
worker_connections 1024;
}
http {
#副檔名與檔案型別對映表
include mime.types;
#預設檔案型別
default_type application/octet-stream;
#日誌檔案輸出格式 這個位置相於全域性設定
#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 logs/access.log main;
#打開發送檔案
sendfile on;
#tcp_nopush on;
#連線超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
#開啟gzip壓縮
#gzip on;
#設定請求緩衝
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
#設定負載均衡的伺服器列表
upstream myproject {
#weigth引數表示權值,權值越高被分配到的機率越大
#max_fails 當有#max_fails個請求失敗,就表示後端的伺服器不可用,預設為1,將其設定為0可以關閉檢查
#fail_timeout 在以後的#fail_timeout時間內nginx不會再把請求發往已檢查出標記為不可用的伺服器
#這裡指定多個源伺服器,ip:埠,80埠的話可寫可不寫
server 192.168.1.78:8080 weight=5 max_fails=2 fail_timeout=600s;
#server 192.168.1.222:8080 weight=3 max_fails=2 fail_timeout=600s;
}
#第一個虛擬主機
server {
#監聽IP埠
listen 80;
#主機名 網站域名
server_name localhost;
#設定字符集
#charset koi8-r;
#本虛擬server的訪問日誌 相當於區域性變數
#access_log logs/host.access.log main;
#對本server"/"啟用負載均衡
location / {
#root /root; #定義伺服器的預設網站根目錄位置
#index index.php index.html index.htm; #定義首頁索引檔案的名稱
proxy_pass http://myproject; #請求轉向myproject定義的伺服器列表
#以下是一些反向代理的配置可刪除.
# proxy_redirect off;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# client_max_body_size 10m; #允許客戶端請求的最大單檔案位元組數
# client_body_buffer_size 128k; #緩衝區代理緩衝使用者端請求的最大位元組數,
# proxy_connect_timeout 90; #nginx跟後端伺服器連線超時時間(代理連線超時)
# proxy_send_timeout 90; #後端伺服器資料回傳時間(代理髮送超時)
# proxy_read_timeout 90; #連線成功後,後端伺服器響應時間(代理接收超時)
# proxy_buffer_size 4k; #設定代理伺服器(nginx)儲存使用者頭資訊的緩衝區大小
# proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設定
# proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2)
# proxy_temp_file_write_size 64k; #設定快取資料夾大小,大於這個值,將從upstream伺服器傳
}
location /upload {
alias e:/upload;
}
#設定檢視Nginx狀態的地址
location /NginxStatus {
stub_status on;
access_log off;
#allow 192.168.0.3;
#deny all;
#auth_basic "NginxStatus";
#auth_basic_user_file conf/htpasswd;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
# 定義錯誤提示頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
# 其它的虛擬主機配置
#server {
#多監聽
# listen 8000;
#主機名
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# WEB檔案路徑,其中html為檔案路徑名稱
# root html;
#預設首頁
# index index.html index.htm;
# }
#}
# HTTPS server HTTPS SSL加密伺服器
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
3.1 通過埠區分虛擬機器
在nginx.conf檔案中新增一個Service節點,修改埠號就可以
server {
listen 81;
server_name localhost;
location / {
root html81;
index index.html index.htm;
}
}
說明:
server 配置一個網站
listen 監聽埠
server_name 網站域名
root 網站絕對地址,後面記得帶斜槓
index 指定網站首頁
3.2 Nginx部署多個網站
為節省資源,通常一個伺服器會執行多個網站,比如www.siteA.com作為部落格,www.siteB.com作為論壇.通常一個服務一個IP,多個域名共用一個IP,多個域名共用一個埠(通常是80埠)。這時候需要一臺伺服器部署多個網站,多個網站共用一個IP,共用一個80埠
需要修改nginx.conf配置檔案,修改配置後需要重新載入配置檔案:
server {
listen 80; # 監聽埠
server_name www.siteA.com siteA.com; # 站點域名
location / {
root /home/user/www/blog; # 站點根目錄
index index.html index.htm index.php; # 預設導航頁
}
}
server {
listen 80;
server_name comwww.siteB.com siteB.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /home/user/www/forum;
index index.html index.htm;
}
}
現在訪問www.siteA.com和www.siteB.com,你將發現瀏覽器會開啟不同的站點
3.3訪問Nginx跳轉到tomcat
我們就修改了上面兩個地方,我的tomcat在8080埠,可以根據自己的需要修改。這裡有一個新元素proxy_pass,它表示代理路徑,相當於轉發,而不像之前說的root必須指定一個資料夾
server {
listen 80;
server_name localhost:8080
location / {
proxy_pass http://localhost:8080;
}
}
重新載入配置檔案
./nginx -s reload
四、負載均衡
首先我們得知道什麼是負載均衡。
負載均衡 建立在現有網路結構之上,它提供了一種廉價有效透明的方法擴充套件網路裝置和伺服器的頻寬、增加吞吐量、加強網路資料處理能力、提高網路的靈活性和可用性。
負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,從而共同完成工作任務。
負載均衡的核心是:將負載進行平衡
對於Nginx來說,他可以把提交的請求進行轉發。架構如下:
架構圖解釋:在這個圖中,使用者提交請求先到Nginx伺服器,然後由Nginx進行對這些請求的轉發,轉發到各個tomcat伺服器上,然後tomcat進行邏輯處理。
Nginx內建的負載均衡策略有3種:輪詢,加權輪詢,IP hash。同時支援擴充套件策略,完全可以自己寫一套規則交給Nginx去執行。
(1)輪詢
這種策略簡單易行,將請求平均的分配給每個伺服器去處理。
(2)加權輪詢
而Nginx是如何做的呢?首先Nginx中寫入了各個tomcat的伺服器的地址,架構師可以根據tomcat的效能,增加對其使用的程度。Nginx只需在nginx.conf中進行配置:
#配置多臺伺服器(這裡只在一臺伺服器上的不同埠)
#權重比設定為1 : 3 意思為 使用者請求四次伺服器,平均訪問8082埠3次,8081埠一次,以此達到伺服器均衡的作用(高併發)
upstream local_tomcat {
server localhost:8080 weight=1;
server localhost:8090 weight=3; #熱備
}
1.Nginx的具體配置
在server外新增一個upstream,在proxy_pass裡面直接用http://+upstream的名稱來使用。upstream中的server元素必須要注意,不能加http://,但proxy_pass中必須加
upstream local_tomcat {
server localhost:8080 weight=1;
server localhost:8090 weight=3; #熱備
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://local_tomcat;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
Nginx根據proxy_pass來訪問的路徑來確定訪問的server,根據權重自動分配選擇的哪一個。權重大的處理的概率高。
(3)IP hash
對客戶端請求的IP進行hash操作,然後根據hash結果將同一個客戶端IP的請求分發給同一臺伺服器進行處理,可以解決session不共享的問題。
參考:
https://blog.csdn.net/kisscatforever/article/details/73129270