天天看點

nginx入門到實踐配置反向代理和負載均衡

nginx1.21.6測試與使用;nginx下載下傳與安裝。nginx作為高性能web伺服器配置詳解,比較重要的一個參數epoll。nginx靜态資源伺服器;nginx配置反向代理;nginx配置負載均衡。測試nginx反向代理到Apache(httpd) 和Tomcat。

文末會提供一張nginx學習的思維導圖。

nginx入門到實踐配置反向代理和負載均衡

正文

初次進入nginx官網,映入眼簾。給人的整體感覺就是簡潔幹淨,一眼就能get到自己需要的資源。

nginx官網:http://nginx.org

nginx官方下載下傳位址:http://nginx.org/en/download.html

在接下來的某些測試中,你可能看到使用的是root使用者或者是nginx普通使用者。使用root使用者是為了友善示範,實際工作中一般你用的更多的是普通使用者,一般隻有管理者才有使用root使用者的權限。

一、nginx快速安裝

注意:nginx預設安裝設定的sever是localhost,監聽端口是80。

每一個代碼塊中都有詳細注解進行解釋,參考官方文檔然後進行的翻譯,并根據實際情況進行優化調整。

Windows版本的nginx官方文檔位址:http://nginx.org/en/docs/windows.html

1、Windows下安裝nginx

1.1、解壓安裝

#以管理者身份運作CMD視窗,進入D盤
d:
#建立work目錄
mkdir work
#切換至work目錄解壓nginx
unzip nginx-1.21.6.zip
           

1.2、啟動nginx

#進入nginx目錄
cd work\nginx-1.21.6
#啟動nginx服務
start nginx
           

1.3、檢視nginx服務

nginx.conf檔案中的參數:worker_processes 設定參數值為1,限制隻能運作一個工作程序。

#檢視nginx資源占用相關資訊
d:\work\nginx-1.21.6>tasklist /fi "imagename eq nginx.exe"

映像名稱                       PID 會話名              會話#       記憶體使用
========================= ======== ================ =========== ============
nginx.exe                     4108 Console                    6     11,232 K
nginx.exe                     4144 Console                    6     11,552 K
           

1.4、配置日志以及預設首頁

在nginx解壓目錄中nginx-1.21.6\conf目錄下打開nginx.conf配置檔案,可以根據需求進行配置。此步驟下不做詳細講解,在接下來的配置說明進行詳細講解。

#配置日志與根目錄首頁
access_log   logs/site.log;
root         D:/web/html;
           

1.5、Windows下nginx指令管理

nginx在Windows中的一些常用使用指令,在Linux中一樣可以使用stop、quit、reload指令管理nginx服務。

  • nginx -s stop:快速關閉服務;
  • nginx -s quit:優雅的關閉服務;
  • nginx -s reload:改變配置,啟動一個新的工作程序配置,優雅地關閉舊的工作程序;
  • nginx -s reopen:重新打開日志檔案;
  • nginx -t -c nginx.conf :檢測nginx文法配置。
nginx -s stop	#快速關閉服務
nginx -s quit	#優雅的關閉服務
nginx -s reload	#改變配置,啟動一個新的工作程序配置,優雅地關閉舊的工作程序
nginx -s reopen	#重新打開日志檔案
nginx -t -c conf\nginx.conf #檢測nginx文法配置
nginx: the configuration file D:\work\nginx-1.21.6/conf\nginx.conf syntax is ok
nginx: configuration file D:\work\nginx-1.21.6/conf\nginx.conf test is successful
           

2、Linux下安裝nginx

僅供參考,應該以實際工作場景為準,關于Linux中權限知識可以自己進行測試。

支援的Linux發行版也很豐富,同樣可以參考官方文檔,下載下傳Debian系列,Ubuntu系列,Redhat系列以及Centos系列等等。部分制作成了表格形式,便于參考。

nginx支援作業系統(列出部分) 版本 支援平台
RHEL/CentOS 7.4+ x86_64, ppc64le, aarch64/arm64
8.x x86_64, aarch64/arm64, s390x
Debian 10.x “buster” x86_64, i386, aarch64/arm64
11.x “bullseye” x86_64, aarch64/arm64
Ubuntu 18.04 “bionic”
21.10 “impish”

Linux下安裝nginx,官網給出了便捷方式yum源、apt源等等:http://nginx.org/en/linux_packages.html

個人示範使用下載下傳的源碼包。Redhat7系列以及Centos7系列安裝nginx-1.21.6,目前最新版本。可以使用nginx官方提供的yum源進行安裝,或者使用wget指令進行下載下傳安裝。個人給出使用tar包(源碼包)安裝方式,下載下傳到本機然後上傳至虛拟機搭建的Linux環境Centos7.5伺服器上。

2.1、安裝依賴環境

安裝需要的依賴環境,記住普通使用者需要使用sudo提權,root使用者則不需要。

[root@localhost ~]# yum install -y gcc pcre pcre-devel openssl openssl-devel gd gd-devel zlib-devel yum-utils
[nginx@localhost ~]$ sudo yum install -y gcc pcre pcre-devel openssl openssl-devel gd gd-devel zlib-devel yum-utils
           

2.2、解壓安裝nginx

配置可以參考nginx的官方文檔,很詳細。

http://nginx.org/en/docs/configure.html

解壓tar包,編譯指定路徑。不指定安裝路徑,預設安裝到/usr/local/nginx,源碼包預設安裝位置。配置--prefix參數,指定安裝路徑以及需要的子產品(module),使用make && make install指令編譯并安裝。

#01、解壓tar包
tar -zxvf nginx-1.21.6.tar.gz
#02、編譯指定路徑,不指定一樣預設安裝到/usr/local,源碼包預設安裝位置
cd nginx-1.21.6/
#03、配置,--prefix指定安裝路徑以及需要的子產品(module)
./configure --prefix=/usr/local/nginx-t --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module
#04、編譯并安裝
make && make install
           

檢視nginx的版本:

  • 參數-v:nginx -v 指令檢視nginx中間件的版本;
  • 參數-V:nginx -V指令檢視nginx版本以及系統使用GCC版本、OpenSSL版本和配置的--prefix參數。
nginx入門到實踐配置反向代理和負載均衡
[nginx@localhost ~]$ sudo /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.21.6
[nginx@localhost ~]$ sudo /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.21.6
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module
           

2.3、管理nginx服務

安裝nginx後的目錄/usr/local/nginx/,使用ls以及ll指令檢視安裝後的檔案。然後以絕對路徑方式啟動nginx服務: sudo /usr/local/nginx/sbin/nginx,在測試環境root使用者下無需加sudo提權。建立使用者,使用root使用者身份權限建立。改變nginx安裝目錄所有者和所屬組,賦予給nginx使用者,此時登入nginx使用者也可進行管理。

如何區分你使用的是超級管理使用者root還是普通使用者。

  • #:帶有#字首符号則是超級管理者使用者;
  • $:帶有$字首符号則是普通使用者。
#建立使用者,使用root使用者身份權限建立
[root@localhost ~]# useradd nginx #建立nginx使用者 
[root@localhost ~]# passwd nginx  #修改密碼
#僅供參考,應該以實際應用場景為準。
[root@localhost ~]# chown -R root:nginx /usr/local/nginx/
[root@localhost nginx]# ls /usr/local/nginx/
client_body_temp 	conf 	fastcgi_temp	html	logs	
proxy_temp	sbin	scgi_temp	uwsgi_temp
#安裝nginx後的目錄
[root@localhost ~]# ls /usr/local/nginx/
conf  html  logs  sbin
           

授予普通使用者nginx管理的權限。使用

visudo

或者

vim /etc/sudoers

,在檔案末尾加上

nginx ALL=(ALL) /usr/local/nginx/sbin/nginx

。作用是給nginx使用者使用nginx腳本指令的權限(使用sudo)。給使用者的權限範圍越精确,使用者權限則越小。在你賦予權限的時候,理應思考是否合理。開個小玩笑,一不小心将伺服器拱手讓人了,哈哈。我經常在說的一句話,你能夠将Linux的權限玩的明明白白,就已經領先很大一部分人。

# visudo
# vim /etc/sudoers
nginx ALL=(ALL) /usr/local/nginx/sbin/nginx
           

啟動nginx服務。root身份則無需提權,以絕對路徑形式啟動服務。普通使用者,則需要使用sudo權限提權管理nginx服務。sudo的用法,可以使用man幫助指令檢視。簡單的提一下,使用指令visudo添加普通使用者,或者編輯/etc/sudoers檔案加入普通使用者可執行的指令。

#root身份啟動nginx服務
[root@localhost ~]# /usr/local/nginx/sbin/nginx 
#普通使用者身份啟動nginx服務
[nginx@localhost ~]$ sudo /usr/local/nginx/sbin/nginx 
           

優雅的關閉nginx服務,實際上找的是nginx.pid檔案中存儲的pid号。可以通過cat檢視/usr/local/nginx/logs/nginx.pid。在nginx.conf配置檔案中去找到相應的設定,将#注釋去掉:

pid        logs/nginx.pid;
[root@localhost ~]# cat /usr/local/nginx/logs/nginx.pid
           
nginx入門到實踐配置反向代理和負載均衡

優雅的關閉nginx服務,nginx -s quit

[root@localhost ~]# /usr/local/nginx/sbin/nginx -s quit
[nginx@localhost ~]$ sudo /usr/local/nginx/sbin/nginx -s quit
           

重載nginx服務,nginx -s reload

[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
[nginx@localhost ~]$ sudo /usr/local/nginx/sbin/nginx -s reload
           

2.4、檢視nginx程序

可以使用

ps

指令配合

grep

搜素指令檢視nginx服務程序狀态,然後檢視啟動後的nginx目錄多出了client_body_temp、fastcgi_temp、proxy_temp、scgi_temp、uwsgi_temp子產品。

[nginx@localhost ~]$ ps -aux | grep nginx
root       7355  0.0  0.0  45992  1136 ?        Ss    nginx: master process /usr/local/nginx/sbin/nginx
nobody     7356  0.0  0.1  48528  1988 ?        S     nginx: worker process
root       7368  0.0  0.0 112720   972 pts/1    S+    grep --color=auto nginx
[nginx@localhost ~]$ ls /usr/local/nginx/
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp
           

2.5、驗證nginx服務

使用netstat指令檢視監聽到的nginx服務,預設使用的是80端口,一般80是不對外開放的。為了示範,使用firewalld指令開啟80端口,然後使用

firewall-cmd --reload

指令重載防火牆。

[root@localhost ~]# netstat -tlunp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7355/nginx: master 
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent 
success
[root@localhost ~]# firewall-cmd --zone=public --add-port=8081/tcp --permanent 
success
[root@localhost ~]# firewall-cmd --reload 
success
           

使用Chrome浏覽器登入nginx,比如我個人使用虛拟環境搭建的,通路即可看到nginx服務啟動完畢。即可看到,歡迎通路nginx服務。這個index.html頁面預設存放在nginx的安裝目錄中html目錄下。

http://192.168.245.147/
           
nginx入門到實踐配置反向代理和負載均衡

通路出現錯誤頁面則為50x.html靜态頁面的内容,直接在url後拼接通路50x.html檔案即可進行測試。

http://192.168.245.147/50x.html
           
nginx入門到實踐配置反向代理和負載均衡

至此,在Windows與Linux伺服器上安裝nginx服務以及服務的管理介紹完畢。在Linux版本中,我介紹的是比較詳細的,這也是為了照顧初學者。

二、nginx做靜态資源web伺服器

1、nginx中常見的錯誤碼

http消息 狀态碼 含義
已移動 http 301 請求的資料具有新的位置,并且永久更改。
已找到 http 302 請求的資料臨時具有不同URI。
請參閱其它 http 303 可在另一URI下找到對請求的響應,并且使用get請求檢索。
未修改 http 304 未按照預期修改文檔。
使用代理 http 305 必須通過位置字段中提供的代理來通路請求的資源。
未使用 http 306 不再使用,但保留此代碼以便将來使用。
無法找到網頁 http 400 可以連接配接到web伺服器,但由于web位址(URL)的問題無法找到網頁。
網站拒絕顯示此網頁 http 403 可以連接配接到網站,但Internet Explorer沒有通路網頁檔案的權限。
http 404 可以連接配接到網站,但找不到網頁。可能是網頁暫不可用或者已被删除。
網站無法顯示此網頁 http 405 可以連接配接到網站,但網頁内容無法下載下傳到使用者的計算機。可能是網頁編碼格式問題。
無法讀取此網頁格式 http 406 能從網站接收資訊,但Internet Explorer無法識别格式,不能正确地顯示消息。
網站忙,無法顯示此網頁 http 408或409 伺服器顯示網頁時間過長,或對同一網頁請求過多。
網頁不複存在 http 410 可以連接配接到網站,但找不到網頁。此錯誤為永久性的,而且由網站管理者打開。
網站無法顯示該頁面 http 500 正在通路的網站出現伺服器問題,阻止此網頁顯示。正在維護或者互動程式出錯。
未執行 http 501 沒有将正在通路的網站設定為顯示浏覽器所請求的内容。
不支援的版本 http 505 該網站不支援浏覽器用于請求網頁的http協定。

2、hexo+nginx靜态資源伺服器

2.1、hexo的使用

Windows下首先安裝node環境,然後使用npm再安裝hexo子產品。這裡隻介紹Windows下安裝hexo環境:

  • 01、安裝node環境;
  • 02、在node環境下安裝hexo,打開cmd指令視窗執行:

    npm install -g hexo-cli

  • 03、繼續在cmd視窗指令安裝:

    npm install hexo

具體其它平台安裝hexo可以參考官網中文文檔:https://hexo.io/zh-cn/docs/

在node環境下安裝hexo後生成的blog檔案目錄:

nginx入門到實踐配置反向代理和負載均衡

使用hexo指令,hexo new指令生成檔案,hexo server指令啟動服務,通過http://localhost:4000通路hexo。

D:\work\createSpace\hexo\blog>hexo new "你要生成的md檔案名"
hexo generate #生成靜态檔案
hexo server #啟動服務
           
nginx入門到實踐配置反向代理和負載均衡

2.2、在nginx中通路

将hexo生成的靜态html檔案上傳到虛拟環境中nginx伺服器的html目錄下,預設的設定的根目錄和和首頁配置不變。在虛拟機搭建的nginx靜态資源伺服器,并且使用了反向代理,代理了預設的80端口開啟的nginx服務:

http://192.168.245.147:8081/archives/2022/02/
           
nginx入門到實踐配置反向代理和負載均衡

如果想看具體效果可以通路我在github上搭建的測試環境:

https://cnwangk.github.io/archives/2022/02/
           

你可以使用hexo、jekyI以及hugo去生成靜态網頁,然後部署到nginx伺服器上。如果買了雲伺服器,可以利用起來。再入手一個域名,申請藍色的幕布,然後進行備案使用https解析,nginx同樣也是支援ssl(解析https協定)的。

我同時開啟了兩個nginx服務,使用其中一個反向代理另一個nginx服務。配置檔案如下設定,反向代理使用到關鍵字為proxy_pass:

#在http子產品中配置
http{
    upstream test {
        server 192.168.245.147;
    }
    server {
 			location / {
            	proxy_pass http://test;
            	root   html;
            	index  index.html index.htm;
            }
	 }
}	
           

檢視nginx程序,發現有兩個不同路徑的程序,分别是nginx檔案和nginx-t檔案:

[nginx@localhost nginx-1.21.6]$ ps -aux | grep nginx
root      15241  0.0  0.0  46004  1132 ?        Ss    nginx: master process 
/usr/local/nginx-t/sbin/nginx
nobody    15242  0.0  0.1  48528  2488 ?        S     nginx: worker process
root      15274  0.0  0.0  45992  1136 ?        Ss    nginx: master process /usr/local/nginx/sbin/nginx
nobody    15275  0.0  0.1  48532  2240 ?        S     nginx: worker process
root      15302  0.0  0.0 112724   968 pts/2    S+    grep --color=auto nginx
           

進行測試示範。監聽的端口,Redhat7系列使用firewall-cmd指令啟用了80和8081端口。

[nginx@localhost nginx-1.21.6]$ netstat -tlunp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      15274/nginx: master 
tcp        0      0 0.0.0.0:8081            0.0.0.0:*               LISTEN      15241/nginx: master 
           

三、nginx代理服務

談到代理,能聯想到的有生活中的代理商,還有平時想翻山越海其實也是利用代理服務。國内某大廠原創game雖然火不久,但代理出了名,估計大家也猜出來了。在我們的nginx中間件中一樣可以實作正向代理和反向代理,反向代理恰恰是nginx服務的重要功能之一。通過圖形化可以更直覺的了解代理。

圖1-1:正向代理

nginx服務配置正向代理的3個指令:

  • resolver:用于指定DNS伺服器的IP位址。
  • resolver_timeout:用于設定DNS伺服器域名解析逾時時間。
  • proxy_pass:用于設定代理協定,同時也是配置反向代理的指令。
nginx入門到實踐配置反向代理和負載均衡

圖1-2:反向代理

  • proxy_pass:配置反向代理的主要參數,注意指明傳輸協定。
  • proxy_hide_header:用于隐藏一些頭域資訊。
  • proxy_pass_header:用于處理發送響應封包時接收一些date、server、x-accel頭域資訊。
  • proxy_set_header:用于更改nginx伺服器接收到用戶端請求的請求頭資訊。

關于反向代理指令就介紹這幾個,更多的可以參考ngx_http_proxy_module,nginx官網proxy子產品。我也列出我在工作中實際應用到配置:

proxy_pass_header User-Agent;
proxy_set_header Host $http_host;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
           
nginx入門到實踐配置反向代理和負載均衡

代理差別:形式上服務的對象不一樣。

  • 正向代理代理的對象是用戶端,為用戶端服務;
  • 反向代理代理的對象是服務端,為服務端服務。

為了示範進行測試,開啟了nginx服務、httpd服務以及Tomcat服務。

在使用nginx代理服時,看看nginx支援哪些代理協定,如圖1-3:

nginx入門到實踐配置反向代理和負載均衡

主要示範工作中一些場景:

  • nginx代理到nginx;
  • nginx代理到Apache;
  • nginx代理到Tomcat;

1、nginx目錄結構簡介

nginx目錄作用:

  • conf目錄:主要存放nginx的配置檔案,主要的控制檔案。
  • html目錄:存放靜态資源目錄。
  • logs目錄:存放nginx生成的日志檔案(包含錯誤日志)以及nginx.pid檔案存放nginx分程序pid号。
  • sbin目錄:nginx服務腳本,需要使用root管理者身份管理服務,或者使用sudo提權。
[nginx@localhost ~]$ ls /usr/local/nginx
conf	html	logs	sbin
           

2、ngin.conf檔案的介紹

初學者在配置nginx.conf檔案中的參數時,往往會遇到文法錯誤,可以使用nginx提供指令進行檢測文法配置:

[nginx@localhost ~]$ sudo /usr/local/nginx/sbin/nginx -t
[nginx@localhost ~]$ sudo /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
           

文法配置正确,則會有以下提示:

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
           

2.1、使用者與程序配置區

  • user參數:用來配置使用者以及使用者組,如果配置為nobody代表不限制使用者。
  • worker_processes:worker_processes參數配置工作程序。可以根據CPU核心數配置,比如4核配置4個工作程序,提高并發。
#user  nobody;
worker_processes  1;
           

2.2、日志與pid配置區

  • error_log:配置錯誤日志;
  • pid:配置nginx存儲的pid号,臨時的,服務關閉就消失了。可以根據pid号去殺死程序。
#配置日志區
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
#pid存儲位置,可以根據pid号去殺死程序
pid        logs/nginx.pid;
           

2.3、events配置區

events事件配置區,配置全局的。worker_connections參數預設配置的1024,可以根據系統去優化設定最大的工作連接配接數。

#配置連接配接數
events {
    worker_connections  1024;
}
           

2.4、http子產品

  • 包含server子產品,可以配置多個。
  • 包含location子產品,同樣可以配置多個。
  • 負載均衡upstream同樣配置在http子產品中,server子產品之外。
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;
    #配置負載均衡    
    upstream tomcat {
        #可以是域名,或者是ip加端口
        server www.example.com;
        server 192.168.245.147:8888;
    }
 }
           

2.5、server子產品

  • listen:配置nginx服務監聽端口,預設為80端口,可以根據實際需求更改;
  • server_name:配置服務名,可以是IP位址也可以是域名;
  • charset:配置字元集;
  • access_log:通路服務接收的日志所在主要目錄;
  • location:包含location設定,主要有首頁以及代理請求頭等等參數配置。
server {
        listen 8088;
        #listen       8443 ssl;
        #server_name  192.168.0.233;
        server_name 127.0.0.1;
        #charset koi8-r;
        access_log  logs/host.access.log  main;
        #讀取根目錄    
        location / {
           proxy_pass http://test;
           #設定讀取的目錄 
           root   html;
           index  index.html index.htm;   
        }
        #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;
        }
           

2.6、location配置區,初次安裝預設隻有root配置根目錄和index配置首頁。proxy_pass是配置代理,我後面加的。

#讀取根目錄    
  location / {
  		#配置代理
        proxy_pass http://192.168.245.233;
        #設定讀取的目錄 
        root   html;
        index  index.html index.htm;   
   }
           

2.7、配置多個conf檔案

在複雜的場景下可能會配置多個conf檔案,使用include關鍵字包含其它的配置檔案。

#配置多個conf檔案包含進來
include  conf/*.conf;
           

3、nginx反向代理配置

反向代理恰恰是nginx服務的重要功能之一,着重示範一下反向代理過程。其實配置參數很簡單,使用proxy_pass即可配置反向代理,http://後面配置的可以是ip也可以是域名。

http{
	server{
		location / {
			proxy_pass http://192.168.245.233:88;
		}
	}
}
           

3.1、反向代理到Apache

nginx入門到實踐配置反向代理和負載均衡

3.1.1、在Redhat7系列直接使用yum指令安裝Apache,通過rpm指令驗證是否安裝httpd服務。

[nginx@localhost ~]$ rpm -qa | grep httpd
httpd-2.4.6-97.el7.centos.4.x86_64
httpd-tools-2.4.6-97.el7.centos.4.x86_64
           

3.1.2、安裝Apache服務

Redhat系列使用yum指令安裝httpd。

$ sudo yum -y install httpd
# yum -y install httpd
           

httpd安裝後的目錄,主要配置檔案存放在conf目錄下:

  • conf:httpd.conf配置檔案目錄;
  • conf.d:其它配置檔案,比如使用者存儲目錄配置;
  • logs:接收的日志檔案access_log 、error_log;
  • modules:代理、請求以及重寫規則等子產品。
[nginx@localhost ~]$ ls /etc/httpd/
conf  conf.d  conf.modules.d  logs  modules  run
[nginx@localhost ~]$ ls /etc/httpd/conf
httpd.conf  magic
           

使用yum指令安裝後的指令腳本,使用whereis指令檢視httpd,預設路徑在/usr/sbin/httpd。

[nginx@localhost ~]$ whereis httpd
httpd: /usr/sbin/httpd /usr/lib64/httpd /etc/httpd /usr/share/httpd /usr/share/man/man8/httpd.8.gz
[nginx@localhost ~]$ ll /usr/sbin/httpd
-rwxr-xr-x. 1 root root 523640  /usr/sbin/httpd
           

3.1.3、修改Apache服務監聽的端口,修改Listen後面的參數為81端口進行測試。

nginx入門到實踐配置反向代理和負載均衡
# vim /etc/httpd/conf/httpd.conf
Listen 81
           

通路的html頁面在

/usr/share/httpd/noindex

目錄下:

[nginx@localhost ~]$ ls /usr/share/httpd/noindex/
css  images  index.html
           

3.1.4、反向代理Apache

配置負載均衡,設定了參數weight權重。在我們安裝的nginx服務中進行配置代理,測試使用的nginx服務設定監聽8081端口。并且給反向代理的Apache服務配置的權重為2,執行3次有兩次會顯示Apache服務頁面。

http{
	    upstream test {
        	server 192.168.245.147:81 weight=2;
        	server 192.168.245.147;
    }
		server{
       	  listen       8081;
       	  server_name  localhost;
      	  location / {
            	proxy_pass http://test;
                root   html;
                index  index.html index.htm;
        	}
	  }
}
           

在Chrome浏覽器通路。使用upstream配置了負載均衡,通路3次有兩次定位Apache頁面,一次定位hexo搭建靜态頁面:

http://192.168.245.147:8081
           
nginx入門到實踐配置反向代理和負載均衡

3.2、反向代理到Tomcat

開啟Tomcat服務預設使用端口8080,可以根據實際情況修改。加入到防火牆規則

[root@localhost conf]# firewall-cmd --zone=public --add-port=8080/tcp --permanent 
success
           

重載防火牆

[root@localhost conf]# firewall-cmd --reload 
success
           

原始啟動tomcat服務預設server.xml配置的是8080端口,我進行了反向代理使用8081通路。啟動tomcat服務

[root@localhost conf]# /usr/local/apache-tomcat-8.5.49/bin/catalina.sh run &
           

加入tomcat服務的ip位址到負載均衡。設定通路Apache服務的權重weight=2,通路兩個站點3次,其中兩次會出現Apache頁面,第三次則會出現Apache Tomcat頁面。

upstream test {
      server 192.168.245.147:81 weight=2;
      #server 192.168.245.147;
      server 192.168.245.147:8080;
  }
           
nginx入門到實踐配置反向代理和負載均衡

實際上你可以在nginx上再套一層nginx,nginx反向代理nginx,隻是沒有代理其它中間件來的那麼直覺。

四、nginx負載均衡

其實我在示範上面的反向代理過程中,就已經用到了負載均衡。在測試的過程中,請加入需要的防火牆規則,避免造成不必要的麻煩。

tips:server後面可以接ip,也可以接域名。

1、負載均衡的幾種模式

1.1、負載均衡預設配置

預設的負載均衡設定,采用輪詢的形式,權重是均衡的。如果想測試建議配置多個nginx監聽服務,然後進行測試。非要問個為什麼,那就是nginx很輕很小,但是功能很強大!

#預設負載均衡(輪詢)
upstream proxy_demo1{
	server 192.168.245.233:8086;
	server 192.168.245.233:8087;
	server 192.168.245.233:8088;
}
           

1.2、負載均衡權重輪詢

做5次重新整理通路的頁面測試,其中有3次會定位到設定權重為3的8087端口對應的ip上,剩餘兩次分别定位到8086和8088上。

#權重輪詢負載均衡
upstream proxy_demo2{
	server 192.168.245.233:8086;
	server 192.168.245.233:8087 weight=3;
	server 192.168.245.233:8088;
}
           

1.3、負載均衡基于ip_hash

ip_hash配置很簡單:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash

#配置文法
Syntax:	ip_hash; 	Default:	—  		Context:	upstream
upstream backend {
    ip_hash;#加入參數即可
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
    server backend4.example.com;
}
           

ip_hash政策:是将前端的通路IP進行hash操作,然後根據hash結果将請求配置設定給不同的後端節點。可以将這種政策看成一種特殊的輪詢政策,每個前端通路IP會固定通路一個後端節點。優勢:避免考慮前端使用者的session在後端多個節點上共享的問題。

#基于ip的hash
upstream proxy_demo3{
    ip_hash;
	server 192.168.245.233:8086;
	server 192.168.245.233:8087;
	server 192.168.245.233:8088;
}
           

1.4、負載均衡基于url的hash

url_hash政策和ip_hash類似,屬于第三方擴充子產品。不同點在于ip_hash政策是對前端通路IP進行hash操作;url_hash政策是對前端請求的url進行了hash操作。url_hash優勢:如果後端有緩存伺服器,他能夠高緩存效率,同時解決session的問題。缺點是後端節點出現異常,不能自動排除此節點。說到web緩存,相信有不少web後端開發者對Squid伺服器有所了解,經典組合方式nginx緩存功能配合Squid服務。

#基于url的hash
upstream proxy_demo4{
    #url_hash;
    hash $request_uri;
	server 192.168.245.233:8086;
	server 192.168.245.233:8087;
	server 192.168.245.233:8088;
}
           

2、nginx優化

nginx的進階配置,針對核心、cpu、網絡連接配接以及事件驅動模型進行配置的思考:

  • ipv4核心7個參數;
  • cpu配置優化;
  • 網絡連接配接配置4個相關指令;
  • 事件驅動模型8個指令。

3、nginx其它應用場景

nginx做緩存伺服器

  • nginx伺服器基于proxy store的緩存機制;
  • nginx伺服器基于memcached的緩存機制;
  • nginx伺服器基于proxy cache的緩存機制。
  • nginx與squid伺服器組合配置。

感興趣的可以對nginx的Rewrite功能、gzip子產品;時間管理、記憶體管理以及工作程序進行深度學習。

文末提供一張nginx思維導圖,這個連結可以直接通路,就不以大圖形式展示了:

https://gitee.com/dywangk/img/raw/master/images/nginx%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E8%B7%B501.png

總結

以上就是本次nginx安裝與配置的全部内容,希望能對你的工作與學習有所幫助。感覺寫的好,就拿出你的一鍵三連。在公衆号上更新的可能要快一點,公衆号目前還在完善中。能看到這裡的,都是帥哥靓妹。如果感覺總結的不到位,也希望能留下您寶貴的意見,我會在文章中進行調整優化。

nginx入門到實踐配置反向代理和負載均衡

原創不易,轉載也請标明出處和作者,尊重原創。不定期上傳到github或者gitee。認準龍騰萬裡sky,如果看見其它平台不是這個ID發出我的文章,就是轉載的。MySQL系列文章:《MySQL開發篇,存儲引擎的選擇真的很重要嗎?》已經上傳至github和gitee倉庫SQL-study。個人github倉庫位址,一般會先更新PDF檔案,然後再上傳markdown檔案。如果通路github太慢,可以使用gitee進行克隆。

作者:龍騰萬裡sky
上一篇: batch

繼續閱讀