前提準備
虛拟機安裝
注意:安裝虛拟機是為了在本地虛拟化Linux環境,便于學習。對應了實際應用場景中,企業的雲伺服器
-
本地安裝虛拟機Vmware、Virtualbox、Parallls
我這裡隻找到了mac版本的vmware-fusion (opens new window),是以就使用這個版本了
-
系統CentOS 7.4
官網 (opens new window)下載下傳适合自己的版本
-
Nginx必掌握之核心技術 -
Nginx必掌握之核心技術 -
Nginx必掌握之核心技術
版本 | 說明 |
DVD ISO | 标準安裝版 |
Everything ISO | 對完整版安裝盤的軟體進行補充,內建所有軟體。(包含centos7 (opens new window)的一套完整的軟體包,可以用來安裝系統或者填充本地鏡像) |
Minimal ISO | 精簡版,自帶的軟體最少 |
NetInstall ISO | 網絡安裝鏡像(從網絡安裝或者救援系統) |
-
使用虛拟機,安裝CentOS鏡像
第一步、把鏡像安裝到Vmware,把下載下傳的鏡像拖到Vmware中
-
Nginx必掌握之核心技術 -
Nginx必掌握之核心技術 -
Nginx必掌握之核心技術 -
Nginx必掌握之核心技術 -
Nginx必掌握之核心技術 - 第二步、Vmware安裝好鏡像,進入CentOS系統配置
- 選擇語言
-
Nginx必掌握之核心技術
- 确認系統安裝位置
-
Nginx必掌握之核心技術 -
Nginx必掌握之核心技術
- 開始安裝,安裝過程中設定root密碼,安裝完成後重新開機
-
Nginx必掌握之核心技術 -
Nginx必掌握之核心技術 -
Nginx必掌握之核心技術 - 賬号root,密碼就是上一步設定的密碼
-
Nginx必掌握之核心技術 - 登陸後
-
Nginx必掌握之核心技術
配置虛拟機網絡
ip addr #檢視網絡
1
可以看到兩個網卡
lo
和
ens33
(lo是本地網卡)
使用vi編輯器打開
ens33
網絡的配置檔案,修改啟動配置(如何使用vi編輯器:
i
修模式改資料,
esc
退出,
:wq
儲存退出vi編輯器)
vi /etc/sysconfig/network-scripts/ifcfg-ebs33
1
重新開機網絡
systemctl restart network
1
就能看到ens33被配置設定在了網絡IP(192.168.174.128),但是這個網路是動态配置設定的内網位址,重新開機後會一直變化。
克隆虛拟機
打開虛拟機資源庫
兩種克隆方式,選擇哪種都可以将前面配置的虛拟機克隆出來新的
使用SSH連接配接虛拟機
使用SSH可以友善的在本地連接配接遠端雲伺服器(對應的就是我們這裡裝在本地的虛拟機),對其進行
SSH軟體很多,比如Xshell,他們的使用都大同小異,我這裡使用的是Mac上的Termius,
建立連接配接
主機位址就是雲伺服器的公網位址,對應就是上面本地虛拟機ens33這個網卡的位址,與公網位址不同,這個位址是内網位址,每次重新開機都會動态配置設定,是以我們使用這個位址連結上
修改固定IP
這一步僅僅是因為,ens33這個網卡的位址,每次重新開機都會動态配置設定,是以我們使用這個位址每次都需要修改SSH工具的“主機名”,是以,我們改成固定的。(如果你使用的是雲伺服器,使用公網IP連接配接,這個公網IP是不會變化的,就不用這一步)
還是進入ens33網卡的配置檔案
vi /etc/sysconfig/network-scripts/ifcfg-ens33
1
增加一下配置(如果想要了解這些是啥,需要自行了解下計算機網絡的基本知識)
IPADDR=192.168.174.120 # 設定IP
NETMASK=225.225.225.0 #子網路遮罩
GATEWAY=192.168.174.1 #網關
DNS1=8.8.8.8 # DNS伺服器位址
1
2
3
4
修改檔案中BOOTPROTO字段為static後,後IP就固定為了IPADDR的值
BOOTPROTO=static #原來值是dhcp,就是動态擷取ip的一個協定
1
Nginx介紹
-
Nginx開源版 http://nginx.org/en/
官方原始的Nginx版本
-
Nginx plus商業版
開箱即用,內建了大量功能
-
Open Resty https://openresty.org/cn/
OpenResty是一個基于Nginx與 Lua 的高性能 Web 平台,其内部內建了大量精良的 Lua 庫、第三方子產品以及大多數的依賴項。更适用于需要大量二次開發的場景,有極強的擴充性
-
Tengine https://tengine.taobao.org/
由淘寶網發起的Web伺服器項目。它在Nginx (opens new window)的基礎上,針對大通路量網站的需求,添加了很多進階功能和特性。Tengine的性能和穩定性已經在大型的網站如淘寶網 (opens new window),天貓商城 (opens new window)等得到了很好的檢驗。相比于Open Resty,擴充性不夠強,但是能夠滿足絕多數使用場景
Nginx安裝
-
下載下傳Nginx包
官網下載下傳位址(opens new window)
-
Nginx必掌握之核心技術 -
使用FTP工具将檔案上傳到虛拟機中
Termius也提供了FTP的功能,直接将下載下傳的Nginx包拖拽到主機目錄中,我這裡是放到了root目錄下
-
Nginx必掌握之核心技術 - 解壓Nginx包,并安裝
tar -zxvf nginx-1.21.6.tar.gz #解壓到目前目錄
cd nginx-1.21.6 #進入解壓後的檔案夾
ls #檔案夾中的檔案:auto CHANGES.ru configure html man src CHANGES conf contrib LICENSE README
安裝依賴庫
#安裝C編譯器
yum install -y gcc
#安裝pcre庫
yum install -y pcre pcre-devel
#安裝zlib
yum install -y zlib zlib-devel
安裝
./configure --prefix=/usr/local/nginx #使用prefix選項指定安裝的目錄
make
make install
啟動
cd /usr/local/nginx/sbin
ls # 裡面是一個nginx的可執行檔案
./nginx # 啟動這個可執行
關閉防火牆
systemctl stop firewalld
補充Nginx指令
./nginx -s stop #快速停止
./nginx -s quit #完成已接受的請求後,停止
./nginx -s reload #重新加載配置
./nginx -t #檢查nginx配置是否正确
檢視nginx狀态
ps -ef|grep nginx
啟動時:
停止時:
-
注冊系統服務
通過系統服務的方式啟動nginx
vim usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target # 多使用者
Nginx 目錄
conf #配置檔案
|-nginx.conf # 主配置檔案
|-其他配置檔案,都被引入到了nginx.conf
html #靜态頁面
logs
|-access.log #通路日志(每次通路都會記錄)
|-error.log #錯誤日志
|-nginx.pid #程序号
sbin
|-nginx #主程序檔案
*_temp #運作時,生成臨時檔案
Nginx配置
後面學習Nginx配置,每次修改配置檔案,一定要重載才能生效
systemctl reload nginx
1
簡化版的nginx.conf
worker_processes 1; # 啟動的worker程序數
events {
worker_connections 1024; #每個worker程序的連接配接數
}
http {
include mime.types; #include是引入關鍵字,這裡引入了mime.types這個配置檔案(同在conf目錄下,mime.types是用來定義,請求傳回的content-type)
default_type application/octet-stream; #mime.types未定義的,使用預設格式application/octet-stream
sendfile on; #詳情,見下文
keepalive_timeout 65; #長連結逾時時間
#一個nginx可以啟用多個server(虛拟伺服器)
server {
listen 80;#監聽端口80
server_name localhost; #接收的域名
location / {
root html; #根目錄指向html目錄
index index.html index.htm; #域名/index 指向 index.html index.htm檔案
}
error_page 500 502 503 504 /50x.html; # 伺服器錯誤碼為500 502 503 504,轉到"域名/50x.html"
location = /50x.html {# 指定到html檔案夾下找/50x.htm
root html;
}
}
}
sendfile
打開sendfile,使用者請求的資料不用再加載到nginx的記憶體中,而是直接發送
Nginx配置使用場景
修改nginx配置檔案後,記得重新加載nginx
systemctl reload nginx
不同二級域名,映射到不同靜态網頁
可以寫多個server字段,從前向後比對,先比對到哪個就用哪個
使用者通路
pro.hedaodao.ltd
,就會走到第一個server配置;
test.hedaodao.ltd
走到第二個配置
http {
#....其他屬性
server {
listen 80;
server_name pro.hedaodao.ltd;
location / {
root html/pro;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}}
server {
listen 80;
server_name test.hedaodao.ltd;
location / {
root html/test;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}}
}
不同域名,映射到同一靜态頁面
server_name
- 可以寫多個,用空格分開
- 使用通配符(*)
- 使用正規表達式(https://blog.csdn.net/yangyelin/article/details/112976539)
http{
server {
listen 80;
server_name *.hedaodao.ltd ~^[0-9]+\.hedaodao\.ltd$; # "\."是轉譯"."
location / {
root html/test;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}}
}
反向代理與負載均衡
反向代理:這種代理方式叫做,隧道代理。有性能瓶頸,因為所有的資料都經過Nginx,是以Nginx伺服器的性能至關重要
負載均衡:把請求,按照一定算法規則,配置設定給多台業務伺服器(即使其中一個壞了/維護更新,還有其他伺服器可以繼續提供服務)
反向代理+負載均衡
nginx.conf配置檔案
啟用proxy_pass,root和index字段就會失效
proxy_pass後的位址必須寫完整
http://xxx
,不支援https
當通路localhost時(Nginx伺服器),網頁打開的是
http://xxx
(應用伺服器),網頁位址欄寫的還是localhost
http{
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://xxx;
#root html/test;
#index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}}
}
**定義位址别名 **
使用upstream定義一組位址【在server字段下】
通路localhost,通路都會代理到
192.168.174.133:80
和
192.168.174.134:80
這兩個位址之一,每次通路這兩個位址輪着切換(後面講到,因為預設權重相等)
http{
upstream httpds{
server 192.168.174.133:80; #如果是80端口,可以省略不寫
server 192.168.174.134:80;}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://httpds;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}}
}
設定權重
通路使用哪個位址的權重
upstream httpds{
server 192.168.174.133:80 weight=10;
server 192.168.174.134:80 weight=80;
}
關閉
upstream httpds{
server 192.168.174.133:80 weight=10 down;
server 192.168.174.134:80 weight=80;
}
備用機
如果
192.168.174.133:80
出現故障,無法提供服務,就用使用backup的這個機器
upstream httpds{
server 192.168.174.133:80 weight=10;
server 192.168.174.134:80 weight=80 backup;
}
動靜分離
當使用者請求時,動态請求配置設定到Tomcat業務伺服器,靜态資源請求放在Nginx伺服器中
例子:
- 如果請求的資源位址是
,location/
的優先級比較低,如果下面的location沒比對到,就會走http://xxx這個位址的機器/
- 如果請求的資源位址是
,就會被比對到nginx的html目錄下的css檔案夾中(我們把css靜态資源放在這個位置)location/css/*
server {
listen 80;
server_name localhost;
location / { # /的優先級比較低,如果下面的location沒比對到,就會走http://xxx這個位址的機器
proxy_pass http://xxx;
}
location /css { # root指的是html,location/css指的是root下的css,是以位址就是html/css
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
使用正則
location ~*/(js|css|img){
root html;
index index.html index.htm;
}
URL重寫
rewrite是URL重寫的關鍵指令,根據regex(正規表達式)部分内容,重定向到replacement,結尼是flag标記。
rewrite <regex> <replacement> [flag];
關鍵字 正則 替代内容 flagt标記
正則:per1森容正規表達式語句進行規則比對
替代内容:将正則比對的内容替換成replacement
flag标記說明:
last #本條規則比對完成後,繼續向下比對新的1ocation URI規則
break #本條規則比對完成即終止,不再比對後面的任何規則
redirect #傳回302臨重定向,遊覽器位址會顯示跳轉後的URL位址
permanent #傳回301永久重定向,測覽器位址欄會顯示跳轉後的URL位址
浏覽器位址欄通路
xxx/123.html
實際上是通路
xxx/index.jsp?pageNum=123
server {
listen 80;
server_name localhost;
location / {
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
proxy_pass http://xxx;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
網關伺服器
上圖中,應用伺服器,不能直接被外網通路到,隻能通過Nginx伺服器進行通路(使用proxy_pass),這時候這台Nginx伺服器就成為了網關伺服器(承擔入口的功能)
是以,我們啟動應用伺服器的防火牆,設定其隻能接受這台Nginx伺服器的請求
添加rich規則
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.174.135" port protocol="tcp" port="8080" accept" #這裡的192.168.174.135是網關 伺服器位址
移除rich規則
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.174.135" port port="8080" protocol="tcp" accept"
重新開機
移除和添加規則都要重新開機才能生效
firewall-cmd --reload
檢視所有規則
firewall-cmd --list-all #所有開啟的規則
防盜鍊
當我們請求到一個頁面後,這個頁面一般會再去請求其中的靜态資源,這時候請求頭中,會有一個refer字段,表示目前這個請求的來源,我們可以限制指定來源的請求才傳回,否則就不傳回,這樣可以節省資源
valid_referers none|server_name
設定有效的refer值
- none:檢測位址沒有refer,則有效
- server_name:檢測主機位址,refer顯示是從這個位址來的,則有效(server_name必須是完整的
)http://xxxx
注意:
if ($invalid_referer)
中if後有個空格,不寫就會報錯
nginx: [emerg] unknown directive "if($invalid_referer)" in /usr/local/nginx/conf/nginx.conf:27
例子:這裡設定nginx伺服器中的img目錄下的圖檔必須refer為http:192.168.174/133才能通路
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://xxx;
}
location /img{
valid_referers http:192.168.174/133;
if ($invalid_referer){#無效的
return 403;#傳回狀态碼403
}
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
如果引用這張圖檔的頁面且refer并沒有被設定,圖檔無法加載出來
如果直接通路圖檔位址,因為沒有refer字段指向來源,會直接顯示Nginx的頁面
設定盜鍊圖檔
将提示圖檔放在html/img/x.png,通路設定防盜鍊圖檔時,就傳回這x.png張圖
location /img{
valid_referers http:192.168.174/133;
if ($invalid_referer){#無效的
rewrite ^/ /img/x.png break;
}
root html;
index index.html index.htm;
}
高可用場景
使用者通路時,通路的是一個虛拟IP,keepalived會標明一個主伺服器使用這個虛拟IP
每台機器上的keepalived會互相通信,根據其他機器上的keepalived程序是否存在,判斷伺服器狀态,如果預設的Master停止了,就會在剩下的Backup機器中,競選出一台Nginx伺服器作為Master
安裝keepalived
yum install -y keepalived
修改keepalived配置
- 配置檔案在/etc/keepalived/keepalived.conf
-
、vrrp_instance
、authentication
、virtual_router_id
這幾個一樣的機器,才算是同一個組裡。這個組才會選出一個作為Master機器virtual_ipaddress
這裡我們設定兩台機器,分别下載下傳好keepalived,然後進行配置
機器一:
! Configuration File for keepalived
global_defs {
router_id lb1 # 名字與其他配置了keepalive的機器不重複就行
}
vrrp_instance heyingjie {#vrrp執行個體名可以随意取
state MASTER #隻能有一個預設的Master,其他寫BACKUP
interface ens33 # ip addr檢視下網卡名,預設時ens33
virtual_router_id 51
priority 100 # 多台安裝了keepalived的機器競争成為Master的優先級
advert_int 1 #通信時間
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16 #虛拟IP
}
}
機器二:
! Configuration File for keepalived
global_defs {
router_id lb2
}
vrrp_instance heyingjie {
state BACKUP #隻能有一個預設的Master,其他寫BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16 #虛拟IP
}
}
通過指令
ip addr
檢視機器一的ip資訊,可以看到虛拟IP
配置證書
購買伺服器——>購買域名,并解析到這個主機——>購買證書,綁定到域名上,并且把證書檔案安裝到伺服器,并在Nginx上配置好
這時候,這個域名就可以使用https進行通路裡(
https://xxxx
),浏覽器上會有一個小鎖
上面的流程我比較熟悉了,就直接跳過了,這裡直接寫申請到證書後的Nginx配置部分
下載下傳證書檔案
server {
listen 443 ss1;
ss1 certificate xxx.pem; #這裡是證書路徑
ss1_ certificate_key xxx.key #這裡是私鑰路徑
}