面試官:小夥子,你對nginx熟悉嗎?
我:當然熟悉了,請聽我慢慢道來。
心裡想,我能吊打面試官嗎?今天非得滅一滅面試官的威風,平時都被懟的狗血淋頭。
面試官:就你那點花花腸子,我們還不清楚。
我:。。。
養成好習慣:先點贊、再收藏,再觀看。玩歸玩,鬧歸鬧,我們還是有乾貨的!
本文已收錄至github倉庫,有個人的Linux以及Windows伺服器方面的工作經驗總結,持續更新中:
前言
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_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/
訪問出現錯誤頁面則為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思維導圖,這個連結可以直接訪問,就不以大圖形式展示了:
總結
以上就是本次nginx安裝與配置的全部內容,希望能對你的工作與學習有所幫助。感覺寫的好,就拿出你的一鍵三連。在公眾號上更新的可能要快一點,公眾號目前還在完善中。能看到這裡的,都是帥哥靚妹。如果感覺總結的不到位,也希望能留下您寶貴的意見,我會在文章中進行調整優化。
原創不易,轉載也請標明出處和作者,尊重原創。不定期上傳到github或者gitee。認準龍騰萬里sky,如果看見其它平臺不是這個ID發出我的文章,就是轉載的。MySQL系列文章:《MySQL開發篇,儲存引擎的選擇真的很重要嗎?》已經上傳至github和gitee倉庫SQL-study。個人github倉庫地址,一般會先更新PDF檔案,然後再上傳markdown檔案。如果訪問github太慢,可以使用gitee進行克隆。