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

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

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

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

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

:。。。

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

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

//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官網://nginx.org

nginx官方下載地址://nginx.org/en/download.html

在接下來的某些測試中,你可能看到使用的是root用戶或者是nginx普通用戶。使用root用戶是為了方便演示,實際工作中一般你用的更多的是普通用戶,一般只有管理員才有使用root用戶的許可權。

一、nginx快速安裝

注意:nginx默認安裝設置的sever是localhost,監聽埠是80。

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

Windows版本的nginx官方文檔地址://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源等等://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的官方文檔,很詳細。

//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目錄下。

//192.168.245.147/

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

//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可以參考官網中文文檔://hexo.io/zh-cn/docs/

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

使用hexo命令,hexo new命令生成文件,hexo server命令啟動服務,通過//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服務:

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

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

//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 //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 //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 //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即可配置反向代理,//後面配置的可以是ip也可以是域名

http{
	server{
		location / {
			proxy_pass //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 //test;
                root   html;
                index  index.html index.htm;
        	}
	  }
}

在Chrome瀏覽器訪問。使用upstream配置了負載均衡,訪問3次有兩次定位Apache頁面,一次定位hexo搭建靜態頁面:

//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配置很簡單://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思維導圖,這個鏈接可以直接訪問,就不以大圖形式展示了:

//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