目錄
1. Nginx使用場(chǎng)景
2. Nginx中的進(jìn)程
2.1 Nginx中的多進(jìn)程模型
2.2 多進(jìn)程模式的優(yōu)點(diǎn):
2.3 緩存
3. Ngnix的負(fù)載均衡策略
3.1 輪詢法
3.2 加權(quán)輪詢
3.3 原地址哈希
3.4 最小連接數(shù)法
3.5 Fair
3.6 url_hash
3. Nginx配置文件
4. Nginx+tomcat 集群示例
4.1 下載鏡像
4.2 在宿主機(jī)中創(chuàng)建需要掛載的目錄
4.3 常見測(cè)試用的index.html
4.4 創(chuàng)建Nginx配置文件
4.5 啟動(dòng)3個(gè)tomcat容器準(zhǔn)備集群
4.6 根據(jù)tomcat容器實(shí)際IP修改Nginx配置文件
4.7 啟動(dòng)Nginx容器
4.8 測(cè)試集群
5. Nginx部署靜態(tài)網(wǎng)站
5.1 準(zhǔn)備前端應(yīng)用
5.2 創(chuàng)建構(gòu)建目錄
5.3 構(gòu)建鏡像
5.4 運(yùn)行容器
1. Nginx使用場(chǎng)景
Nginx的主要使用場(chǎng)景:
- HTTP服務(wù)器
Nginx可以作為靜態(tài)服資源服務(wù)器來使用,例如在前后端分離的架構(gòu)中可以將前端應(yīng)用部署在Nginx服務(wù)器中。也可作為上傳服務(wù)器、圖片服務(wù)器等使用 - 作為反向代理
Nginx可以作為反向代理,將來自互聯(lián)網(wǎng)的外部請(qǐng)求轉(zhuǎn)發(fā)到內(nèi)網(wǎng)中應(yīng)用服務(wù)器。通過反向代理可以實(shí)現(xiàn)負(fù)載均衡。
Nginx內(nèi)置了豐富的負(fù)載均衡算法:輪詢,基于權(quán)重,ip_hash等,通過第三方支持,還有fair(響應(yīng)時(shí)間短的優(yōu)先分配),url_hash等。
2. Nginx中的進(jìn)程
2.1 Nginx中的多進(jìn)程模型
Nginx的具有很高的性能,有龐大的使用群體,這與它的基本架構(gòu)有緊密關(guān)系。
在Nginx運(yùn)行時(shí)后臺(tái)包括一個(gè)master主進(jìn)程和多個(gè)worker進(jìn)程。Nginx也可以支持多線程方式工作,但模式使用多進(jìn)程,也是主流的使用方式。
-
master進(jìn)程
主進(jìn)程主要進(jìn)行Nginx配置文件解析,數(shù)據(jù)結(jié)構(gòu)初始化,模塊注冊(cè)配置,信號(hào)處理,網(wǎng)絡(luò)監(jiān)聽,工作進(jìn)程生成和管理等工作。監(jiān)控worker進(jìn)程的狀態(tài),在worker進(jìn)程異常退出后可以自動(dòng)重新啟動(dòng)進(jìn)程。 -
worker進(jìn)程
多個(gè)worker進(jìn)程之間是對(duì)等的關(guān)系,競(jìng)爭(zhēng)去處理客戶的請(qǐng)求,一個(gè)請(qǐng)求只有一個(gè)worker去處理。worker進(jìn)程數(shù)量一般與機(jī)器cpu數(shù)量相當(dāng)。每個(gè)worker都是單線程的,采用異步非阻塞方式處理請(qǐng)求。是Nginx服務(wù)器提供服務(wù)的主體。
當(dāng)一個(gè)請(qǐng)求進(jìn)來時(shí),多個(gè)worker會(huì)競(jìng)爭(zhēng)處理這個(gè)請(qǐng)求,但有且只有一個(gè)worker可以獲取到該請(qǐng)求的處理權(quán)限。
2.2 多進(jìn)程模式的優(yōu)點(diǎn):
每個(gè)worker進(jìn)程是互相獨(dú)立的,互相不影響,一個(gè)進(jìn)程的退出不影響其他的進(jìn)程服務(wù)。每個(gè)worker進(jìn)程使用異步非阻塞方式來處理請(qǐng)求,具有很高的性能。
2.3 緩存
Nginx服務(wù)器為提供請(qǐng)求的處理效率,減輕網(wǎng)絡(luò)壓力,采用緩存機(jī)制。緩存機(jī)制將歷史應(yīng)答的數(shù)據(jù)緩存到本地,并且在Nginx啟動(dòng)后會(huì)啟動(dòng)一個(gè)專門的后臺(tái)進(jìn)程對(duì)本地緩存內(nèi)容建立維護(hù)索引,以此來加快緩存文件的訪問。
所以Nginx的后臺(tái)進(jìn)程出master進(jìn)程,worker進(jìn)程以外,還有后端服務(wù)進(jìn)程。
3. Ngnix的負(fù)載均衡策略
Nginx中支持多種負(fù)載均衡策略,在不同的使用場(chǎng)景中我們可以選擇合適的負(fù)載均衡策略
3.1 輪詢法
將請(qǐng)求輪流分配到注冊(cè)的后端服務(wù)器中,平等的對(duì)待所用的后端服務(wù)器,不關(guān)心服務(wù)器的實(shí)際連接數(shù)就負(fù)載情況。比較適合后端服務(wù)器的配置都差不多的情況。例如如下配置:
upstream server {
server 192.160.0.123:8080;
server 192.160.0.124:8080;
server 192.160.0.125:8080;
}
3.2 加權(quán)輪詢
可以為每個(gè)武器配置一個(gè)權(quán)重值,權(quán)重值越大將會(huì)有機(jī)會(huì)分擔(dān)更多的請(qǐng)求,該配置方式比價(jià)適合集群中各個(gè)服務(wù)器配置不均衡的情況,對(duì)高的服務(wù)器可以配置大一些的權(quán)重,對(duì)配置低的機(jī)器可以配置小一些的權(quán)重。
upstream server {
server 192.160.0.123:8080 weight=4;
server 192.160.0.124:8080 weight=2;
server 192.160.0.125:8080 weight=1;
}
3.3 原地址哈希
根據(jù)獲取客戶端的IP地址,通過哈希函數(shù)計(jì)算得到一個(gè)數(shù)值,用該數(shù)值對(duì)服務(wù)器的大小進(jìn)行取模計(jì)算,得到的結(jié)果作為客戶端要訪問的服務(wù)器的序號(hào)。
特點(diǎn):這種方式可以保證來自同一ip的請(qǐng)求被打的固定機(jī)器上,可以解決session問題。
示例:
upstream server {
ip_hash;
server 192.160.0.123:8080 weight=1;
server 192.160.0.124:8080 weight=2;
server 192.160.0.125:8080 weight=1;
}
3.4 最小連接數(shù)法
該算法根據(jù)后端服務(wù)器當(dāng)前的連接情況,動(dòng)態(tài)的選取其中當(dāng)前堆積的連接數(shù)最少的一臺(tái)服務(wù)器來處理請(qǐng)求,以便于提高服務(wù)的利用率。
這種算法比較適合后端各個(gè)服務(wù)器配置不同的情況。
示例:
upstream server {
least_conn;
server 192.160.0.123:8080 weight=1;
server 192.160.0.124:8080 weight=2;
server 192.160.0.125:8080 weight=1;
}
3.5 Fair
Fair負(fù)載均衡比基于權(quán)重,和ip_hash算法更加智能,可以根據(jù)后端服務(wù)器的響應(yīng)時(shí)間來分配請(qǐng)求,響應(yīng)時(shí)間短優(yōu)先分配。
該算法由第三方提供,需要安裝upstream_fair模塊。
示例:
upstream server {
fair;
server 192.160.0.123:8080 weight=1;
server 192.160.0.124:8080 weight=2;
server 192.160.0.125:8080 weight=1;
}
3.6 url_hash
與ip_hash比較接近,該算法根據(jù)url的哈希結(jié)果來分配請(qǐng)求,使每個(gè)url定向到一臺(tái)后端服務(wù)器上。
該算法為第三方提供,使用時(shí)需要先安裝Nginx的hash軟件包
upstream server {
hash $request_uri;
server 192.160.0.123:8080 weight=1;
server 192.160.0.124:8080 weight=2;
server 192.160.0.125:8080 weight=1;
}
3. Nginx配置文件
Nginx配置文件主要有4部分:
- main(全局配置)
Main部分的設(shè)置影響其他所有部分的設(shè)置 - server(主機(jī)配置)
主要用于指定虛擬機(jī)主機(jī)域名,ip和端口等內(nèi)容 - upstream(上游服務(wù)器配置,用于反向代理,負(fù)載均衡)
用于設(shè)置一系列的后端服務(wù)器,設(shè)置反向代理及后端服務(wù)器的負(fù)載均衡 - location(url匹配特定位置的配置)
用于匹配網(wǎng)頁位置(如,跟目錄“/”,”/images”等)
nginx配置文件示例:
#指定用戶和用戶組,不指定默認(rèn)為nobody
user nginx;
#工作進(jìn)程數(shù),根據(jù)機(jī)器情況設(shè)置
worker_processes 1;
#日志設(shè)置
error_log /var/log/nginx/error.log warn;
#pid文件
pid /var/run/nginx.pid;
events {
#配置事件驅(qū)動(dòng)模型,其他還要select,poll,kqueue等
use epoll;
#配置每個(gè)worker最大連接數(shù)
worker_connections 1024;
}
http {
#引入其他配置文件,在nginx服務(wù)器中有/etc/nginx/mime.types
#當(dāng)nginx收到靜態(tài)請(qǐng)求時(shí),在請(qǐng)求文件的類型在mime.types中匹配mime type
#這些mime type數(shù)據(jù)告訴瀏覽器文件數(shù)據(jù)的類型,以便于更好的展示數(shù)。
include /etc/nginx/mime.types;
#默認(rèn)為二進(jìn)制數(shù)據(jù)流
default_type application/octet-stream;
#定義日志格式,$remote_addr,$remote_user等是nginx中的預(yù)定義變量
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"';
#配置日志
access_log /var/log/nginx/access.log main;
#使用sendfile系統(tǒng)調(diào)用來提高性能
sendfile on;
#tcp_nopush on;
#指定 KeepAlive 的超時(shí)時(shí)間(timeout)
#keepalive模式告訴web服務(wù)器在處理完一個(gè)請(qǐng)求后保存這個(gè)tcp連接,
#如果在規(guī)定的超時(shí)時(shí)間內(nèi)接收到客戶端的其他請(qǐng)求,服務(wù)端會(huì)利用這個(gè)未關(guān)閉
#的連接,而不需在重新創(chuàng)建連接
keepalive_timeout 60s;
#是否開啟gzip壓縮功能
#gzip on;
upstream tomcat {
server 172.17.0.2:8080;
server 172.17.0.3:8080;
}
server {
listen 80;
server_name localhost;
#location部分,通過指定模式與客戶端請(qǐng)求uri進(jìn)行匹配。
#基本語法如下:location [=|~|~*|^~|@] pattern{……}
#1.沒有修飾符 表示必須以指定模式開始。例如:location /abc
#2.=表示:必須與指定的模式精確匹配。例如:location = /abc
#3.~表示:指定的正則表達(dá)式要區(qū)分大小寫。例如:location ~ ^/abc$
#4.~*表示:指定的正則表達(dá)式不區(qū)分大小寫。例如:location ~* ^/abc$
#5.^~ 類似于無修飾符的行為,也是以指定模式開始,不同的是,如果模式匹配,那么就停止搜索其他模式了
#正則表達(dá)式示例:location ~* \.(gif|jpg|jpeg)$ 匹配任何以gif, jpg, or jpeg結(jié)尾的文件
#通用匹配,任何請(qǐng)求都匹配到
location / {
#配置轉(zhuǎn)發(fā)
#tomcat為上面upstream部分的定義
proxy_pass http://tomcat;
#其作用是對(duì)發(fā)送給客戶端的URL進(jìn)行修改
proxy_redirect off;
#默認(rèn)首頁
index index.html index.htm;
#附加字段到請(qǐng)求頭
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#靜態(tài)資源配置
location /static/ {
#訪問/static/目錄中的文件時(shí),
#nginx會(huì)到/usr/share/nginx/html/中查找文件
alias /usr/share/nginx/html/;
}
}
include /etc/nginx/conf.d/*.conf;
}
4. Nginx+tomcat 集群示例
本示例通過使用docker容器搭建Nginx + tomcat集群,來演示使用Nginx實(shí)現(xiàn)負(fù)載均衡的例子。
4.1 下載鏡像
root@ubuntu:/# docker pull nginx
root@ubuntu:/# docker pull tomcat
4.2 在宿主機(jī)中創(chuàng)建需要掛載的目錄
1)在宿主機(jī)上
- 創(chuàng)建用于存放nginx配置文件,及日志的目錄,
- tomcat的部署目錄,及日志目錄。
這些目錄在稍后創(chuàng)建容器時(shí)會(huì)被掛載到容器中,這種方式可以很方便的通過修改宿主機(jī)中文件來改變?nèi)萜髦袑?duì)應(yīng)文件的目的。
root@ubuntu:/# mkdir -p /opt/nginx/conf/ /opt/nginx/www /opt/nginx/logs
root@ubuntu:/# mkdir -p /opt/tomcat/webapps/ROOT /opt/tomcat/conf /opt/tomcat/logs
4.3 常見測(cè)試用的index.html
在宿主機(jī)/opt/tomcat/webapps/ROOT目錄下創(chuàng)建一個(gè)用于測(cè)試的html文件。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Nginx+tomcat集群</title>
</head>
<body>
<h1>Nginx+tomcat集群部署示例</h1>
</body>
<html>
4.4 創(chuàng)建Nginx配置文件
在/opt/nginx/conf目錄下創(chuàng)建nginx.conf配置文件, 具體內(nèi)容請(qǐng)見shang“3. nginx配置文件示例”部分
4.5 啟動(dòng)3個(gè)tomcat容器準(zhǔn)備集群
root@ubuntu:/# docker run -d --name tomcat1 -v /opt/tomcat/webapps:/usr/local/tomcat/webapps tomcat
root@ubuntu:/# docker run -d --name tomcat2 -v /opt/tomcat/webapps:/usr/local/tomcat/webapps tomcat
root@ubuntu:/# docker run -d --name tomcat3 -v /opt/tomcat/webapps:/usr/local/tomcat/webapps, tomcat
注意:必須將容器的掛載目錄設(shè)置為:/usr/local/tomcat/webapps,因?yàn)樵趖omcat鏡像中將目錄設(shè)置為工作目錄,可以通過:docker inspect tomcat 查看容器的詳細(xì)信息進(jìn)行驗(yàn)證。
獲取三個(gè)tomcat容器的ip地址:
root@ubuntu:/# docker inspect tomcat1 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
root@ubuntu:/# docker inspect tomcat2 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
root@ubuntu:/# docker inspect tomcat3 | grep Address
"LinkLocalIPv6Address": "",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"GlobalIPv6Address": "",
"IPAddress": "172.17.0.4",
"MacAddress": "02:42:ac:11:00:04",
"IPAddress": "172.17.0.4",
"GlobalIPv6Address": "",
"MacAddress": "02:42:ac:11:00:04",
tomcat1, tomcat2, tomcat3 的ip地址分別為 : 172.17.0.2, 172.17.0.3,172.17.0.4
4.6 根據(jù)tomcat容器實(shí)際IP修改Nginx配置文件
4.7 啟動(dòng)Nginx容器
docker run -d -p 80:80 --name nginx -v /opt/nginx/www:/usr/share/nginx/html -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/logs:/var/log/nginx nginx
4.8 測(cè)試集群
Nginx容器正常啟動(dòng)后,訪問:http://192.168.62.133/,如果能出現(xiàn)測(cè)試頁面,則說明集群正常。如下圖:
5. Nginx部署靜態(tài)網(wǎng)站
本示例基于Docker容器在Nginx中部署一個(gè)前端網(wǎng)站?,F(xiàn)在項(xiàng)目越來越流行前后端分離的開發(fā)方式,而Nginx是目前流行的高性能的web服務(wù)器,我們可以將前端應(yīng)用部署在Nginx中。
5.1 準(zhǔn)備前端應(yīng)用
準(zhǔn)備一個(gè)用于部署的前端應(yīng)用,為方便演示課件提供一個(gè)用于測(cè)試的前端應(yīng)用(\docker+ngnix+vue\dist)。
5.2 創(chuàng)建構(gòu)建目錄
創(chuàng)建一個(gè)構(gòu)建目錄,如“docker+ngnix+vue”,并將用于發(fā)布的前端應(yīng)用放入構(gòu)建目錄。然后創(chuàng)建Dockerfile文件。
Dockerfile文件如下:
FROM nginx:1.17.9
MAINTAINER lisen "lisensir@qq.com"
#/usr/share/nginx/html
COPY dist/ /usr/share/nginx/html/
本Dockerfile非常簡單:
- 指定基礎(chǔ)鏡像為 nginx1.17.9
- 指定維護(hù)者信息
- 將構(gòu)建目錄下的dist目錄拷入到 容器的/usr/share/nginx/html/目錄下,該目錄是靜態(tài)文件默認(rèn)放置目錄
5.3 構(gòu)建鏡像
將構(gòu)建目錄上傳到linux中,然后在linux中進(jìn)行構(gòu)建目錄,執(zhí)行構(gòu)建即可(docker build -t 鏡像名稱)
root@ubuntu:/home/lisen/docker+ngnix+vue# docker build -t nginx-vue .
5.4 運(yùn)行容器
在鏡像構(gòu)建完成后,通過進(jìn)行運(yùn)行一個(gè)容器即可
root@ubuntu:/# docker run -p 80:80 -d --name nginxvue nginx-vue
容器啟動(dòng)后即可訪問:http://192.168.62.133
文章來源:http://www.zghlxwxcb.cn/news/detail-760034.html
至此部署完成。文章來源地址http://www.zghlxwxcb.cn/news/detail-760034.html
到了這里,關(guān)于Nginx使用場(chǎng)景&&Nginx基礎(chǔ)&&Nginx的負(fù)載均衡策略&&Nginx配置文件&&Nginx+Tomcat集群示例&&Nginx部署靜態(tài)網(wǎng)站&&根據(jù)Tomcat容器實(shí)際IP修改Nginx配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!