欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報邀請碼778899分享:運維 Nginx

柚子快報邀請碼778899分享:運維 Nginx

http://yzkb.51969.com/

Nginx

Nginx 官網(wǎng)

1. Nginx 簡介

1.1 Nginx 介紹

作者是一個俄國人,2000年開始用c語言寫的。 免費開源,高性能

1.1.1 什么是 Nginx

Nginx采用了 epoll 模型(非阻塞 IO 模型),是一個 輕量級/高性能的反向代理Web服務器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 協(xié)議。它實現(xiàn)非常高效的反向代理、負載平衡,他可以處理2-3萬并發(fā)連接數(shù),官方監(jiān)測能支持5萬并發(fā),現(xiàn)在中國使用nginx網(wǎng)站用戶有很多,例如:新浪、網(wǎng)易、 騰訊等。

1.1.2 代理服務器

代理服務器(Proxy Server),常用來做轉(zhuǎn)發(fā),或者防火墻。為客戶端打工的是正向代理,為服務端打工的是反向代理。

常見服務器區(qū)別

NginxApache Http ServerTomcat萬級別并發(fā)存在c10K問題并發(fā)量100左右web服務器web服務器應用服務器靜態(tài)資源(通過其他模塊來支持動態(tài)資源)靜態(tài)資源(通過其他模塊來支持動態(tài)資源)可以動態(tài)生成HTML頁面支持多種協(xié)議支持多種協(xié)議

Nginx 是一個輕量級的http服務器(http server)。當然除了http,nginx也支持smtp, pop3, imap協(xié)議,還通過模塊支持tcp。

和apache http server project區(qū)別 都是http server, 用來處理請求的,nginx 可以支持其它協(xié)議,解決并發(fā)問題,支持更高的并發(fā)量 和tomcat區(qū)別 tomcat 稱為application server(應用服務器),nginx是http 服務器,http服務器一般用來訪問靜態(tài)資源的而應用服務器則可以動態(tài)生成資源內(nèi)容。

知識擴展

web服務 服務端通過網(wǎng)絡可以提供給客戶端所請求的資源 c10K問題 1W的并發(fā)量問題

1.1.3 Nginx 優(yōu)點

跨平臺、配置簡單。非阻塞、高并發(fā)連接:處理 2-3 萬并發(fā)連接數(shù),官方監(jiān)測能支持 5 萬并發(fā)。內(nèi)存消耗?。洪_啟 10 個 Nginx 才占 150M 內(nèi)存。成本低廉,且開源。穩(wěn)定性高,宕機的概率非常小。內(nèi)置的健康檢查功能:如果有一個服務器宕機,會做一個健康檢查,再發(fā)送的請求就不會發(fā)送到宕機的服務器了。重新將請求提交到其他的節(jié)點上

保護了真實的web服務器,保證了web服務器的資源安全,對反向代理服務器的攻擊并不會使得網(wǎng)頁信息遭到破壞,所有的靜態(tài)網(wǎng)頁或者CGI程序,都保存在內(nèi)部的Web服務器上。節(jié)約了有限的IP地址資源, 企業(yè)內(nèi)所有的網(wǎng)站共享一個在internet中注冊的IP地址,這些服務器分配私有地址,采用虛擬主機的方式對外提供服務。減少WEB服務器壓力,提高響應速度請求的統(tǒng)一控制,包括設置權限、過濾規(guī)則等;區(qū)分動態(tài)和靜態(tài)可緩存內(nèi)容;實現(xiàn)負載均衡,內(nèi)部可以采用多臺服務器來組成服務器集群,外部還是可以采用一個地址訪問;解決Ajax跨域問題;作為真實服務器的緩沖,解決瞬間負載量大的問題;模塊化、事件驅(qū)動、異步、非阻塞、多進程單線程。

1.1.6 應用場景

http服務器。Nginx是一個http服務可以獨立提供http服務。可以做網(wǎng)頁靜態(tài)服務器。虛擬主機??梢詫崿F(xiàn)在一臺服務器虛擬出多個網(wǎng)站,例如個人網(wǎng)站使用的虛擬機。反向代理,負載均衡。當網(wǎng)站的訪問量達到一定程度后,單臺服務器不能滿足用戶的請求時,需要用多臺服務器集群可以使用nginx做反向代理。并且多臺服務器可以平均分擔負載,不會應為某臺服務器負載高宕機而某臺服務器閑置的情況。nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口網(wǎng)關,對每個接口服務進行攔截。

1.1.5 其它功能

熱部署: 修改nginx.conf配置文件后, 重新生成worker進程達到熱部署高并發(fā): nginx采用了Linux的epoll模型,epoll模型基于時間驅(qū)動機制nginx掛了怎么辦: Keepalived + Nginx實現(xiàn)高可用

1.2 請求處理

1.2.1 工作流程

用戶通過域名發(fā)出訪問Web服務器的請求,該域名被DNS服務器解析為反向代理服務器的IP地址;反向代理服務器接受用戶的請求;反向代理服務器在本地緩存中查找請求的內(nèi)容,找到后直接把內(nèi)容發(fā)送給用戶;如果本地緩存里沒有用戶所請求的信息內(nèi)容,反向代理服務器會代替用戶向源服務器請求同樣的信息內(nèi)容,并把信息內(nèi)容發(fā)給用戶,如果信息內(nèi)容是緩存的還會把它保存到緩存中。

1.2.2 請求處理

server { # 第一個Server區(qū)塊開始,表示一個獨立的虛擬主機站點

listen 80; # 提供服務的端口,默認80

server_name localhost; # 提供服務的域名主機名

location / { # 第一個location區(qū)塊開始

root html; # 站點的根目錄,相當于Nginx的安裝目錄

index index.html index.html; # 默認的首頁文件,多個用空格分開

} # 第一個location區(qū)塊結果

}

1> 首先,Nginx 在啟動時,會解析配置文件,得到需要監(jiān)聽的端口與 IP 地址,然后在 Nginx 的 Master 進程里面先初始化好這個監(jiān)控的Socket(創(chuàng)建 Socket,設置 addr、reuse 等選項,綁定到指定的 ip 地址端口,再 listen 監(jiān)聽)。

2> 然后,再 fork(一個現(xiàn)有進程可以調(diào)用 fork 函數(shù)創(chuàng)建一個新進程。由 fork 創(chuàng)建的新進程被稱為子進程 )出多個子進程出來。

3> 之后,子進程會競爭 accept 新的連接。此時,客戶端就可以向 nginx 發(fā)起連接了。當客戶端與nginx進行三次握手,與 nginx 建立好一個連接后。此時,某一個子進程會 accept 成功,得到這個建立好的連接的 Socket ,然后創(chuàng)建 nginx 對連接的封裝,即 ngx_connection_t 結構體。

4> 接著,設置讀寫事件處理函數(shù),并添加讀寫事件來與客戶端進行數(shù)據(jù)的交換。

5> 最后,Nginx 或客戶端來主動關掉連接,到此,一個連接就壽終正寢了。

1.2.3 工作模型

1.2.3.1 多進程

Nginx在啟動時會以daemon形式在后臺運行,采用多進程+異步非阻塞IO事件模型來處理各種連接請求。

多進程模型包括一個master進程,多個worker進程,一般worker進程個數(shù)是根據(jù)服務器CPU核數(shù)來決定的。

1.2.3.4.1 master 進程

master進程負責讀取并驗證配置文件nginx.conf, 負責管理Nginx本身和其他worker進程。

1.2.3.4.2 Work 進程

每一個Worker進程都維護一個線程(避免線程切換),處理連接和請求;注意Worker進程的個數(shù)由配置文件決定,一般和CPU個數(shù)相關(有利于進程切換),配置幾個就有幾個Worker進程。

Nginx真正處理請求業(yè)務的是Worker之下的線程。worker進程中有一個ngx_worker_process_cycle()函數(shù),執(zhí)行無限循環(huán),不斷處理收到的來自客戶端的請求,并進行處理,直到整個Nginx服務被停止。

ps -l ax | awk 'BEGIN {} NR==1 {print $0} /nginx/ {print $0}' # 查看nginx master work 進程

1.2.3.2 事件模型

Nginx是如何實現(xiàn)高并發(fā)的,正式源于他的事件驅(qū)動模型,異步,非阻塞。

每進來一個 request ,會有一個 worker 進程去處理。但不是全程的處理,處理到可能發(fā)生阻塞的地方,比如向上游(后端)服務器轉(zhuǎn)發(fā) request ,并等待請求返回。他會在發(fā)送完請求后,注冊一個事件:如果 upstream 返回了,得到通知會繼續(xù)進行該請求。否則再以這樣的方式處理其它請求。即一旦上游服務器返回了,就會觸發(fā)這個事件,worker 才會來接手,這個 request 才會接著往下走。

異步,非阻塞,使用 epoll ,和大量細節(jié)處的優(yōu)化。也正是 Nginx 之所以然的技術基石。

2. Nginx 模塊

2.1 模塊劃分

從結構上劃分

核心模塊:HTTP模塊、EVENT模塊和MAIL模塊

基礎模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊,

第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊。

從功能上劃分

Core(核心模塊):構建nginx基礎服務、管理其他模塊。

Handlers(處理器模塊):此類模塊直接處理請求,并進行輸出內(nèi)容和修改headers信息等操作。

Filters (過濾器模塊):此類模塊主要對其他處理器模塊輸出的內(nèi)容進行修改操作,最后由Nginx輸出。

Proxies (代理類模塊):此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與后端一些服務比如FastCGI等進行交互,實現(xiàn)服務代理和負載均衡等功能。

模塊之間的關系

Nginx的核心模塊主要負責建立nginx服務模型、管理網(wǎng)絡層和應用層協(xié)議、以及啟動針對特定應用的一系列候選模塊。其他模塊負責分配給web服務器的實際工作

1) 當服務器啟動,每個handlers(處理模塊)都有機會映射到配置文件中定義的特定位置(location);如果有多個handlers(處理模塊)映射到特定位置時,只有一個會“贏”(說明配置文件有沖突項,應該避免發(fā)生) 處理模塊以(OK ERROR 放棄請求使用默認模塊來處理)三種形式返回。

2) 如果handlers(處理模塊)把請求反向代理到后端的服務器,就變成另外一類的模塊:load-balancers(負載均衡模塊)。負載均衡模塊的配置中有一組后端服務器,當一個HTTP請求過來時,它決定哪臺服務器應當獲得這個請求。

3) 如果handlers(處理模塊)沒有產(chǎn)生錯誤,filters(過濾模塊)將被調(diào)用。多個filters(過濾模塊)能映射到每個位置,所以(比如)每個請求都可以被壓縮成塊。它們的執(zhí)行順序在編譯時決定。 filters(過濾模塊)是經(jīng)典的“接力鏈表(CHAIN OF RESPONSIBILITY)”模型

通常一個location中的指令會涉及一個handler模塊和多個filter模塊(當然,多個location可以復用同一個模塊)。handler模塊負責處理請求,完成響應內(nèi)容的生成,而filter模塊對響應內(nèi)容進行處理。

2.1.1 http 模塊

2.1.2 stream 模塊

2.2 多線程處理

1) master進程一開始會根據(jù)配置建立listen的網(wǎng)絡socket fd, 然后fork出多個worker進程,worker和master具有相同的配置,監(jiān)聽相同的端口。由于都是監(jiān)聽相同的端口,所以當一個請求進來時,所有的worker會感知到,就是所謂的"驚群現(xiàn)象", 為了保證只會有一個進程注冊到listenfd的讀事件, nginx采用"accept_mutex"類似的互斥鎖,只有獲取這個鎖的才可以去注冊讀事件。

2) 進程間是獨立的,所以worker也是相互不影響的,且一個request請求一個worker就可以完成。

為了避免驚群,和單個worker一直競爭成功的問題,nginx采用是否打開accept_mutex選項的值。 ngx_accept_disabled標識控制一個worker進程是否需要去競爭獲取accept_mutex選項,進而獲取accept事件。 ngx_accept_disabled值:nginx單進程的所有連接總數(shù)的八分之一,減去剩下的空閑連接數(shù)量,得到的這個ngx_accept_disabled。 當空閑連接越少時,ngx_accept_disable越大,于是讓出的機會就越多,這樣其它進程獲取鎖的機會也就越大。

3. 安裝

3.1 window 安裝

# window 安裝

1. 下載安裝包 解壓

2. 直接nginx.exe 啟動就行

3. 可以配置服務為開機自動重啟 百度一下

直接執(zhí)行:

ngnix.exe 改啟動會占用cli界面

start nginx -c conf/nginx.conf 根據(jù)配置文件進行啟動

nginx.exe -t -c conf/default.conf

nginx.exe -s stop

nginx.exe -s quit

stop是快速停止nginx,可能并不保存相關信息;quit是完整有序的停止nginx,并保存相關信息。

taskkill /f /im nginx.exe > null 殺死nginx進程

nginx.exe -s reload 修改配置文件后 重新啟動ngnix

nginx -v

window 下Nginx開啟自動啟動

3.2 Linux 安裝

Linux 下的安裝目錄

[root@localhost ~]# tree /usr/local/nginx

/usr/local/nginx

├── client_body_temp

├── conf # Nginx所有配置文件的目錄

│ ├── fastcgi.conf # fastcgi相關參數(shù)的配置文件

│ ├── fastcgi.conf.default # fastcgi.conf的原始備份文件

│ ├── fastcgi_params # fastcgi的參數(shù)文件

│ ├── fastcgi_params.default

│ ├── koi-utf

│ ├── koi-win

│ ├── mime.types # 媒體類型

│ ├── mime.types.default

│ ├── nginx.conf # Nginx主配置文件

│ ├── nginx.conf.default

│ ├── scgi_params # scgi相關參數(shù)文件

│ ├── scgi_params.default

│ ├── uwsgi_params # uwsgi相關參數(shù)文件

│ ├── uwsgi_params.default

│ └── win-utf

├── fastcgi_temp # fastcgi臨時數(shù)據(jù)目錄

├── html # Nginx默認站點目錄

│ ├── 50x.html # 錯誤頁面優(yōu)雅替代顯示文件,例如當出現(xiàn)502錯誤時會調(diào)用此頁面

│ └── index.html # 默認的首頁文件

├── logs # Nginx日志目錄

│ ├── access.log # 訪問日志文件

│ ├── error.log # 錯誤日志文件

│ └── nginx.pid # pid文件,Nginx進程啟動后,會把所有進程的ID號寫到此文件

├── proxy_temp # 臨時目錄

├── sbin # Nginx命令目錄

│ └── nginx # Nginx的啟動命令

├── scgi_temp # 臨時目錄

└── uwsgi_temp # 臨時目錄

3.2.1 Linux中tar.gz解壓安裝

先進入自己想要安裝的目錄,一般是把壓縮包下載到/usr/local目錄下。cd /usr/local

第一步:下載nginx壓縮包 wget -c https://nginx.org/download/nginx-1.10.1.tar.gz 或 官網(wǎng) https://nginx.org/download/ 下載自己想要的版本 例如:“nginx-1.10.1.tar.gz” 。 第二步:配置nginx安裝所需的環(huán)境 # 安裝gcc

yum install gcc-c++

# 安裝PCRE pcre-devel

yum install -y pcre pcre-devel

# 安裝zlib

yum install -y zlib zlib-devel

# Open SSL

yum install -y openssl openssl-devel

第三步:將壓縮包進行解壓 解壓指令:tar -zxvf nginx-1.10.1.tar.gz

# .tar.gz 格式解壓命令為 tar -zxvpf xx.tar.gz

# .tar.bz2 格式解壓命令為 tar -jxvpf xx.tar.bz2

第四步:安裝編譯 cd nginx-1.10.1

./configure # 支持ssl 執(zhí)行 ./configure --with-http_ssl_module

make

make install

第五步:安裝nginx # 執(zhí)行命令:make install。這時候返回上一級目錄,就會發(fā)現(xiàn)多了nginx目錄,接下來,啟動nginx。

# 進入/usr/local/nginx/sbin目錄,輸入./nginx即可啟動nginx。

# 關閉nginx:

./nginx -s quit 或者 ./nginx -s stop

# 重啟nginx:

./nginx -s reload

# 查看nginx進程:

ps aux|grep nginx

# 設置nginx開機啟動,只需在rc.local增加啟動代碼即可:

vim /etc/rc.local 然后在底部增加 /usr/local/nginx/sbin/nginx。

# 進入/usr/local/nginx/conf目錄可修改nginx的配置文件 -> vim nginx.conf

3.3 docker安裝

docker run -d --name nginx \

-v /home/xx/note:/usr/share/nginx/html/note \

-v /home/xx/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \

-v /home/xx/nginx/conf.d:/etc/nginx/conf.d \

-v /home/xx/nginx/logs:/var/log/nginx/ \

-e LANG=C.UTF-8 \

-e LC_ALL=C.UTF-8 \

-p80:80 --privileged nginx

掛載的目錄文件需要提前創(chuàng)建好

1. 掛載項目地址

2. 掛載配置文件

3. 掛載子配置文件

4. 掛載日志

5. 修改編碼

docker stop nginx # 容器停止

docker rm -f nginx # 刪除容器

docker restart nginx # 重啟容器

# docker 容器中文件位置

日志位置:/var/log/nginx/

配置文件位置:/etc/nginx/

項目位置:/usr/share/nginx/html

nginx.conf

user nginx;

worker_processes 1;

error_log /var/log/nginx/error.log warn;

pid /var/run/nginx.pid;

events {

worker_connections 1024;

}

http {

include /etc/nginx/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 /var/log/nginx/access.log main;

sendfile on;

keepalive_timeout 65;

include /etc/nginx/conf.d/*.conf;

}

conf.d

server {

listen 80;

server_name localhost;

location / {

root /usr/share/nginx/html;

index index.html index.htm;

}

location /api{

proxy_pass http://192.168.1.1:9999/api;

}

}

4. 命令

# window 環(huán)境

nginx.exe # 啟動

nginx.exe -s reload # 重新載入配置文件

nginx.exe -s stop # 停止

# Linux 環(huán)境

nginx -h # 打開幫助信息

nginx -q # 檢測配置文件期間屏蔽非錯誤信息

nginx -v # 查看版本

nginx -V # 查看版本 和 配置選項信息

nginx -t # 查看配置文件的路徑,配置文件是否有錯誤,然后退出

nginx -s reload # 重新載入配置文件

nginx -s stop # 停止

nginx -s quit # 優(yōu)雅的停止

nginx -s reopen # 重啟

nginx -c filename # 設置配置文件(默認是:/etc/nginx/nginx.conf)

ps -ef|grep nginx # 查看nginx 進程號

killall nginx # 殺死所有的 nginx

# 查看nginx master work 進程

ps -l ax | awk 'BEGIN {} NR==1 {print $0} /nginx/ {print $0}'

5. 配置

官網(wǎng)配置

5.1 配置規(guī)則簡介

1)用 # 注解 2)每行結尾必須加上 ;號 3)如果配置項中包括nginx的語法符號,例如空格,則必須使用單引號或者雙引號括起來 4)單位簡寫:K或k(kiloByte, kb), M或m(MegaByte, MB), ms(毫秒), s(秒), m(分鐘), h(小時), d(天),w(周, 包含7天), M(月,包含30天), y(年,包含365天)

5.2 配置文件

5.2.1 完善的配置文件

# 運行用戶 定義Nginx運行的用戶和用戶組

user www-data;

# 啟動進程,通常設置成和cpu的數(shù)量相等

worker_processes 1;

# 全局錯誤日志及PID文件

error_log /var/log/nginx/error.log;

pid /var/run/nginx.pid;

# 一個nginx進程打開的最多文件描述符數(shù)目,理論值應該是最多打開文件數(shù)(系統(tǒng)的值ulimit -n)與nginx進程數(shù)相除,但是nginx分配請求并不均勻,所以建議與ulimit -n的值保持一致。

worker_rlimit_nofile 65535;

# 工作模式及連接數(shù)上限

events {

# epoll是多路復用IO(I/O Multiplexing)中的一種方式,但是僅用于linux2.6以上內(nèi)核,可以大大提高nginx的性能

use epoll; # [ kqueue | rtsig | epoll | /dev/poll | select | poll ]

# 單個后臺worker process進程的最大并發(fā)鏈接數(shù)

worker_connections 1024;

# multi_accept on;

}

# 設定http服務器,利用它的反向代理功能提供負載均衡支持

http {

# 設定mime類型,類型由mime.type文件定義

include /etc/nginx/mime.types;

default_type application/octet-stream;

#charset utf-8; #默認編碼

server_names_hash_bucket_size 128; #服務器名字的hash表大小

# 設定日志格式

access_log /var/log/nginx/access.log;

# sendfile 指令指定 nginx 是否調(diào)用 sendfile 函數(shù)(zero copy 方式)來輸出文件,對于普通應用,

# 必須設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設置為 off,以平衡磁盤與網(wǎng)絡I/O處理速度,降低系統(tǒng)的uptime.

sendfile on;

#tcp_nopush on;

# 連接超時時間

# keepalive_timeout 0;

keepalive_timeout 65;

tcp_nodelay on;

# 開啟gzip壓縮

gzip on;

gzip_disable "MSIE [1-6]\.(?!.*SV1)";

# 設定請求緩沖 上傳文件大小限制

client_header_buffer_size 1k;

large_client_header_buffers 4 4k;

# 引入其它配置文件

# include /etc/nginx/conf.d/*.conf;

# include /etc/nginx/sites-enabled/*;

# 設定負載均衡的服務器列表

upstream mysvr {

#weigth參數(shù)表示權值,權值越高被分配到的幾率越大

#本機上的Squid開啟3128端口

server 192.168.8.1:3128 weight=5;

server 192.168.8.2:80 weight=1;

server 192.168.8.3:80 weight=6;

}

server {

# 偵聽80端口

listen 80;

#定義使用 www.xx.com訪問

server_name www.xx.com;

#設定本虛擬主機的訪問日志

access_log logs/www.xx.com.access.log main;

#默認請求

location / {

#定義服務器的默認網(wǎng)站根目錄位置

root /root;

#定義首頁索引文件的名稱

index index.php index.html index.htm;

fastcgi_pass www.xx.com;

fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;

include /etc/nginx/fastcgi_params;

}

# 定義錯誤提示頁面

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root /root;

}

#靜態(tài)文件,nginx自己處理

location ~ ^/(p_w_picpaths|javascript|js|css|flash|media|static)/ {

root /var/www/virtual/htdocs;

#過期30天,靜態(tài)文件不怎么更新,過期可以設大一點,如果頻繁更新,則可以設置得小一點。

expires 30d;

}

#PHP 腳本請求全部轉(zhuǎn)發(fā)到 FastCGI處理. 使用FastCGI默認配置

location ~ \.php$ {

root /root;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;

include fastcgi_params;

}

#設定查看Nginx狀態(tài)的地址

location /NginxStatus {

stub_status on;

access_log on;

auth_basic "NginxStatus";

auth_basic_user_file conf/htpasswd;

}

#禁止訪問 .htxxx 文件

location ~ /\.ht {

deny all;

}

}

}

5.2.1 簡單的配置文件

user nginx;

worker_processes auto;

error_log /var/log/nginx/error.log notice;

pid /var/run/nginx.pid;

events {

worker_connections 1024;

}

http {

include /etc/nginx/mime.types;

default_type text/html;

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 /var/log/nginx/access.log main;

sendfile on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;

server {

listen 80;

server_name localhost note.com 116.62.23.147;

index index.html;

location /note {

autoindex on;

autoindex_exact_size on;

autoindex_localtime on;

#add_header Content-Type charset=utf-8;

add_header Cache-Control no-store,no-cache;

#default_type text/html;

#index README.md;

alias /var/tmp/;

#root /var/tmp;

}

}

}

5.3 內(nèi)置變量

變量描述$args查詢字符串 a=1&b=2$arg_name請求行中name參數(shù)的值,$arg_a = 1 , $arg_b = 2$body_bytes_sent發(fā)送給客戶端文件內(nèi)容大小 1547 ,以字節(jié)計,不包括http報頭$bytes_sent發(fā)給客戶端的數(shù)據(jù)大小,以字節(jié)計$cookie_nameCookie中名為name的值 $cookie_CA=abc, $cookie_CB=123$document_uri同$uri$http_x_forwarded_for記錄了代理過程$host等于$http_host$http_refererurl跳轉(zhuǎn)來源 https://www.baidu.com/$http_user_agent用戶終端瀏覽器等信息 "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;$http_cookie“Cookie”請求頭的值$http_host請求地址,即瀏覽器中你輸入的地址(IP或域名) www.it300.com$is_args表示請求中的URL是否帶參數(shù),如果帶參數(shù),$is_args值為"?"。如果不帶參數(shù),則是空字符串$proxy_host代理的host$proxy_port代理的端口$proxy_add_x_forwarded_for$proxy_add_x_forwarded_for變量包含客戶端請求頭中的"X-Forwarded-For",與$remote_addr兩部分,他們之間用逗號分開。$query_string同$args$request整個請求行,請求的URI和HTTP協(xié)議 “GET /article-10000.html HTTP/1.1”$remote_addr客戶端地址 211.28.65.253$remote_user客戶端用戶名稱$remote_port客戶端端口$request_time整個請求的總時間 0.205$request_method請求方法(如GET、POST)$request_uri完整的請求URI /nginx-var/request-line?a=1&b=2$statusHTTP請求狀態(tài) 200$ssl_protocolSSL協(xié)議版本 TLSv1$ssl_cipher交換數(shù)據(jù)中的算法 RC4-SHA$server_protocol請求協(xié)議(如HTTP/1.0 HTTP/1.1)$time_local訪問時間和時區(qū) 18/Jul/2012:17:00:01 +0800$uriURI,除去查詢字符串 /nginx-var/request-line$upstream_statusupstream狀態(tài) 200$upstream_addr后臺upstream的地址,即真正提供服務的主機地址 10.10.10.100:80$upstream_response_time請求過程中,upstream響應時間 0.002$upstream_connect_time與upstream建立連接所消耗的時間(nginx做反向代理服務器時可用)$upstream_cache_status緩存命中狀態(tài)

參數(shù)介紹

5.4 重要配置概述

5.4.1 location

用于匹配請求地址

語法規(guī)則: location [=|~|~*|^~] /uri/ { … }

= 表示精確匹配~表示區(qū)分大小寫的正則匹配~* 表示不區(qū)分大小寫的正則匹配!~和!~*分別為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配 的正則^~ 開頭表示uri以某個常規(guī)字符串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規(guī)則^~ /static/ /aa匹配到(注意是空格)。/ 通用匹配,任何請求都會匹配到。

匹配順序:

1:帶有“=“的精確匹配優(yōu)先 2:沒有修飾符的精確匹配 3:正則表達式按照他們在配置文件中定義的順序 4:帶有“^~”修飾符的,開頭匹配 5:帶有“~” 或“~*” 修飾符的,如果正則表達式與URI匹配 6:沒有修飾符的,如果指定字符串與URI開頭匹配

Location區(qū)段匹配示例

location = / {

  # 只匹配 / 的查詢.

  [ configuration A ]

}

location / {

  # 匹配任何以 / 開始的查詢,但是正則表達式與一些較長的字符串將被首先匹配。

  [ configuration B ]

}

location ^~ /images/ {

  # 匹配任何以 /images/ 開始的查詢并且停止搜索,不檢查正則表達式。

  [ configuration C ]

}

location ~* \.(gif|jpg|jpeg)$ {

  # 匹配任何以gif, jpg, or jpeg結尾的文件,但是所有 /images/ 目錄的請求將在Configuration C中處

  理。

  [ configuration D ]

} 各

請求的處理如下例:

/ → configuration A

/documents/document.html → configuration B

/images/1.gif → configuration C

/documents/1.jpg → configuration D

注意:在進行路由規(guī)則的時候最好避免,adm,admin 這樣具有子集的規(guī)則。

5.4.2 proxy_pass

proxy_pass代理路徑"/“作用:僅看端口后面是否存在”/",存在則為絕對路徑,不存在則為相對路徑;

# 請求地址為 http://1.1.1.1:80/path/path1

location /path/ {

proxy_pass http://2.2.21.1:80/

}

# proxy_pass http://2.2.21.1:80 不加 / 表示相對路徑 請求將轉(zhuǎn)發(fā)到 http://2.2.21.1:80/path/path1

# proxy_pass http://2.2.21.1:80/ 加 / 表示絕對路徑 請求將轉(zhuǎn)發(fā)到 http://2.2.21.1:80/path1

# 請求地址為 http://1.1.1.1:80/path/path1

location /path/ {

proxy_pass http://2.2.21.1:80/path2

}

# proxy_pass http://2.2.21.1:80/path2 不加 / 表示絕對路徑 請求將轉(zhuǎn)發(fā)到http://2.2.21.1:80/path2path1

# proxy_pass http://2.2.21.1:80/path2/ 加 / 表示絕對路徑 請求將轉(zhuǎn)發(fā)到 http://2.2.21.1:80/path2/path1

注意: 在 location 使用正則表達式的時候,proxy_pass 后面是不能跟 / 的,否則報錯,正確的使用如 http://2.2.21.1:80

5.4.3 root 、alias

alias是一個目錄別名的定義,root則是最上層目錄的定義。

location /img/ {

alias /var/www/image/;

// 指定默認頁面 可以有多個 a.html, b.html會按照順序去尋找。

index index.html;

}

#若按照上述配置的話,則訪問/img/目錄里面的文件時,ningx會自動去/var/www/image/目錄找文件

location /img/ {

root /var/www/image;

}

#若按照這種配置的話,則訪問/img/目錄下的文件時,nginx會去/var/www/image/img/目錄下找文件

5.4.4 proxy_set_heade

設置代理請求頭

location /etc-job/api/ {

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://10.55.3.139:8088/api/;

proxy_cookie_path / /etc-job/api/;

proxy_set_header Cookie $http_cookie;

}

5.4.5 proxy_cookie_path

cookie 的 path 與地址欄上的 path 不一致, 瀏覽器就不會接受這個 cookie,無法傳入 JSESSIONID 的 cookie, 導致登錄驗證失敗。

proxy_cookie_path 的作用是用來改變cookie的路徑。主要用作服務器向瀏覽器反饋時(修改response set-cookie的path屬性)

# path 就是你要替換的路徑(代理路徑) replacement 就是要替換的值(瀏覽器請求路徑)

proxy_cookie_path `path` `replacement`;

5.4.6 proxy_cookie_domain

proxy_cookie_domain 的作用是用來改變domain的路徑。主要用作服務器向瀏覽器反饋時(修改response set-cookie的domain屬性, 該屬性不是必須的)。

# path 就是你要替換的 domian(domian) replacement 就是要替換的domain(瀏覽器請求domain)

proxy_cookie_path `path` `replacement`;

5.4.7 rewrite 重定向

rewrite [flag];

關鍵字 正則 替代內(nèi)容 flag標記

# 關鍵字:其中關鍵字error_log不能改變

# 正則:perl兼容正則表達式語句進行規(guī)則匹配

# 替代內(nèi)容:將正則匹配的內(nèi)容替換成replacement

# flag標記:rewrite支持的flag標記

flag標記說明:

last #本條規(guī)則匹配完成后,繼續(xù)向下匹配新的location URI規(guī)則

break #本條規(guī)則匹配完成即終止,不再匹配后面的任何規(guī)則

redirect #返回302臨時重定向,瀏覽器地址會顯示跳轉(zhuǎn)后的URL地址

permanent #返回301永久重定向,瀏覽器地址欄會顯示跳轉(zhuǎn)后的URL地址

字符描述\將后面接著的字符標記為一個特殊字符或一個原義字符或一個向后引用。如“\n”匹配一個換行符,而“$”則匹配“$”^匹配輸入字符串的起始位置$匹配輸入字符串的結束位置*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”+匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o”?匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,“?“等效于”{0,1}”.匹配除“\n”之外的任何單個字符,若要匹配包括“\n”在內(nèi)的任意字符,請使用諸如“[.\n]”之類的模式。(pattern)匹配括號內(nèi)pattern并可以在后面獲取對應的匹配,常用$0…$9屬性獲取小括號中的匹配內(nèi)容,要匹配圓括號字符需要Content

rewrite參數(shù)的標簽段位置:

server,location,if

rewrite ^/(.*) http://www.lidasoft.cc/$1 permanent;

server {

# 訪問 /last.html 的時候,頁面內(nèi)容重寫到 /index.html 中,并繼續(xù)后面的匹配,瀏覽器地址欄URL地址不變

rewrite /last.html /index.html last;

# 訪問 /break.html 的時候,頁面內(nèi)容重寫到 /index.html 中,并停止后續(xù)的匹配,瀏覽器地址欄URL地址不變;

rewrite /break.html /index.html break;

# 訪問 /redirect.html 的時候,頁面直接302定向到 /index.html中,瀏覽器地址URL跳為index.html

rewrite /redirect.html /index.html redirect;

# 訪問 /permanent.html 的時候,頁面直接301定向到 /index.html中,瀏覽器地址URL跳為index.html

rewrite /permanent.html /index.html permanent;

# 把 /html/*.html => /post/*.html ,301定向

rewrite ^/html/(.+?).html$ /post/$1.html permanent;

# 把 /search/key => /search.html?keyword=key

rewrite ^/search\/([^\/]+?)(\/|$) /search.html?keyword=$1 permanent;

# 把當前域名的請求,跳轉(zhuǎn)到新域名上,域名變化但路徑不變

rewrite ^/(.*) http://www.jd.com/$1 permanent;

# 將訪問 /api/note/ 的圖片重定向訪問 /note/下的圖像

rewrite ^/api/note/(.*)\.(gif|jpg|jpeg|png)$ /note/$1.$2 last;

}

5.4.8 try_files

try_files是nginx中http_core核心模塊所帶的指令,主要是能替代一些rewrite的指令,提高解析效率。

可應用的上下文:server,location 段

location /images/ {

root /opt/html/;

try_files $uri $uri/ /images/default.gif;

}

比如 請求 127.0.0.1/images/test.gif 會依次查找

1.文件/opt/html/images/test.gif

2.文件夾 /opt/html/images/test.gif/下的index文件

3. 請求127.0.0.1/images/default.gif

* 都找不到 會進行一個內(nèi)部重定向到最后一個參數(shù)。

備注: try-files 如果不寫上 $uri/,當直接訪問一個目錄路徑時,并不會去匹配目錄下的索引頁 即 訪問127.0.0.1/images/ 不會去訪問 127.0.0.1/images/index.html

nginx部署使用history模式的vue項目詳細配置

5.4.9 日志

log_format main '[$time_local] 接收到來自 $remote_addr 的請求 【$request】 請求結果是 【$status】花費了【$request_time】,請求被 [$upstream_addr] 處理了,結果是 [$upstream_status] 。附加信息,referer: [$http_referer] ;

$remote_addr:與 $http_x_forwarded_for 用以記錄客戶端的ip地址;

$remote_user:用來記錄客戶端用戶名稱;

$time_local:用來記錄訪問時間與時區(qū);

$request:用來記錄請求的http的方式與url;

$request_time:用來記錄請求時間;

$status:用來記錄請求狀態(tài);成功是200,

$body_bytes_sent:記錄發(fā)送給客戶端文件主體內(nèi)容大??;

$http_referer:用來記錄從那個頁面鏈接訪問過來的;

$http_user_agent:記錄客戶瀏覽器的相關信息。

5.4.10 正則表達式

^ :匹配輸入字符串的起始位置

$ :匹配輸入字符串的結束位置

* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”

+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”

? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”

. :匹配除“\n”之外的任何單個字符,若要匹配包括“\n”在內(nèi)的任意字符,請使用諸如“[.\n]”之類的模式

\ :將后面接著的字符標記為一個特殊字符或一個原義字符或一個向后引用。如“\n”匹配一個換行符,而“\$”則匹配“$”

\d :匹配純數(shù)字

{n} :重復 n 次

{n,} :重復 n 次或更多次

{n,m} :重復 n 到 m 次

[] :定義匹配的字符范圍

[c] :匹配單個字符 c

[a-z] :匹配 a-z 小寫字母的任意一個

[a-zA-Z0-9] :匹配所有大小寫字母或數(shù)字

(a|b|c) :多選一

| :或運算符

location ~ \.(gif|jpg|jpeg)$ {}

location ~ ^/[admin|screen|auth]/ {}

location ~ ^/Cesium.*\.(css|js|ico|gif|jpg|jpeg|png|json|wasm)$ {}

5.5 配置案例

5.5.1 log format配置

log_format main '[$time_local] $remote_addr-$remote_user $request $query_string $http_referer [$status] rtime:[$request_time] [$upstream_status] uptime:[$upstream_response_time]';

5.5.2 文件目錄展示配置

ngx_http_autoindex_module 模塊提供了目錄的功能。

該模塊有以下幾個命令:

命令默認值值域作用域EGautoindexoffon:開啟目錄瀏覽; off:關閉目錄瀏覽http, server, locationautoindex on;打開目錄瀏覽功能autoindex_formathtmlhtml、xml、json、jsonp 分別用這幾個風格展示目錄http, server, locationautoindex_format html; 以網(wǎng)頁的風格展示目錄內(nèi)容。該屬性在1.7.9及以上適用autoindex_exact_sizeonon:展示文件字節(jié)數(shù); off:以可讀的方式顯示文件大小http, server, locationautoindex_exact_size off; 以可讀的方式顯示文件大小,單位為 KB、MB 或者 GB,autoindex_format為html時有效autoindex_localtimeoffon、off:是否以服務器的文件時間作為顯示的時間http, server, locationautoindex_localtime on; 以服務器的文件時間作為顯示的時間,autoindex_format為html時有效

location /download {

root /home/map/www; #指定目錄所在路徑

autoindex on; #開啟目錄瀏覽

autoindex_format html; #以html風格將目錄展示在瀏覽器中

autoindex_exact_size off; #切換為 off 后,以可讀的方式顯示文件大小,單位為 KB、MB 或者 GB

autoindex_localtime on; #以服務器的文件時間作為顯示的時間

charset utf-8,gbk; #展示中文文件名

}

5.5.3 文件類型添加

# 容器內(nèi) vim 安裝

apt-get update && apt-get install vim

# 在nginx 的mime.types 文件中

vi /usr/local/nginx/conf/mime.types

# 添加對應的文件類型 可以使得要下載的問價已另一種文件類型展示

text/markdown md;

5.5.4 負載均衡

upstream 模塊進行配置,proxy_pass 使用upstream配置的名稱

upstream

upstream test {

ip_hash;

server 192.168.0.1 [parameters];

server 192.168.0.2 [parameters];

}

# 使用

proxy_pass http://test;

負載均衡策略

輪詢 : 默認 weigth : 權重 ip_hash : ip的hash結果分配 least_conn : 最少連接方式 fair(第三方): 服務器響應時間,時間段優(yōu)先分配 url_hash(第三方) :url的hash來分配 有利于緩存

parameters

配置塊名稱作用weight默認為1,weight越大代表權重越大,接受請求的比例為 權重/權重之和max_conns限制分配給某臺server的最大連接數(shù),超過這個數(shù)量,將不再分配鏈接給它,默認為0,表示不限制max_fails默認為1,某臺server允許請求失敗的次數(shù),超過最大次數(shù)后,在fail_timeout時間內(nèi),新的請求不會分配給這個機子fail_timeout默認為10秒,配合max_fails使用backup其它所有的非backup機器down或者忙的時候,請求backup機器down表示當前的server不參與負載

5.5.5 緩存配置

詳細緩存參數(shù)參照

默認情況下,NGINX尊重Cache-Control源服務器的標頭。它不緩存響應Cache-Control設置為Private,No-Cache或No-Store或Set-Cookie在響應頭。NGINX只緩存GET和HEAD客戶端請求。

# 定義緩存區(qū)域

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=name:50m inactive=10m max_size=1g;

參數(shù)作用proxy_cache_path緩存文件路徑,其中文件名是 cache_key 的md5值levels表示緩存目錄下的層級目錄結構,它是根據(jù)hash后的請求url地址創(chuàng)建的,目錄名稱從hash后的字符串結尾處開始截取。假設hash是asdadas7ef,則levels=1:2 表示第一層子目錄的名稱是長度為1的字符串f,第二層是長度為2的字符串7ekeys_zone指定緩存區(qū)名稱及共享內(nèi)存大小,在共享內(nèi)存中設置一塊存儲區(qū)域來存放緩存的key和metadata(類似使用次數(shù)),這樣nginx可以快速判斷一個request是否命中或者未命中緩存,1m可以存儲8000個keyinactive表示主動清空在指定時間內(nèi)未被訪問的緩存,10m代表10分鐘max_size最大cache磁盤空間,如果不指定,會使用掉所有的disk space, 當達到配額后,會刪掉最少使用的cahce文件

location / {

proxy_pass http://1.0.2.3:80;

# 緩存使用前面定義的內(nèi)存區(qū)域

proxy_cache xxx;

proxy_ignore_headers Expires Set-Cookie;

# proxy_ignore_headers可以配置忽略 Cache-Control:

# proxy_ignore_headers Cache-Control;

# 對于200和304的響應碼應該進行緩存 過期時間為1分鐘 該設置會覆蓋前面的10分鐘的設置

# proxy_buffering 默認為on,若proxy_buffering設置為off,則NGINX不會緩存響應。

proxy_cache_valid 200 302 1m;

# 設置緩存的key

proxy_cache_key $host$uri$is_args$args;

# 再返回的響應里 添加響應頭 X-Proxy-Cache, 其值表示是否命中了緩存

add_header X-Proxy-Cache $upstream_cache_status;

}

狀態(tài)含義proxy_cache定義的共享內(nèi)存區(qū)域名稱proxy_cache_key緩存key的組合規(guī)則proxy_cache_valid對于不同的http狀態(tài)碼進行不同的緩存設置proxy_set_header自定義http header 頭,用于發(fā)送后端真實服務器add_header響應數(shù)據(jù)給客戶端時,需要添加的頭信息

$upstream_cache_status 可以返回的緩存狀態(tài)

狀態(tài)含義MISS未命中緩存,請求真實服務器HIT命中緩存EXPIRED正在更新緩存,使用舊的應答B(yǎng)YPASS緩存被繞過了(可以通過proxy_cache_bypass 指定配置)STALE無法從后端服務更新緩存,返回了舊的緩存內(nèi)容(可以通過proxy_cache_use_stale配置)UPDATING內(nèi)容過期了,因為相對于之前的請求,響應的入口(entry)已經(jīng)更新,并且proxy_cache_use_stale 的updating已經(jīng)被設置REVALIDATED啟用proxy_chache_revalidate指令后,當緩存內(nèi)容過期,nginx通過一次If-Meodified-Since的請求頭去驗證緩存內(nèi)容是否過期,此時會返回該狀態(tài)。

5.5.6 gzip靜態(tài)資源壓縮配置

瀏覽器發(fā)送請求時,通過Accept-Encoding說明可以接受的壓縮方式;服務器接收到請求,使用Accept-Encoding中的一種對響應數(shù)據(jù)進行壓縮;服務器返回數(shù)據(jù),在Content-Encoding中指明使用的壓縮方式;瀏覽器獲取響應數(shù)據(jù),使用Content-Encoding對結構進行解析。

命令說明默認值gzip on/off;開啟/關閉gzip壓縮offgzip_min_length 1k;# 啟用gzip壓縮的最小文件;小于設置值的文件將不會被壓縮0kgzip_buffers 4 16k;系統(tǒng)獲取幾個單位的緩存用于存儲gzip的壓縮結果數(shù)據(jù)流,4 16k 代表以16k為單位,按照原始數(shù)據(jù)大小以16k為單位的4倍申請內(nèi)存gzip_http_version 1.1;設置http1.1協(xié)議才進行壓縮默認為1.1gzip_comp_level 3;表示gzip的壓縮級別,范圍是1-9,數(shù)據(jù)越大,壓縮的越小,耗CPU,傳輸更快,一般選擇適中的級別默認為1gzip_types text/plain application/javascript …;設置哪種類型可以進行壓縮,需要什么類型可以參考nginx.conf同目錄下的mime.types文件默認是text/htmlgzip_disable “MSIE [1-6].”;禁用gzip的條件,這里表示禁用IE1-6的版本,因為低版本不支持gzipgzip_vary on;如果啟用壓縮,是否在響應報文首部插入"Vary: Accept-Encoding",建議開啟該參數(shù),讓用戶知道服務器是支持壓縮功能的

# 開啟gzip

gzip on;

# 啟用gzip壓縮的最小文件;小于設置值的文件將不會被壓縮

gzip_min_length 1k;

# gzip 壓縮級別 1-10

gzip_comp_level 3;

# 進行壓縮的文件類型。

gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

# 是否在http header中添加Vary: Accept-Encoding,建議開啟

gzip_vary on;

5.5.7 nginx跨域配置

1995年,同源政策由 Netscape 公司引入瀏覽器。目前,所有瀏覽器都實行這個政策。 最初,它的含義是指,A網(wǎng)頁設置的 Cookie,B網(wǎng)頁不能打開,除非這兩個網(wǎng)頁"同源"。所謂"同源"指的是"三個相同"。

協(xié)議相同域名相同端口相同

舉例來說,http://www.example.com/dir/page.html這個網(wǎng)址, 協(xié)議是http://,域名是www.example.com,端口是80(默認端口可以省略)。它的同源情況如下:

http://www.example.com/dir2/other.html: 同源http://example.com/dir/other.html: 不同源(域名不同)http://v2.www.example.com/dir/other.html:不同源(域名不同)http://www.example.com:81/dir/other.html:不同源(端口不同)

跨域解決方式描述方式一jsonp數(shù)據(jù)格式,前后端配合改造跨域方式二后端方法增加@CrossOrigin注解完成跨域方式三后端增加跨域配置類完成跨域方式四nginx同時反向代理請求、目標訪問地址,完成跨域方式五nginx代理目標訪問地址增加跨域配置詳情請參考案例路徑:案例/nginx跨域測試用例-2021-12-02.doc

#允許跨域請求的域,* 代表所有

add_header 'Access-Control-Allow-Origin' *;

#允許請求的header

add_header 'Access-Control-Allow-Headers' *;

#允許帶上cookie請求

add_header 'Access-Control-Allow-Credentials' 'true';

#允許請求的方法,比如 GET,POST,PUT,DELETE

add_header 'Access-Control-Allow-Methods' *;

# 表示請求頭的字段 動態(tài)獲取

add_header Access-Control-Allow-Headers $http_access_control_request_headers;

# 預檢命令的緩存,如果不緩存每次會發(fā)送兩次請求

add_header Access-Control-Max-Age 3600;

5.5.8 SSL 配置

# 全局配置

ssl_certificate cert/server.crt

ssl_certificate_key cert/server.key;

server {

listen 443;

server_name www.domain.com; # 用戶服務器的域名

ssl on; # 設置為“on”,啟用SSL功能。

ssl_certificate cert/server.crt # 證書文件“server.crt”。

ssl_certificate_key cert/server.key; # 私鑰文件“server.key”。

ssl_session_timeout 5m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 使用的協(xié)議。

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 配置加密套件,寫法遵循OpenSSL標準。

ssl_prefer_server_ciphers on;

location / {

root html; #站點目錄

index index.html index.htm;

}

}

# http 跳轉(zhuǎn) https

server {

listen 80;

server_name www.domain.com;

rewrite ^(.*)$ https://$host$1 permanent;

}

5.5.8.1 自簽發(fā)證書生成

默認linux 都會已經(jīng)安裝了 openssl

# 查看openssl版本信息

openssl version -a

使用openssl創(chuàng)建服務器私鑰,輸入相應提示的信息

#(server是自己定義的)

# 可選1024 和 2048

# 提示輸入兩次密碼

openssl genrsa -des3 -out server.key 2048

# 密碼:123pa

# 密碼:123pa

創(chuàng)建證書簽名請求

openssl req -new -key server.key -out server.csr

--------------------------------------------------------------------

Enter pass phrase for server.key: # 123pa

-----

Country Name (2 letter code) [AU]:cn # 國名

State or Province Name (full name) [Some-State]:guangdong # 省名

Locality Name (eg, city) []:guangzhou # 城市名

Organization Name (eg, company) [Internet Widgits Pty Ltd]:grg # 機構名

Organizational Unit Name (eg, section) []:grg # 單位名

Common Name (e.g. server FQDN or YOUR name) []:rootcl # 通用名

Email Address []:1065205727@qq.com # 郵件地址

A challenge password []:rootcl # 挑戰(zhàn)密碼

An optional company name []:grg # 可選的公司名

cp server.key server.key.org

rm server.key

openssl rsa -in server.key.org -out server.key

使用剛生成的私鑰和CSR進行證書簽名

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

即 server.crt server.key 可以配置到nginx供使用

5.5.9 websocket 配置

location ^~/socket.io/ {

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

proxy_pass http://172.20.0.5:8809/socket.io/;

}

# 如果 $http_upgrade 不為空 那么$connection_upgrade 就是 upgrade

# 如果 $http_upgrade 為空 那么$connection_upgrade 就是 close

map $http_upgrade $connection_upgrade {

default upgrade;

'' close;

}

# 兩臺服務器 (ip1:port1)和(ip2:port2) 。

# keepalive 1000 表示的是每個nginx進程中上游服務器保持的空閑連接,當空閑連接過多時,會關閉最少使用的空閑連接.當然,這不是限制連接總數(shù)的,可以想象成空閑連接池的大小,設置的值應該是上游服務器能夠承受的。

upstream wsbackend{

server ip1:port1;

server ip2:port2;

keepalive 1000;

}

server {

# 表示 nginx 監(jiān)聽的端口

listen 20038;

# 表示監(jiān)聽的路徑(/表示所有路徑,通用匹配,相當于default)

location /{

# 表示反向代理發(fā)送的HTTP協(xié)議的版本是1.1,HTTP1.1支持長連接

proxy_http_version 1.1;

# 表示反向代理的uri,這里可以使用負載均衡變量

proxy_pass http://wsbackend;

# 表示不要替換路徑,其實這里如果是/則有沒有都沒關系,因為default也是將路徑替換到proxy_pass的后邊

proxy_redirect off;

# 表示傳遞時請求頭不變,host是nginx內(nèi)置變量,表示的是當前的請求頭,

proxy_set_header Host $host;

# 表示傳遞時來源的ip還是現(xiàn)在的客戶端的ip

proxy_set_header X-Real-IP $remote_addr;

# 表的兩次請求之間的間隔超過 3600s 后才關閉這個連接,默認的60s,自動關閉的元兇

proxy_read_timeout 3600s;

# 表示X-Forwarded-For頭不發(fā)生改變

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# 表示設置Upgrade不變

proxy_set_header Upgrade $http_upgrade;

# 表示如果http_upgrade為upgrade,則請求為upgrade(websocket),如果不是,就關閉連接

proxy_set_header Connection $connection_upgrade;

}

}

5.5.10 文件大小

nginx 默認允許上傳的文件大小為 1M 否則就報錯。

# 說明上傳的文件太大(nginx 默認允許文件上傳的大小為 1M)

413 Request Entity Too Large

在 nginx 中,調(diào)整上傳文件只需要配置如下參數(shù):

client_max_body_size: 表示客戶端請求服務器最大允許大小 client_max_body_size 默認 1M,表示客戶端請求服務器最大允許大小,在 “Content-Length” 請求頭中指定。如果請求的正文數(shù)據(jù)大于 client_max_body_size,HTTP 協(xié)議會報錯 413 Request Entity Too Large。就是說如果請求的正文大client_max_body_size,一定是失敗的。如果需要上傳大文件,一定要修改該值。 client_body_buffer_size: 表示 nginx 分配給請求數(shù)據(jù)的 Buffer 大小 nginx 分配給請求數(shù)據(jù)的 Buffer 大小,如果請求的數(shù)據(jù)小于 client_body_buffer_size 直接將數(shù)據(jù)先在內(nèi)存中存儲。如果請求的值大于 client_body_buffer_size 小于 client_max_body_size,就會將數(shù)據(jù)先存儲到臨時文件中,在哪個臨時文件中呢? client_body_temp 指定的路徑中,默認該路徑值是 /tmp/。 所以配置的 client_body_temp 地址,一定讓執(zhí)行的 nginx 的用戶組有讀寫權限。否則,當傳輸?shù)臄?shù)據(jù)大于 client_body_buffer_size,寫進臨時文件失敗會報錯。

server {

listen 8080;

server_name localhost;

# 修改文件大小限制為 50m,默認1m

client_max_body_size 50m;

# 修改分配給請求數(shù)據(jù)的 Buffer 大小為 1m

client_body_buffer_size 1m;

location / {

root html;

index index.html index.htm;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

5.6 成功的配置信息參照

5.6.1 案例1

# 開啟gzip

gzip on;

# 啟用gzip壓縮的最小文件;小于設置值的文件將不會被壓縮

gzip_min_length 1k;

# gzip 壓縮級別 1-10

gzip_comp_level 3;

# 進行壓縮的文件類型。

gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

# 是否在http header中添加Vary: Accept-Encoding,建議開啟

gzip_vary on;

ssl_certificate /etc/nginx/cert/grg.crt; # 證書文件"server.crt"。

ssl_certificate_key /etc/nginx/cert/grg.key; # 私鑰文件"server.key"。

client_max_body_size 1G;

server {

listen 443 ssl default deferred;

server_name localhost 127.0.0.1 proj.imeeting.grgbanking.com;

ssl on;

ssl_session_cache shared:SSL:50m;

ssl_session_timeout 5m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

ssl_prefer_server_ciphers on;

rewrite ^/token/logout /token/logout;

rewrite ^/oauth/token /oauth/token;

location / {

try_files $uri $uri/ /index.html last;

root /usr/share/nginx/html/dist;

}

location /token/logout {

proxy_pass http://172.18.0.7:8849;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

location /oauth/token {

proxy_pass http://172.18.0.7:8849;

proxy_read_timeout 90;

proxy_set_header X-Forwarded-Host $host:$server_port;

proxy_set_header X-Forwarded-Server $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header X-Real-IP $remote_addr;

}

location ^~/admin/ {

proxy_pass http://172.18.0.6:8801/admin/;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

location ^~/socket.io/ {

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

proxy_pass http://172.18.0.8:9809/socket.io/;

}

location ^~/chat/ {

proxy_pass http://172.18.0.8:9808/chat/;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

location /bd{

proxy_pass http://www.baidu.com/;

}

}

# 所有的http 請求都將被轉(zhuǎn)發(fā)到https 請求

server {

listen 80;

server_name localhost 127.0.0.1 proj.imeeting.grgbanking.com;

rewrite ^(.*)$ https://$host$1 permanent;

}

8. open Resty

9. 問題收集

1. 出現(xiàn)403問題的原因

directory index of “xxx” is forbidden

訪問的資源不是一個具體的文件,alias /gs/grg_admin/admin/ 此時未指定 index

可以添加 autoindex on; # 自動索引

導致無限重定向的問題

2. Nginx文件直接下載改為網(wǎng)頁打開

# nginx 默認 會有下面配置

include mime.types; # 自動匹配文件的類型 在nginx中會有個 mime.types的文件的

default_type application/octet-stream; # mime類型不存在 會使用該類型 默認的 直接提交一個二進制

# 所以可以再 mime.types 中添加自己的文件類型對應的 content-type

# 若找不到 也可以以 text/html 的形式打開

3、nginx代理后,應用上傳文件時,發(fā)現(xiàn)小文件可上傳,大文件上傳不了

當代理文件大小超過配置的proxy_temp_file_write_size值時,nginx會將文件寫入到臨時目錄下,(默認為/nginx/nginx-prefix/client_body_temp/)作為緩存,解決方案:給當前目錄賦對應權限即可。

4. 502 Bad Gateway

當代理 (proxy_pass) 的 ip 地址無法訪問的時候會出現(xiàn)此錯誤,代理 ip 為127.0.0.1

5. 504 Gateway Time-out

當代理 (proxy_pass) 的 ip 地址無法訪問的時候會出現(xiàn)此錯誤,代理 ip ping 不通,

6. the “ssl” directive is deprecated, use the “l(fā)isten … ssl”

server {

listen 443 ssl;

}

如果listen 有ssl, 刪除ssl on即可。

7. [emerg] “proxy_pass” cannot have URI part in

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /etc/nginx/conf.d/proj.conf:33

因為location 使用了正則表達式

錯誤的:

location ~ /(admin|screen|auth)/* {

proxy_pass http://cl-gateway:9999/;

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

正確的:

location ~ /(admin|screen|auth)/* {

proxy_pass http://cl-gateway:9999;

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

柚子快報邀請碼778899分享:運維 Nginx

http://yzkb.51969.com/

好文鏈接

評論可見,查看隱藏內(nèi)容
大家都在看:

本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權,聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19497745.html

發(fā)布評論

您暫未設置收款碼

請在主題配置——文章設置里上傳

掃描二維碼手機訪問

文章目錄