一: Nginx簡(jiǎn)介
1.1 nginx概述
Nginx ("engine x") 是一個(gè)高性能的 HTTP 和反向代理服務(wù)器,特點(diǎn)是占有內(nèi)存少靖苇,并發(fā)能力強(qiáng)盗温,事實(shí)上nginx的并發(fā)能力確實(shí)在同類型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好萎津。
1.2 nginx作為web服務(wù)器
Nginx 可以作為靜態(tài)頁(yè)面的 web 服務(wù)器婶恼,同時(shí)還支持 CGI 協(xié)議的動(dòng)態(tài)語(yǔ)言,比如 perl痕钢、php等香到。但是不支持java鱼冀。Java程序只能通過(guò)與tomcat配合完成。Nginx專為性能優(yōu)化而開(kāi)發(fā)悠就,性能是其最重要的考量,實(shí)現(xiàn)上非常注重效率 千绪,能經(jīng)受高負(fù)載的考驗(yàn),有報(bào)告表明能支持高達(dá) 50,000個(gè)并發(fā)連接數(shù)。
參考?https://lnmp.org/nginx.html
1.3 正向代理
如果把局域網(wǎng)外的 Internet 想象成一個(gè)巨大的資源庫(kù)梗脾,則局域網(wǎng)中的客戶端要訪問(wèn)Internet荸型,則需要通過(guò)代理服務(wù)器來(lái)訪問(wèn),這種代理服務(wù)就稱為正向代理炸茧。
1.4 反向代理
其實(shí)客戶端對(duì)代理是無(wú)感知的瑞妇,因?yàn)榭蛻舳瞬恍枰魏闻渲镁涂梢栽L問(wèn),我們只需要將請(qǐng)求發(fā)送到反向代理服務(wù)器梭冠,由反向代理服務(wù)器去選擇目標(biāo)服務(wù)器獲取數(shù)據(jù)后辕狰,在返回給客戶端,此時(shí)反向代理服務(wù)器和目標(biāo)服務(wù)器對(duì)外就是一個(gè)服務(wù)器妈嘹,暴露的是代理服務(wù)器地址柳琢,隱藏了真實(shí)服務(wù)器IP地址。
1.5 負(fù)載均衡
當(dāng)客戶端請(qǐng)求數(shù)據(jù)發(fā)送到服務(wù)器润脸,服務(wù)器處理完請(qǐng)求后將結(jié)果返回給客戶端柬脸。這種單一模式在早期是適用的,當(dāng)訪問(wèn)和數(shù)據(jù)量增加以及業(yè)務(wù)復(fù)雜度增加時(shí)候就不再適用了毙驯,可以通過(guò)提升服務(wù)器配置來(lái)解決倒堕,但是服務(wù)器提升是有限制,頂級(jí)物理配置不能解決問(wèn)題爆价,這樣就只能在縱向解決問(wèn)題垦巴。增加服務(wù)器數(shù)量,把請(qǐng)求分發(fā)到各個(gè)服務(wù)器將負(fù)載發(fā)到不同的服務(wù)器铭段,這就是負(fù)載均衡骤宣。
1.6 動(dòng)靜分離
為了加快網(wǎng)站的解析速度,可以把動(dòng)態(tài)頁(yè)面和靜態(tài)頁(yè)面由不同的服務(wù)器來(lái)解析序愚,加快解析速度憔披。降低原來(lái)單個(gè)服務(wù)器的壓力。
二: Nginx安裝
docker安裝nginx參照:
docker 入門到實(shí)戰(zhàn)(七)docker常用安裝
三: Nginx常用命令和配置文件
3.1 nginx 常用的命令
在容器中
幫助命令
nginx -h
查看版本信息
nginx -v
關(guān)閉命令
nginx -s?stop
重新加載命令 (可做開(kāi)啟命令)
nginx -s reload
設(shè)置開(kāi)機(jī)自動(dòng)啟動(dòng)
chkconfig?nginx?on
3.2 nginx.conf 配置文件
etc/nginx/conf.d/default.conf#默認(rèn)資源配置文件etc/nginx/nginx.conf#默認(rèn)配置/usr/share/nginx/html#初始頁(yè)面? 資源位置/var/log/nginx#日志文件地址
#全局塊usernginx;worker_processesauto;error_log/var/log/nginx/error.log;pid/run/nginx.pid;# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.include/usr/share/nginx/modules/*.conf;# events塊? 影響nginx服務(wù)器與用戶的網(wǎng)絡(luò)連接events{worker_connections1024;#支持連接的最大數(shù)}#http全局塊http{log_formatmain'$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log/var/log/nginx/access.log? main;sendfileon;tcp_nopushon;tcp_nodelayon;keepalive_timeout65;types_hash_max_size2048;include/etc/nginx/mime.types;default_typeapplication/octet-stream;# Load modular configuration files from the /etc/nginx/conf.d directory.# See http://nginx.org/en/docs/ngx_core_module.html#include# for more information.include/etc/nginx/conf.d/*.conf;# server 塊#每個(gè) http 塊可以包括多個(gè) server 塊爸吮,而每個(gè) server 塊就相當(dāng)于一個(gè)虛擬主機(jī)芬膝。#而每個(gè) server 塊也分為全局 server 塊,以及可以同時(shí)包含多個(gè) locaton 塊形娇。server{listen80default_server;listen[::]:80default_server;server_name_;root/usr/share/nginx/html;# Load configuration files for the default server block.include/etc/nginx/default.d/*.conf;location/ {? ? ? ? }error_page404/404.html;location= /40x.html {? ? ? ? }error_page500502503504/50x.html;location= /50x.html {? ? ? ? }? ? }
四: Nginx配置實(shí)例-反向代理
4.1 配置實(shí)例1
創(chuàng)建一個(gè)tomcat容器開(kāi)放 9001端口
在 nginx.conf文件 中添加serer塊 就可以訪問(wèn)tomcat了
server{listen80;server_nameip地址;location/ {proxy_passhttp://ip地址:9001;? ? ? ? }? ? }
4.2 配置實(shí)例2
使用nginx 反向代理锰霜,根據(jù)訪問(wèn)的路徑跳轉(zhuǎn)到不同端口的服務(wù)中
訪問(wèn) ip地址:8080/edu 跳轉(zhuǎn)到ip地址:9001:edu
訪問(wèn) ip地址:8080/vod 跳轉(zhuǎn)到ip地址:9002:vod
在兩個(gè)tomcat容器中的webapps文件夾中分別添加edu文件夾和vod文件夾
修改配置文件 server模塊
server{listen80;server_nameIP地址;location~ /edu/{proxy_passhttp://IP地址:9001;? ? ? ? }location~ /vod/{proxy_passhttp://IP地址:9002;? ? ? ? }? ? }
location指令說(shuō)明:
1、= :用于不含正則表達(dá)式的 uri 前桐早,要求請(qǐng)求字符串與 uri 嚴(yán)格匹配癣缅,如果匹配成功,就停止繼續(xù)向下搜索并立即處理該請(qǐng)求哄酝。
2所灸、~:用于表示 uri 包含正則表達(dá)式,并且區(qū)分大小寫(xiě)炫七。?
3爬立、~*:用于表示 uri 包含正則表達(dá)式,并且不區(qū)分大小寫(xiě)万哪。
4侠驯、^~:用于不含正則表達(dá)式的 uri 前,要求 Nginx 服務(wù)器找到標(biāo)識(shí) uri 和請(qǐng)求字符串匹配度最高的 location 后奕巍,立即使用此 location 處理請(qǐng)求吟策,而不再使用 location 塊中的正則 uri 和請(qǐng)求字符串做匹配。
五: nginx 配置實(shí)例-負(fù)載均衡
5.1 修改nginx.conf文件的server塊
可以參考?nginxa安裝
server{listen80default_server;listen[::]:80default_server;server_name39.108.79.168;root/usr/share/nginx/html;# Load configuration files for the default server block.include/etc/nginx/default.d/*.conf;location/ {proxy_passhttp://pic;? ? ? ? }error_page404/404.html;location= /40x.html {? ? ? ? }error_page500502503504/50x.html;location= /50x.html {? ? ? ? }? ? }upstreampic{server39.108.79.168:9001weight=5;server39.108.79.168:9002weight=5;? ? }
5.2 nginx 分配服務(wù)器策略
第一種 輪詢(默認(rèn))?
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器的止,如果后端服務(wù)器down 掉檩坚,能自動(dòng)剔除。
第二種weight?
weight 代表權(quán)重默認(rèn)為1,權(quán)重越高被分配的客戶端越多
第三種ip_hash?
每個(gè)請(qǐng)求按訪問(wèn)ip 的hash 結(jié)果分配俄精,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器
第四種fair(第三方)?
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求刨肃,響應(yīng)時(shí)間短的優(yōu)先分配。
六: nginx 原理與優(yōu)化參數(shù)配置
master-workers的機(jī)制的好處
首先蜡歹,對(duì)于每個(gè) worker 進(jìn)程來(lái)說(shuō)赂乐,獨(dú)立的進(jìn)程薯鳍,不需要加鎖,所以省掉了鎖帶來(lái)的開(kāi)銷挨措,同時(shí)在編程以及問(wèn)題查找時(shí)挖滤,也會(huì)方便很多。其次浅役,采用獨(dú)立的進(jìn)程斩松,可以讓互相之間不會(huì)影響,一個(gè)進(jìn)程退出后觉既,其它進(jìn)程還在工作惧盹,服務(wù)不會(huì)中斷,master 進(jìn)程則很快啟動(dòng)新的worker 進(jìn)程奋救。當(dāng)然岭参,worker 進(jìn)程的異常退出,肯定是程序有 bug 了尝艘,異常退出演侯,會(huì)導(dǎo)致當(dāng)前worker 上的所有請(qǐng)求失敗,不過(guò)不會(huì)影響到所有請(qǐng)求背亥,所以降低了風(fēng)險(xiǎn)秒际。
需要設(shè)置多少個(gè)worker
Nginx 同redis 類似都采用了 io 多路復(fù)用機(jī)制,每個(gè)worker 都是一個(gè)獨(dú)立的進(jìn)程狡汉,但每個(gè)進(jìn)程里只有一個(gè)主線程娄徊,通過(guò)異步非阻塞的方式來(lái)處理請(qǐng)求, 即使是千上萬(wàn)個(gè)請(qǐng)求也不在話下盾戴。每個(gè) worker 的線程可以把一個(gè) cpu 的性能發(fā)揮到極致寄锐。所以 worker 數(shù)和服務(wù)器的 cpu數(shù)相等是最為適宜的。設(shè)少了會(huì)浪費(fèi)cpu尖啡,設(shè)多了會(huì)造成 cpu 頻繁切換上下文帶來(lái)的損耗橄仆。
設(shè)置worker 數(shù)量
worker_processes 4?
work 綁定cpu(4 work 綁定4cpu)。?
worker_cpu_affinity 0001 0010 0100 1000?
work 綁定cpu (4 work 綁定8cpu 中的4 個(gè)) 衅斩。?
worker_cpu_affinity 0000001 00000010 00000100 00001000
連接數(shù)worker_connection
這個(gè)值是表示每個(gè)worker 進(jìn)程所能建立連接的最大值盆顾,所以,一個(gè) nginx 能建立的最大連接數(shù)畏梆,應(yīng)該是 worker_connections * worker_processes您宪。當(dāng)然奈懒,這里說(shuō)的是最大連接數(shù),對(duì)于HTTP 請(qǐng) 求 本 地 資 源來(lái) 說(shuō) 宪巨, 能 夠 支 持 的 最大 并 發(fā) 數(shù) 量 是 worker_connections * worker_processes磷杏,如果是支持 http1.1 的瀏覽器每次訪問(wèn)要占兩個(gè)連接,所以普通的靜態(tài)訪問(wèn)最大并發(fā)數(shù)是: worker_connections * worker_processes /2揖铜,而如果是HTTP 作 為反向代理來(lái)說(shuō)茴丰,最大并發(fā)數(shù)量應(yīng)該是 worker_connections * worker_processes/4达皿。因?yàn)樽鳛榉聪虼矸?wù)器天吓,每個(gè)并發(fā)會(huì)建立與客戶端的連接和與后端服務(wù)的連接,會(huì)占用兩個(gè)連接峦椰。
七: nginx 搭建集群 主從模式
此處可參考?
https://m.jb51.net/article/17...
https://www.cnblogs.com/jinji...
配置好的鏡像已經(jīng)發(fā)到阿里云
docker pull registry.cn-shanghai.aliyuncs.com/rem/nginx_keeplived:latest
創(chuàng)建兩個(gè)容器
docker?run?-tid --privileged --name nginx_master?--restart=always -p 6001:80 rem/nginx_keeplived /usr/sbin/init
docker?run?-tid --privileged --name nginx_slave?--restart=always -p 6002:80 rem/nginx_keeplived /usr/sbin/init
要是容器里面nginx沒(méi)有啟動(dòng) 可以命令啟動(dòng) 也可以重載啟動(dòng)
systemctl?start?nginx.service
nginx -s reload
設(shè)置開(kāi)機(jī)啟動(dòng)
chkconfig?nginx?on
查看啟動(dòng)
查看keepalived狀態(tài)
修改里面的資源文件后訪問(wèn)
宿主機(jī) 外部測(cè)試
斷開(kāi)master容器后