Nginx常用配置

一、簡介

Nginx (engine x) 是一個高性能的Web服務器和反向代理服務器,也可以作爲郵件代理服務器,使用C語言開發。

Nginx 特點是佔有內存少,併發處理能力強,以高性能、低系統資源消耗而聞名,Nginx官方測試爲5萬併發請求。

日常中的併發量上限4萬左右。

1. 正向代理

正向代理類似一個跳板機,代理訪問外部資源。比如:我是一個用戶,我訪問不了某網站,但是我能訪問一個代理服務器,這個代理服務器,它能訪問那個我不能訪問的網站,於是我先連上代理服務器,告訴它我需要那個無法訪問網站的內容,代理服務器去取回來,然後返回給我。代理客戶端去請求服務器,隱藏了真實客戶端,服務器並不知道真實的客戶端是誰。

2. 反向代理

反向代理(Reverse Proxy)方式是指以代理服務器來接受Internet上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給Internet上請求連接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器;

反向代理隱藏了真正的服務端,就像你每天使用百度的時候,只知道敲打www.baidu.com就可以打開百度搜索頁面,但背後成千上萬臺百度服務器具體是哪一臺爲我們服務的,我們並不知道。我們只知道這個代理服務器,它會把我們的請求轉發到真實爲我們服務的那臺服務器那裏去。

綜上所述:正向代理代理對象是客戶端,反向代理代理對象是服務端。軟件層面一般常用Nginx來做反向代理服務器,它的性能非常好,用來做負載均衡。

二、Nginx環境搭建

1. 下載

免費開源版的官方網站:http://nginx.org/en/download.html,可以下載穩定版(Stable version)

Nginx 有 Windows 版本和 Linux 版本,但更推薦在 Linux 下使用 Nginx;
下載nginx-1.14.2.tar.gz的源代碼文件:wget http://nginx.org/download/nginx-1.14.2.tar.gz
或者在Windows上下載下來再上傳到Linux中

2. 安裝

(1)安裝相關庫

Nginx的安裝需要確定Linux安裝相關的幾個庫,否則配置和編譯會出現錯誤,相關庫有:

  • gcc編譯器
  • openssl庫
  • pcre庫
  • zlib庫

一次性檢查並安裝,若已安裝則跳過,若有更新,則進行更新:

yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y

檢查庫是否安裝成功,下面的命令只能一個一個的檢查,或者再運行一遍上面的命令,若沒有操作則說明相關庫已經存在:

yum list installed | grep gcc
yum list installed | grep openssl
yum list installed | grep pcre
yum list installed | grep zlib

(2)安裝Nginx

  1. 解壓下載下來的nginx文件(.tar.gz),執行命令:tar -zxvf nginx-1.14.2.tar.gz
  2. 切換至解壓後的nginx主目錄,在nginx主目錄nginx-1.14.2下執行命令:
    ./configure --prefix=/usr/local/nginx 
    

(其中–prefix是指定nginx安裝路徑) 注意:等號左右不要有空格
3. 執行命令進行編譯:make
4. 執行命令進行安裝:make install

安裝成功後,可以切換到/usr/local/nginx目錄下,查看內容

(3)目錄簡介

  • conf:存放配置文件,文件夾中每個配置文件都有兩份,以 .default 結尾的是默認配置
  • html:存放頁面
  • logs:存放日誌
  • sbin:存放可執行文件
  • *_temp:Nginx啓動後,安裝目錄下會出現一些_temp結尾的文件,這些是臨時文件,不用管。

3. 啓動

  • 默認啓動:
    • 切換到nginx安裝目錄的sbin目錄下,執行:./nginx
  • 通過配置文件啓動:
    • 通過 -c 指定配置文件的位置,而且配置文件路徑必須指定絕對路徑
    • 可以在配置文件後加上 -t 參數,檢查配置文件是否存在語法錯誤
    ./nginx -c /usr/local/nginx/conf/nginx.conf  # 相對路徑啓動
    /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 絕對路徑啓動
    
    ./nginx -c /usr/local/nginx/conf/nginx.conf -t  # 檢查配置文件是否存在語法錯誤
    

4. 查看進程

查看進程:ps -ef | grep nginx
在這裏插入圖片描述
nginx 體系結構由 master 進程和其 worker 進程組成,啓動成功後至少有兩個進程,少於兩個則沒有成功

  • master 進程爲主進程,讀取配置文件,並維護和管理 worker 進程,其父進程pid爲1
  • worker 進程則對請求進行實際處理,worker可以有更多,>=1,父進程pid爲master的pid

Nginx的默認端口爲80,在瀏覽器中訪問 http://ip地址:80 即可訪問到Nginx,(默認端口爲80時,在地址欄中可以不指定端口)

5. 關閉

(1)優雅的關閉

  • 找出nginx的進程號:ps -ef | grep nginx
  • 執行命令:kill -QUIT 主pid

注意

  • 其中pid是主進程號的pid(master process),其他爲子進程pid(worker process)
  • 這種關閉方式會處理完請求後再關閉,所以稱之爲優雅的關閉

(2)快速關閉

  • 找出nginx的進程號:ps -ef | grep nginx
  • kill -TERM 主pid

注意

  • 其中pid是主進程號的pid(master process),其他爲子進程pid(worker process)
  • 這種關閉方式不管請求是否處理完成,直接關閉,比較暴力,稱之爲快速的關閉

(3)直接kill

  • 找出nginx的進程號:ps -ef | grep nginx
  • kill -9 主pid

6. 重啓

重啓使用的較多,當修改配置文件後,便需要重啓Nginx,重啓時不需要指定配置文件,使用的是最近一次啓動時用的配置文件

注意:如果用同一個Nginx使用多個不同的配置文件啓動了多個Nginx,則不能使用重啓,因爲Nginx會不知道重啓哪個配置文件

./nginx -s reload

7. 其它

Linux上查看nginx版本:/usr/local/nginx/sbin/nginx -V

  • -v:顯示 nginx 的版本
  • -V:顯示 nginx 的版本、編譯器版本和配置參數

8. Windows環境簡介

在官方網站下載最新windows版的nginx:http://nginx.org/en/download.html
將下載下來的nginx壓縮包解壓到一個目錄下,解壓後該軟件就可以啓動使用了
啓動方式1:雙擊解壓目錄下的nginx.exe文件即可運行nginx;
啓動方式2:進入dos窗口,切換到nginx主目錄下,在dos窗口執行命令:start nginx
關閉方式1:在資源管理器殺掉Nginx進程(有兩個進程)
關閉方式2:在dos窗口切換到Nginx安裝主目錄下執行命令:nginx -s stop

三、配置文件

學習Nginx首先需要對它的核心配置文件有一定的認識,這個文件位於Nginx的安裝目錄/usr/local/nginx/conf目錄下,名字爲nginx.conf

Nginx的核心配置文件主要由三個部分構成:基本配置,events配置,http配置

1. 基本配置

在文件中直接進行配置的是基本配置:

#配置worker進程運行用戶 nobody也是一個linux用戶,一般用於啓動程序,沒有密碼
#user  nobody;  
#配置工作進程數目,根據硬件調整,通常等於CPU數量或者2倍於CPU數量
worker_processes  1;  

#配置全局錯誤日誌及類型,[debug | info | notice | warn | error | crit],默認是error
error_log  logs/error.log;  
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid  logs/nginx.pid;  #配置進程pid文件 

2. events配置

events主要用於配置工作模式和連接數,在 events{} 中進行配置

events {
	# 配置每個worker進程連接數上限,nginx支持的總連接數就等於worker_processes * worker_connections
	# 需要注意的是,worker_connections最大爲 65536
    worker_connections  1024;  
}

3. http配置

http {
    #配置nginx支持哪些多媒體類型,可以在conf/mime.types查看支持哪些多媒體類型
    include       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日誌及存放路徑,並使用上面定義的main日誌格式,需要與上面的日誌格式同時打開
    #access_log  logs/access.log  main;

    sendfile        on;  #開啓高效文件傳輸模式
    #tcp_nopush     on;  #防止網絡阻塞,上線時必須開

    #keepalive_timeout  0;
    keepalive_timeout  65;  #長連接超時時間,單位是秒

    #gzip  on;  #開啓gzip壓縮輸出,上線時必須開,開發時不開,防止沒有格式
	
	###-----------------------------------------------
	

    #配置虛擬主機
    server {
        listen       80;  #配置監聽端口
        server_name  localhost;  #配置服務名

        #charset koi8-r;  #配置字符集

        #access_log  logs/host.access.log  main;  #配置本虛擬主機的訪問日誌

		#默認的匹配斜槓/的請求,當訪問路徑中有斜槓/,會被該location匹配到並進行處理
        location / {
	    	#root是配置服務器的默認網站根目錄位置,默認爲nginx安裝主目錄下的html目錄
            root   html;  
	    	#配置首頁文件的名稱
            index  index.html index.htm;  
        }		

        #error_page  404              /404.html;  #配置404頁面
        # redirect server error pages to the static page /50x.html
        #error_page   500 502 503 504  /50x.html;  #配置50x錯誤頁面
        
		#精確匹配
		location = /50x.html {
            root   html;
        }

		#PHP 腳本請求全部轉發到Apache處理
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

		#PHP 腳本請求全部轉發到FastCGI處理
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

		#禁止訪問 .htaccess 文件
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

	
	#配置另一個虛擬主機
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

	
	#配置https服務,安全的網絡傳輸協議,加密傳輸,端口443,運維來配置
	#
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

(1)基本配置

http配置主要是配置http服務器,利用它的反向代理功能提供負載均衡支持,在 http{} 中進行配置

注意:

  • 上線必需要打開的配置:gzip on(開發時不開)tcp_nopush on

(2)配置虛擬主機

虛擬主機配置在 http{server{}} 中,可以配置多個,其中比較重要的是location:
牢記 ip + port 等於root的原則

  • location後的 / 表示:ip + 端口號,後面跟的參數相當於是網站名
  • location中的 root 參數表示:
    • 若參數前不加 / 則表示 nginx的安裝路徑,例如:默認指定爲html,即表示爲nginx安裝主目錄下的html目錄
    • 若參數前加 / 則表示 Linux 中的根路徑(/)路徑

/root 後的路徑是一一對應的:舉個例子:比如說的我 Nginx 的ip爲192.168.0.1,端口爲 80,location 參數指定的值爲 /aa(相當於是war包的名字),root 配置參數指定的值爲 /opt/web(相當於把war包直接放到裏面),若訪問路徑爲 http://192.168.0.1:80/aa/index.html,則Nginx會訪問 /opt/web/aa/index.html 靜態文件

# 默認的匹配斜槓/的請求,當訪問路徑中有斜槓/,會被該location匹配到並進行處理
# 網站爲:http://www.ip:80/aa
location /aa {
	# 磁盤路徑爲:/opt/web/aa
    root   /opt/web;  
}	

4. 修改配置文件的小技巧

適用於不太會用vim或者需要對文件進行大改的情況:

先將配置文件下載到Windows上,修改完畢後再上傳到Linux中,覆蓋原文件

  • sz :從Linux下載文件到本機 , 在Linux終端輸入命令回車後,選擇本地存儲路徑即可。

    • 命令格式:
      • sz filename 下載文件filename
      • sz file1 file2 下載多個文件
      • sz dir/*   下載dir目錄下所有文件
  • rz:從本地上傳文件到Linux,在Linux終端輸入命令回車後,選擇本地要上傳的文件即可,可一次指定多個文件

    • 命令格式: rz -y 選擇文件並上傳到執行命令所在的目錄

注意:

  1. 如果機器上沒有安裝過 lrzsz 安裝包,則無法使用 rz 和 sz 命令。

    • 使用yum命令安裝:yum install -y lrzsz

    • 下載源碼進行安裝。下載地址:https://ohse.de/uwe/software/lrzsz.html

  2. 上傳和下載都默認使用Linux當前登錄的用戶,使用時要根據個人需要修改文件的權限。

四、負載均衡

1. 簡介

(1)硬件負載均衡

比如 F5、深信服、Array 等

  • 優點:有廠商專業的技術服務團隊提供支持,性能穩定
  • 缺點:費用昂貴,對於規模較小的網絡應用成本太高

(2)軟件負載均衡

比如 Nginx、LVS、HAProxy 等

  • 優點:免費開源,成本低廉
  • 缺點:性能沒有硬件高

所以,實際中,往往會兩者結合使用,在關鍵的位置使用硬件負載均衡,而其餘地方使用軟件負載均衡

2. 負載均衡配置

(1)在http模塊中加上upstream配置

  • upstream:後面的地址隨便指定,但是不能有重複
  • server:指定Tomcat服務器的地址
upstream www.myweb.com { 
     	server  127.0.0.1:9100; 
      	server  127.0.0.1:9200;  
} 

upstream是配置nginx與後端服務器負載均衡非常重要的一個模塊,並且它還能對後端的服務器的健康狀態進行檢查,若後端服務器中的一臺發生故障,則前端的請求不會轉發到該故障的機器

(2)在server模塊裏添加location,並配置proxy_pass

  • proxy_pass:http:// 加上 upstream 後面的字符串(固定結構:proxy_pass http://
location /myweb {
	proxy_pass  http://www.myweb.com;
}

(3)location中添加配置

nginx反向代理配置時,後端的tomcat會出現request.getServerName()取不到代理地址(或域名)的問題,需要在location中添加下面的參數:

location /myweb {
	proxy_pass  http://www.myweb.com;
	proxy_set_header Host $host;  
}

參考:http://www.phpfensi.com/php/20131127/466.html
很詳細:https://blog.csdn.net/t8116189520/article/details/80668651

3. 常用負載均衡策略

實際中,若是服務器配置相同,則可以使用輪詢,若配置不同,簡單一點可以使用最小連接,也可以經過測試後,使用權重。至於Session丟失問題,這裏使用的是通過SpringSession來解決:https://editor.csdn.net/md?articleId=103880228

(1)輪詢(默認)

這裏的輪詢並不是每個請求輪流分配到不同的後端服務器,與ip_hash類似,但是按照訪問url的hash結果來分配請求,使得每個url定向到同一個後端服務器,主要應用於後端服務器爲緩存時的場景下。如果後端服務器down掉,將自動剔除

upstream backserver { 
    	server 127.0.0.1:8080; 
    	server 127.0.0.1:9090; 
} 

(2)權重

每個請求按一定比例分發到不同的後端服務器,weight值越大訪問的比例越大,訪問比率約等於權重之比,權重越大訪問機會越多,用於後端服務器性能不均的情況

upstream backserver { 
    	server 192.168.0.14 weight=5; 
    	server 192.168.0.15 weight=2; 
} 

(3)ip_hash

ip_hash也叫IP綁定,每個請求按訪問ip的hash值分配,這樣每個訪問客戶端會固定訪問一個後端服務器,可以解決會話Session丟失的問題

upstream backserver { 
    	ip_hash; 
    	server 127.0.0.1:8080; 
    	server 127.0.0.1:9090; 
}

(4)最少連接

web請求會被轉發到連接數最少的服務器上

upstream backserver { 
    	least_conn;
    	server 127.0.0.1:8080; 
    	server 127.0.0.1:9090; 
}

4. 其它配置

  • backup:其它所有的非backup機器down的時候,才請求backup機器:

    upstream backserver { 
       	server 127.0.0.1:9100;
    	#其它所有的非backup機器down的時候,才請求backup機器
       	server 127.0.0.1:9200 backup; 
    } 
    
  • down:down表示當前的server是down狀態,不參與負載均衡:

    upstream backserver { 
    	server 127.0.0.1:9100;
    	#down表示當前的server是down狀態,不參與負載均衡
        server 127.0.0.1:9200 down; 
    } 
    

五、靜態代理

把所有靜態資源的訪問改爲訪問nginx,而不是訪問tomcat,這種方式叫靜態代理。因爲nginx更擅長於靜態資源的處理,性能更好,效率更高。所以在實際應用中,我們將靜態資源比如圖片、css、html、js等交給nginx處理,而不是由tomcat處理。

1. 方式一:配置後綴

當訪問靜態資源,則從linux服務器/opt/static目錄下獲取(舉例)

location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
    	root /opt/static;
}

說明:

  • ~:表示正則匹配,也就是說後面的內容可以是正則表達式匹配
  • 第一個點 ‘.’ 表示任意字符
  • *:表示一個或多個字符
  • \.: 是轉義字符,是後面這個點的轉義字符
  • |: 表示或者
  • $:表示結尾

整個配置表示以 '.'後面括號裏面的這些後綴結尾的文件都由nginx處理

注意:放置靜態資源的目錄,要注意一下目錄權限問題,如果權限不足,給目錄賦予權限; 否則會出現403錯誤

2. 方式二:配置目錄

當訪問靜態資源,則從linux服務器/opt/static目錄下獲取(舉例)

location ~ .*/(css|js|img|images) {
	root   /opt/static;
}

整個配置表示路徑中含有這些括號裏面的關鍵字的請求,都由nginx處理

注意:Nginx查找靜態資源位置也是根據ip + port等於root的原則查找圖片,假如網頁請求的圖片地址爲http://192.168.235.128/myweb/image/001.jpg,不管是方式一還是方式二,請求都會交給nginx服務器進行處理。根據ip + port等於root的原則,Nginx會找位置爲/opt/static/myweb/image/001.jpg的圖片

六、動靜分離

Nginx的負載均衡和靜態代理結合在一起,我們可以實現動靜分離,這是實際應用中常見的一種場景。
動態資源,如jsp由tomcat或其他web服務器完成
靜態資源,如圖片、css、js等由nginx服務器完成
它們各司其職,專注於做自己擅長的事情
動靜分離充分利用了它們各自的優勢,從而達到更高效合理的架構

實際中很常見的一種動靜分離的架構:
在這裏插入圖片描述

七、虛擬主機

一個域名只能綁定一臺機器,一個 ip,而虛擬主機,就是把一臺物理服務器劃分成多個“虛擬”的服務器,這樣我們的一臺物理服務器就可以當做多個服務器來使用,從而可以配置多個網站,綁定多個域名。

Nginx提供虛擬主機的功能,就是爲了讓我們不需要安裝多個Nginx,就可以運行多個域名不同的網站。

Nginx下,一個server{}標籤就是一個虛擬主機。nginx的虛擬主機就是通過nginx.conf中server節點指定的,想要設置多個虛擬主機,配置多個server節點即可;

1. 基於端口的虛擬主機(瞭解)

基於端口的虛擬主機配置,使用端口來區分
瀏覽器使用 同一個域名+端口 或 同一個ip地址+端口訪問;

server {
		listen 8080;
  		server_name www.myweb.com;
  		location /myweb {
          	proxy_pass http://www.myweb.com;
  		}
}
server {
  		listen 9090;
  		server_name www.myweb.com;
  		location /p2p {
         		proxy_pass http://www.p2p.com;
  		}
}

2. 基於域名的虛擬主機(掌握)

基於域名的虛擬主機是最常見的一種虛擬主機

server {
	listen       80;
	server_name  www.myweb.com;
	location /myweb {
		proxy_pass  http://www. myweb.com;
	}
}
server {
	listen       80;
	server_name  www.p2p.com;
	location /myweb {
		proxy_pass  http://www.p2p.com;
	}
}

在windows中模擬DNS服務器解析域名:
需要修改一下本地的hosts文件,文件位置:C:\Windows\System32\drivers\etc\hosts
在hosts文件配置(前面是Linux的IP,後面是你自定義的域名):
192.168.208.128 www.myweb.com
192.168.208.128 www.p2p.com

3. include引入單獨的配置文件

可以將多個server{}標籤配置在一個 nginx.conf 文件的 http{} 標籤中,也可以單獨配置在一個文件中,然後通過include的方式引入虛擬主機配置

include /usr/local/nginx/conf/vhost/vhost.conf;

將虛擬目錄的配置文件加入到”http {}”部分的末尾,與其他server並列;

文件是隔開的,配置更清晰,主文件沒有那麼多的server

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章