對線面試官,憑藉nginx能一戰封神嗎?

龍騰萬里sky發表於2022-02-09

面試官:小夥子,你對nginx熟悉嗎?

:當然熟悉了,請聽我慢慢道來。

心裡想,我能吊打面試官嗎?今天非得滅一滅面試官的威風,平時都被懟的狗血淋頭。

面試官:就你那點花花腸子,我們還不清楚。

:。。。

養成好習慣:先點贊、再收藏,再觀看。玩歸玩,鬧歸鬧,我們還是有乾貨的!

本文已收錄至github倉庫,有個人的Linux以及Windows伺服器方面的工作經驗總結,持續更新中:

https://github.com/cnwangk/SQL-study

前言

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

有個人的實際工作經驗,使用了nginx作為反向代理Apache Tomcat中介軟體,採用openssl工具或者Java ketool生成自簽名驗證https協議。也有部分是自己平時閒來無事,在虛擬機器環境弄著玩,玩著玩著就總結了不少。這下可以吊打面試官了吧,哈哈。當然只是開個玩笑,能做面試官的,肚子裡最起碼是有點存貨的。

對於nginx方面的知識我還是有點存貨的。花錢買過視訊教程,配置過多次;看過實體書,在實際工作中也應用過。這次是基於官方文件,然後進行了總結,發現nginx雖然很小,但很持久很強大。關於入手的nginx視訊教程:當年網上教程駁雜而不繫統,個人花了200入手了某網站的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發行版也很豐富,同樣可以參考官方文件,下載Debian系列,Ubuntu系列,Redhat系列以及Centos系列等等。部分製作成了表格形式,便於參考。

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

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@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  #修改密碼
#改變所有nginx所有者和所屬組,賦予給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 -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_tempfastcgi_tempproxy_tempscgi_tempuwsgi_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/

訪問出現錯誤頁面則為50x.html靜態頁面的內容,直接在url後拼接訪問50x.html檔案即可進行測試

http://192.168.245.147/50x.html

至此,在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檔案目錄:

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

D:\work\createSpace\hexo\blog>hexo new "你要生成的md檔名"
hexo generate #生成靜態檔案
hexo server #啟動服務

2.2、在nginx中訪問

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

http://192.168.245.147:8081/archives/2022/02/

如果想看具體效果可以訪問我在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:用於設定代理協議,同時也是配置反向代理的指令。

圖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服務、httpd服務以及Tomcat服務。

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

主要演示工作中一些場景

  • 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

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埠進行測試。

# 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

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負載均衡

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

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

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

作者:龍騰萬里sky

相關文章