? ? ? ? 實(shí)習(xí)入職第一天的時(shí)候,在同事的幫助下安裝了N多軟件和工具。然鵝作為一個(gè)初入工作的菜雞翼闹,很多工具之前沒有接觸過枫振,所以后面進(jìn)行項(xiàng)目相關(guān)配置時(shí)都是直接copy的組內(nèi)前輩的配置文件喻圃,但是對這些工具的作用和一些配置文件的意義很迷茫。這些天對這些工具進(jìn)行了一些簡單的學(xué)習(xí)和了解粪滤,下面是整理的一些Nginx相關(guān)的基礎(chǔ)內(nèi)容斧拍。在此做一個(gè)記錄,如有不對的地方請多多指教杖小。
一肆汹、代理介紹
正向代理:舉個(gè)例子,我目前無法直接訪問到Y(jié)outube予权,但是我能訪問一個(gè)代理服務(wù)器,而這個(gè)代理服務(wù)器可以訪問Youtube昂勉,于是我先連上代理服務(wù)器,告訴他我需要獲取Youtube的內(nèi)容,代理服務(wù)器去取回來,然后返回給我。正向代理就是一個(gè)位于客戶端和原始服務(wù)器之間的服務(wù)器扫腺,為了從原始服務(wù)器取得內(nèi)容岗照,客戶端向代理發(fā)送一個(gè)請求并指定目標(biāo)(原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端笆环。
反向代理:再舉個(gè)例子,我們跟移動客服聯(lián)系時(shí)躁劣,只需要撥通了10086?的總機(jī)號碼,電話那頭則會轉(zhuǎn)接客服為我們服務(wù)账忘,但我們并不知道真正提供服務(wù)的人是誰。反向代理隱藏了真實(shí)的服務(wù)端闪萄,當(dāng)我們訪問一個(gè)網(wǎng)站時(shí)奇颠,背后可能有成千上萬臺服務(wù)器為我們服務(wù),但具體是哪一臺我們并不知道烈拒,也不需要知道,你只需要知道反向代理服務(wù)器是誰就好了荆几,之后反向代理服務(wù)器會幫我們把請求轉(zhuǎn)發(fā)到提供真實(shí)計(jì)算的服務(wù)器那里去。
二吨铸、Nginx功能說明
1、靜態(tài)HTTP服務(wù)器
? ?Nginx是一個(gè)HTTP服務(wù)器诞吱,可以將服務(wù)器上的靜態(tài)文件(如HTML舟奠、圖片)通過HTTP協(xié)議展現(xiàn)給客戶端竭缝。
? ?配置示例:
server {?
? ? ? listen80; # 端口號?
? ? ? location / {?
? ? ? ? ? root D:\frontproject\views; # 靜態(tài)文件路徑?
? ? ? }?
? }?
? ?動靜分離是讓動態(tài)網(wǎng)站里的動態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動靜資源做好了拆分以后沼瘫,我們就可以根據(jù)靜態(tài)資源的特點(diǎn)將其做緩存操作抬纸。
? ?配置示例:
server {
? ? ? ? listen? ? ? 80;
? ? ? ? server_name? localhost;
? ? ? ? location / {
? ? ? ? ? ? root? D:\frontproject;
? ? ? ? ? ? index? index.html;
? ? ? ? }
? ? ? # 所有靜態(tài)請求都由nginx處理?
? ? ? location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
? ? ? ? ? root? ? D:\frontproject;
? ? ? }
? ? ? # 所有動態(tài)請求都轉(zhuǎn)發(fā)給tomcat處理?
? ? ? location ~ \.do$ {
? ? ? ? ? proxy_pass? http://localhost:8080;
? ? ? }
? ? ? }
2、反向代理服務(wù)器
客戶端請求Nginx耿戚,Nginx請求應(yīng)用服務(wù)器湿故,然后將結(jié)果返回給客戶端,此時(shí)Nginx就是反向代理服務(wù)器膜蛔。
? ?配置示例:??
server{
? ? ? listen 80;?
? ? ? location / {?
? ? ? ? ? proxy_pass http://127.0.0.1:8080; # 應(yīng)用服務(wù)器HTTP地址?
? ? ? }?
? }?
3坛猪、負(fù)載均衡
當(dāng)網(wǎng)站訪問量非常大,將同一個(gè)應(yīng)用部署在多臺服務(wù)器上飞几,將大量用戶的請求分配給多臺機(jī)器處理砚哆。同時(shí)帶來的好處是,其中一臺服務(wù)器萬一掛了屑墨,只要還有其他服務(wù)器正常運(yùn)行躁锁,就不會影響用戶使用。
? ?Nginx可以通過反向代理來實(shí)現(xiàn)負(fù)載均衡卵史,并能使用3種自帶策略及2種第三方策略战转。
? ?(1)RR(默認(rèn),每個(gè)請求按時(shí)間順序逐一分配到不同的后端服務(wù)器)??
upstream mypro {
? ? ? server 192.168.20.1:8080; # 應(yīng)用服務(wù)器1?
? ? ? server 192.168.20.2:8080; # 應(yīng)用服務(wù)器2?
? ? }?
? ? server {?
? ? ? listen 80;?
? ? ? location / {?
? ? ? ? ? proxy_pass http://mypro ;?
? ? ? }?
? ? }
(2)權(quán)重(指定輪詢幾率以躯,weight和訪問比率成正比槐秧,用于后端服務(wù)器性能不均的情況)?
upstream mypro {?
? ? ? server 192.168.20.1:8080 weight=3; # 該服務(wù)器處理3/4請求?
? ? ? server 192.168.20.2:8080; # weight默認(rèn)為1,該服務(wù)器處理1/4請求?
? ? }?
? ? server {?
? ? ? ... ...
? ? }?
? ?(3)ip-hash(以上配置會將請求輪詢分配到應(yīng)用服務(wù)器忧设,也就是一個(gè)客戶端的多次請求刁标,有可能會由多臺不同的服務(wù)器處理(若存在登錄session時(shí)則需要重復(fù)登錄)。ip-hash根據(jù)客戶端ip地址的hash值將請求分配給固定的某一個(gè)服務(wù)器處理)
upstream mypro {?
? ? ? ? ip_hash; # 根據(jù)客戶端IP地址Hash值將請求分配給固定的一個(gè)服務(wù)器處理?
? ? ? ? server 192.168.20.1:8080;?
? ? ? ? server 192.168.20.2:8080;?
? ? }?
? ? server {?
? ? ? ? ... ...
? ? }?
? ?(4)fair(第三方 按后端服務(wù)器的響應(yīng)時(shí)間來分配請求址晕,響應(yīng)時(shí)間短的優(yōu)先分配)
upstream mypro {
? ? ? ? fair;
? ? ? ? server localhost:8080;
? ? ? ? server localhost:8081;
? ? }
? ?(5)url_hash(第三方 按訪問url的hash結(jié)果來分配請求膀懈,使每個(gè)url定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效谨垃。 在upstream中加入hash語句启搂,server語句中不能寫入weight等其他的參數(shù),hash_method是使用的hash算法)??
upstream mypro {
? ? ? ? hash $request_uri;
? ? ? ? hash_method crc32;
? ? ? ? server localhost:8080;
? ? ? ? server localhost:8081;
? ? }
4刘陶、虛擬主機(jī)
有的網(wǎng)站訪問量大胳赌,需要負(fù)載均衡。有的網(wǎng)站匙隔,由于訪問量太小疑苫,需要節(jié)省成本,將多個(gè)網(wǎng)站部署在同一臺服務(wù)器上。
例如將www.a.com和www.b.com兩個(gè)網(wǎng)站部署在同一臺服務(wù)器上纳决,兩個(gè)域名解析到同一個(gè)IP地址乡小,但是用戶通過兩個(gè)域名卻可以打開兩個(gè)完全不同的網(wǎng)站,互相不影響胜榔,就像訪問兩個(gè)服務(wù)器一樣夭织,所以叫兩個(gè)虛擬主機(jī)吠撮。
server {?
? ? ? ? listen 80 default_server;?
? ? ? ? server_name _;?
? ? ? ? return 444; # 過濾其他域名的請求泥兰,返回444狀態(tài)碼?
? ? }?
? ? server {?
? ? ? ? listen 80;?
? ? ? ? server_name www.a.com; # www.a.com域名?
? ? ? ? location / {?
? ? ? ? ? proxy_pass http://localhost:8080; # 對應(yīng)端口號8080?
? ? ? }?
? ? }?
? ? server {?
? ? ? listen 80;?
? ? ? server_name www.b.com; # www.b.com域名?
? ? ? location / {?
? ? ? ? ? proxy_pass http://localhost:8081; # 對應(yīng)端口號8081?
? ? ? }?
? }
在服務(wù)器8080和8081分別開了一個(gè)應(yīng)用鞋诗,客戶端通過不同的域名訪問,根據(jù)server_name可以反向代理到對應(yīng)的應(yīng)用服務(wù)器全庸。
虛擬主機(jī)的原理是通過HTTP請求頭中的Host是否匹配server_name來實(shí)現(xiàn)的壶笼,另外雁刷,server_name配置還可以過濾有人惡意將某些域名指向你的主機(jī)服務(wù)器安券。
三侯勉、配置說明
? Nginx的基本配置在nginx.conf文件中铝阐。(結(jié)合組內(nèi)配置文件,發(fā)現(xiàn)分別建立了sites.conf和upstream.conf文件遍蟋,再include到nginx.conf中來動態(tài)解耦地完成配置)
events{? ? ? ? ? ? ? ? ? ? ? ? ? # nginx工作模式配置
? ? ? ? worker_connections 1024;? #指定最大可以同時(shí)接收的連接數(shù)量和worker processes共同決定
? ? ? ? multi_accept on;? ? ? ? ? # nginx在收到一個(gè)新連接通知后盡可能多的接受更多的連接
? ? ? ? use epoll;? ? ? ? ? ? ? ? # 配置指定了線程輪詢的方法
? ? }
? ? http {? ? ? ? ? ? ? ? ? ? ? ? # http設(shè)置
? ? ? ? ....
? ? server {? ? ? ? ? ? ? ? ? ? #服務(wù)器訪問信息的配置虚青,一個(gè)http中可以配置多個(gè)server
? ? ? ? listen? ? ? 80;? ? ? ? #監(jiān)聽端口
? ? ? ? server_name xxx.net;? ? #指定ip地址或者代理域名
? ? ? ? root? ? ? ? ? ? ? ? ? ? #整個(gè)server虛擬主機(jī)內(nèi)的根目錄螺男,所有當(dāng)前主機(jī)中web項(xiàng)目的根目錄
? ? ? ? index index.html? ? ? ? #用戶訪問web網(wǎng)站時(shí)的全局首頁
? ? ? ? charset? ? ? ? ? ? ? ? #用于設(shè)置www/路徑中配置的網(wǎng)頁的默認(rèn)編碼格式
? ? ? ? access_log? ? ? ? ? ? ? #用于指定該虛擬主機(jī)服務(wù)器中的訪問記錄日志存放路徑
? ? ? ? error_log? ? ? ? ? ? ? #用于指定該虛擬主機(jī)服務(wù)器中訪問錯(cuò)誤日志的存放路徑
? ? ? ? location / {? ? ? ? ? ? #訪問路由的配置
? ? ? ? ? ? proxy_pass http://namexx;? ? #代理轉(zhuǎn)發(fā)域名
? ? ? ? ? ? root? ? ? ? ? ? ? ? #用于指定訪問根目錄時(shí)奢人,訪問虛擬主機(jī)的web目錄
? ? ? ? ? ? index? ? ? ? ? ? ? #在不指定訪問具體資源時(shí)淆院,默認(rèn)展示的資源文件列表? ? ? ? ?
? ? ? }
? ? upstream namexx {? ? ? ? ? # 代理域名與ip的映射配置 和 負(fù)載均衡配置
? ? ? ? ? ? server 192.168.20.1:8080; # 應(yīng)用服務(wù)器1?
? ? ? ? ? ? server 192.168.20.2:8080; # 應(yīng)用服務(wù)器2
? ? }
? ? }
四土辩、Nginx常用命令及l(fā)ocation語法
?1、nginx常用命令
? ? ? nginx?-s?quit? ? ? ? 停止ngix??
? ? ? nginx?-s?reload?????重新載入nginx(當(dāng)配置信息發(fā)生修改時(shí))??
? ? ? nginx?-s?reopen?????打開日志文件??
? ? ? nginx?-v? ? ? ? ? ? 查看版本??
? ? ? nginx?-t? ? ? ? ? ? 查看nginx的配置文件的目錄??
? ? ? nginx?-h? ? ? ? ? ? 查看幫助信息?
2搂妻、基本語法:location [=|~|~*|^~] /uri/ { … }
? ? ? = 嚴(yán)格匹配欲主。如果這個(gè)查詢匹配逝嚎,那么將停止搜索并立即處理此請求。
? ? ? ~ :為區(qū)分大小寫匹配(可用正則表達(dá)式)
? ? ? !~:為區(qū)分大小寫不匹配
? ? ? ~*:為不區(qū)分大小寫匹配(可用正則表達(dá)式)
? ? ? !~*:為不區(qū)分大小寫不匹配
? ? ? ^~:如果把這個(gè)前綴用于一個(gè)常規(guī)字符串,告訴nginx?如果路徑匹配那么不測試正則表達(dá)式引几。
? ? ? ^: 以什么開頭的匹配
? ? ? $: 以什么結(jié)尾的匹配
? ?示例:
? ? ? (1)location = / { # 只匹配 / 查詢挽铁。}
? ? ? (2)location / {
? ? ? ? ? ? ? ? ? # 匹配任何查詢叽掘,因?yàn)樗姓埱蠖家?/ 開頭。但是正則表達(dá)式規(guī)則和長的塊規(guī)則將被優(yōu)先和查詢匹配盖腕。
? ? ? ? }
? ? ? (3)location ^~ /images/ {
? ? ? ? ? ? ? ? ? # 匹配任何以 /images/ 開頭的查詢并且停止搜索。任何正則表達(dá)式將不會被測試溃列。
? ? ? ? }
? ? ? (4)location ~*.(gif|jpg|jpeg)$ {
? ? ? ? ? ? ? ? # 匹配任何以 gif听隐、jpg 或 jpeg 結(jié)尾的請求。
? ? ? ? }