溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行Nginx入門級(jí)知識(shí)點(diǎn)分析

發(fā)布時(shí)間:2021-12-01 15:48:27 來源:億速云 閱讀:122 作者:柒染 欄目:云計(jì)算

如何進(jìn)行Nginx入門級(jí)知識(shí)點(diǎn)分析,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

Nginx入門級(jí)知識(shí)點(diǎn)

提供了Nginx的基本概念及知識(shí)。以開發(fā)者必備的Nginx基礎(chǔ)知識(shí)為主,羅列了一些Nginx教程,希望對(duì)大家有所幫助。

一.環(huán)境

服務(wù)器版本:CentOS 7.2

為了保證學(xué)習(xí)階段不遇到奇怪的事情,請(qǐng)保證以下四點(diǎn)

確認(rèn)系統(tǒng)網(wǎng)絡(luò)

確認(rèn)yum可用

確認(rèn)關(guān)閉iptables

確認(rèn)停用selinux

#查看iptables狀態(tài)
systemctl status firewalld.service
#關(guān)閉防火墻(臨時(shí)關(guān)閉)
systemctl stop firewalld.service
#查看SELinux狀態(tài) 
getenforce#臨時(shí)關(guān)閉SELinux 
setenforce 0

安裝一些系統(tǒng)基本工具,正常情況系統(tǒng)都會(huì)自帶

yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
yum -y install wget httpd-tools vim

二.基本概念

2.1Nginx是什么?

如何進(jìn)行Nginx入門級(jí)知識(shí)點(diǎn)分析 Nginx是一個(gè)高性能的http和反向代理服務(wù)器,其特點(diǎn)是占用內(nèi)存小,并發(fā)能力強(qiáng)。Nginx專為性能優(yōu)化而開發(fā),性能是其最重要的考量,能經(jīng)受高負(fù)載的考驗(yàn),有報(bào)告表明能支持高達(dá)50000個(gè)并發(fā)連接數(shù)。

2.2正向代理與反向代理 如何進(jìn)行Nginx入門級(jí)知識(shí)點(diǎn)分析

為了便于理解,首先先來了解一下一些基礎(chǔ)知識(shí),nginx是一個(gè)高性能的反向代理服務(wù)器那么什么是反向代理呢?

代理是在服務(wù)器和客戶端之間假設(shè)的一層服務(wù)器,代理將接收客戶端的請(qǐng)求并將它轉(zhuǎn)發(fā)給服務(wù)器,然后將服務(wù)端的響應(yīng)轉(zhuǎn)發(fā)給客戶端。

不管是正向代理還是反向代理,實(shí)現(xiàn)的都是上面的功能。

如果你對(duì)OSI 七層模型與 TCP/IP 四層模型不是很熟悉可以再回顧下

正向代理

正向代理(forward)意思是一個(gè)位于客戶端和原始服務(wù)器 (origin server) 之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容,客戶端向代理發(fā)送一個(gè)請(qǐng)求并指定目標(biāo) (原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶端。

正向代理是為我們服務(wù)的,即為客戶端服務(wù)的,客戶端可以根據(jù)正向代理訪問到它本身無法訪問到的服務(wù)器資源。

正向代理對(duì)我們是透明的,對(duì)服務(wù)端是非透明的,即服務(wù)端并不知道自己收到的是來自代理的訪問還是來自真實(shí)客戶端的訪問。

反向代理

反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受 internet 上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給 internet 上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器。

反向代理是為服務(wù)端服務(wù)的,反向代理可以幫助服務(wù)器接收來自客戶端的請(qǐng)求,幫助服務(wù)器做請(qǐng)求轉(zhuǎn)發(fā),負(fù)載均衡等。

反向代理對(duì)服務(wù)端是透明的,對(duì)我們是非透明的,即我們并不知道自己訪問的是代理服務(wù)器,而服務(wù)器知道反向代理在為他服務(wù)。

upstream balanceServer {
    server 10.1.22.33:12345;
    server 10.1.22.34:12345;

    server 10.1.22.35:12345;
}

server { 
    server_name  fe.server.com;
    listen 80;
    location /api {
        proxy_pass http://balanceServer;
  }
}

上面的配置只是指定了 nginx 需要轉(zhuǎn)發(fā)的服務(wù)端列表,并沒有指定分配策略。

默認(rèn)情況下采用的是輪詢策略,將所有客戶端請(qǐng)求輪詢分配給服務(wù)端。這種策略是可以正常工作的,但是如果其中某一臺(tái)服務(wù)器壓力太大,出現(xiàn)延遲,會(huì)影響所有分配在這臺(tái)服務(wù)器下的用戶。

Nginx支持的負(fù)載均衡調(diào)度算法方式如下:

weight輪詢(默認(rèn),常用):接收到的請(qǐng)求按照權(quán)重分配到不同的后端服務(wù)器,即使在使用過程中,某一臺(tái)后端服務(wù)器宕機(jī),Nginx會(huì)自動(dòng)將該服務(wù)器剔除出隊(duì)列,請(qǐng)求受理情況不會(huì)受到任何影響。這種方式下,可以給不同的后端服務(wù)器設(shè)置一個(gè)權(quán)重值(weight),用于調(diào)整不同的服務(wù)器上請(qǐng)求的分配率;權(quán)重?cái)?shù)據(jù)越大,被分配到請(qǐng)求的幾率越大;該權(quán)重值,主要是針對(duì)實(shí)際工作環(huán)境中不同的后端服務(wù)器硬件配置進(jìn)行調(diào)整的。ip_hash(常用):每個(gè)請(qǐng)求按照發(fā)起客戶端的ip的hash結(jié)果進(jìn)行匹配,這樣的算法下一個(gè)固定ip地址的客戶端總會(huì)訪問到同一個(gè)后端服務(wù)器,這也在一定程度上解決了集群部署環(huán)境下session共享的問題。

fair:

智能調(diào)整調(diào)度算法,動(dòng)態(tài)的根據(jù)后端服務(wù)器的請(qǐng)求處理到響應(yīng)的時(shí)間進(jìn)行均衡分配,響應(yīng)時(shí)間短處理效率高的服務(wù)器分配到請(qǐng)求的概率高,響應(yīng)時(shí)間長處理效率低的服務(wù)器分配到的請(qǐng)求少;結(jié)合了前兩者的優(yōu)點(diǎn)的一種調(diào)度算法。但是需要注意的是Nginx默認(rèn)不支持fair算法,如果要使用這種調(diào)度算法,請(qǐng)安裝upstream_fair模塊。url_hash:按照訪問的url的hash結(jié)果分配請(qǐng)求,每個(gè)請(qǐng)求的url會(huì)指向后端固定的某個(gè)服務(wù)器,可以在Nginx作為靜態(tài)服務(wù)器的情況下提高緩存效率。同樣要注意Nginx默認(rèn)不支持這種調(diào)度算法,要使用的話需要安裝Nginx的hash軟件包。

2.4動(dòng)靜分離

為了加快服務(wù)器的解析速度,可以把動(dòng)態(tài)頁面和靜態(tài)頁面交給不同的服務(wù)器來解析,加快解析速度,降低原來單個(gè)服務(wù)器的壓力。

2.5Nginx常用命令

 快速關(guān)閉Nginx,可能不保存相關(guān)信息,并迅速終止web服務(wù)
nginx -s stop
 平穩(wěn)關(guān)閉Nginx,保存相關(guān)信息,有安排的結(jié)束web服務(wù)
nginx -s quit
 因改變了Nginx相關(guān)配置,需要重新加載配置而重載
nginx -s reload
 重新打開日志文件
nginx -s reopen
#為 Nginx 指定一個(gè)配置文件,來代替缺省的
nginx -c filename
#不運(yùn)行,而僅僅測(cè)試配置文件。nginx 將檢查配置文件的語法的正確性,并嘗試打開配置文件中所引用到的文件
nginx -t
#顯示 nginx 的版本
nginx -v
#顯示 nginx 的版本,編譯器版本和配置參數(shù)
nginx -V
 格式換顯示 nginx 配置參數(shù)
2>&1 nginx -V | xargs -n1
2>&1 nginx -V | xargs -n1 | grep lua

三.為什么選擇Nginx?

Nginx是一款自由的、開源的、高性能的HTTP服務(wù)器和反向代理服務(wù)器;同時(shí)也是一個(gè)IMAP、POP3、SMTP代理服務(wù)器;Nginx可以作為一個(gè)HTTP服務(wù)器進(jìn)行網(wǎng)站的發(fā)布處理,另外Nginx可以作為反向代理進(jìn)行負(fù)載均衡的實(shí)現(xiàn)。在Nginx網(wǎng)站上,其功能包括:

HTTP和HTTPS(TLS / SSL / SNI)

超快速的Web服務(wù)器用于靜態(tài)內(nèi)容

FastCGI,WSGI,SCGI用于動(dòng)態(tài)內(nèi)容

具有負(fù)載平衡和緩存功能的加速Web代理

不間斷實(shí)時(shí)二進(jìn)制升級(jí)和配置

壓縮和內(nèi)容過濾器

虛擬主機(jī)

FLV和MP4的媒體流

帶寬和連接策略

全面的訪問控制

自定義日志

嵌入式腳本

帶有TLS的SMTP / IMAP / POP3的郵件代理

邏輯,靈活,可擴(kuò)展的配置

在Linux,F(xiàn)reeBSD,Mac OS X,Solaris和Windows上運(yùn)行 nginx有如下優(yōu)勢(shì):

1. IO多路復(fù)用epoll(IO復(fù)用)

如何理解呢?舉個(gè)例子吧! 有A、B、C三個(gè)老師,他們都遇到一個(gè)難題,要幫助一個(gè)班級(jí)的學(xué)生解決課堂作業(yè)。 老師A采用從第一排開始一個(gè)學(xué)生一個(gè)學(xué)生輪流解答的方式去回答問題,老師A浪費(fèi)了很多時(shí)間,并且有的學(xué)生作業(yè)還沒有完成呢,老師就來了,反反復(fù)復(fù)效率極慢。 老師B是一個(gè)忍者,他發(fā)現(xiàn)老師A的方法行不通,于是他使用了影分身術(shù),分身出好幾個(gè)自己同一時(shí)間去幫好幾個(gè)同學(xué)回答問題,最后還沒回答完,老師B消耗光了能量累倒了。 老師C比較精明,他告訴學(xué)生,誰完成了作業(yè)舉手,有舉手的同學(xué)他才去指導(dǎo)問題,他讓學(xué)生主動(dòng)發(fā)聲,分開了“并發(fā)”。 這個(gè)老師C就是Nginx。

2. 輕量級(jí)

功能模塊少 - Nginx僅保留了HTTP需要的模塊,其他都用插件的方式,后天添加 代碼模塊化 - 更適合二次開發(fā),如阿里巴巴Tengine

3. CPU親和

把CPU核心和Nginx工作進(jìn)程綁定,把每個(gè)worker進(jìn)程固定在一個(gè)CPU上執(zhí)行,減少切換CPU的cache miss,從而提高性能。

四.Nginx的安裝

1.本地安裝

windows系統(tǒng): 直接去官網(wǎng):https://nginx.org/en/download... 下載相應(yīng)版本即可。 mac系統(tǒng):

$ brew install nginx

2.Linux安裝:

以centOS系統(tǒng)為例,有下面兩種安裝方式(推薦1) 1.) 通過rpm鏡像源安裝

$ rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ yum install -y nginx

2.) 通過依賴包詳細(xì)安裝

安裝nginx依賴庫pcre、zlib

$ yum install pcre pcre-devel
$ yum install zlib zlib-devel

如有必要,可以安裝c++編譯環(huán)境和openssl

$ yum install gcc-c++
$ yum install openssl openssl-devel
下載/編譯nginx
$ wget -c https://nginx.org/download/nginx-1.16.0.tar.gz
$ tar -zxvf nginx-1.16.0.tar.gz

編譯安裝

$ cd nginx-1.16.0
$ ./configure  # 默認(rèn)安裝在/usr/local/nginx
$ make && make install

創(chuàng)建軟鏈

$ ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
$ nginx -v

五.Nginx配置

#打開主配置文件,若你是用lnmp環(huán)境安裝
vim /usr/local/nginx/conf/nginx.conf

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

user                    #設(shè)置nginx服務(wù)的系統(tǒng)使用用戶
worker_processes        #工作進(jìn)程數(shù) 一般情況與CPU核數(shù)保持一致
error_log               #nginx的錯(cuò)誤日志
pid                     #nginx啟動(dòng)時(shí)的pid

events {
    worker_connections    #每個(gè)進(jìn)程允許最大連接數(shù)
    use                   #nginx使用的內(nèi)核模型
}

我們使用 nginx 的 http 服務(wù),在配置文件 nginx.conf 中的 http 區(qū)域內(nèi),配置無數(shù)個(gè) server ,每一個(gè) server 對(duì)應(yīng)這一個(gè)虛擬主機(jī)或者域名

http { ... ... #后面再詳細(xì)介紹 http 配置項(xiàng)目

server {
    listen 80                          #監(jiān)聽端口;
    server_name localhost              #地址
    
    location / {                       #訪問首頁路徑
        root /xxx/xxx/index.html       #默認(rèn)目錄
        index index.html index.htm     #默認(rèn)文件
    }        
    
    error_page  500 504   /50x.html    #當(dāng)出現(xiàn)以上狀態(tài)碼時(shí)從新定義到50x.html
    location = /50x.html {             #當(dāng)訪問50x.html時(shí)
        root /xxx/xxx/html             #50x.html 頁面所在位置
    }        
}

server {
    ... ... 
}

} 一個(gè) server 可以出現(xiàn)多個(gè) location ,我們對(duì)不同的訪問路徑進(jìn)行不同情況的配置 我們?cè)賮砜纯?http 的配置詳情

http {
    sendfile  on                  #高效傳輸文件的模式 一定要開啟
    keepalive_timeout   65        #客戶端服務(wù)端請(qǐng)求超時(shí)時(shí)間
    log_format  main   XXX        #定義日志格式 代號(hào)為main
    access_log  /usr/local/access.log  main     #日志保存地址 格式代碼 main
}

下面是 nginx 一些配置中常用的內(nèi)置全局變量,你可以在配置的任何位置使用它們。

六.Nginx實(shí)戰(zhàn)

各種開發(fā)工具的配置結(jié)合實(shí)戰(zhàn)來講述,會(huì)讓人更易理解。

Http 反向代理

我們先實(shí)現(xiàn)一個(gè)小目標(biāo):不考慮復(fù)雜的配置,僅僅是完成一個(gè) http 反向代理。

nginx.conf 配置文件如下:

注:conf/nginx.conf 是 nginx 的默認(rèn)配置文件。你也可以使用 nginx -c 指定你的配置文件 #運(yùn)行用戶 #user somebody;

#啟動(dòng)進(jìn)程,通常設(shè)置成和cpu的數(shù)量相等 worker_processes 1;

#全局錯(cuò)誤日志 error_log D:/Tools/nginx-1.10.1/logs/error.log; error_log D:/Tools/nginx-1.10.1/logs/notice.log notice; error_log D:/Tools/nginx-1.10.1/logs/info.log info;

#PID文件,記錄當(dāng)前啟動(dòng)的nginx的進(jìn)程ID pid D:/Tools/nginx-1.10.1/logs/nginx.pid;

#工作模式及連接數(shù)上限 events { worker_connections 1024; #單個(gè)后臺(tái)worker process進(jìn)程的最大并發(fā)鏈接數(shù) }

#設(shè)定http服務(wù)器,利用它的反向代理功能提供負(fù)載均衡支持 http { #設(shè)定mime類型(郵件支持類型),類型由mime.types文件定義 include D:/Tools/nginx-1.10.1/conf/mime.types; default_type application/octet-stream;

#設(shè)定日志
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    D:/Tools/nginx-1.10.1/logs/access.log main;
rewrite_log     on;

#sendfile 指令指定 nginx 是否調(diào)用 sendfile 函數(shù)(zero copy 方式)來輸出文件,對(duì)于普通應(yīng)用,
#必須設(shè)為 on,如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用,可設(shè)置為 off,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的uptime.
sendfile        on;
#tcp_nopush     on;

#連接超時(shí)時(shí)間
keepalive_timeout  120;
tcp_nodelay        on;

#gzip壓縮開關(guān)
#gzip  on;

#設(shè)定實(shí)際的服務(wù)器列表
upstream zp_server1{
    server 127.0.0.1:8089;
}

#HTTP服務(wù)器
server {
    #監(jiān)聽80端口,80端口是知名端口號(hào),用于HTTP協(xié)議
    listen       80;

    #定義使用www.xx.com訪問
    server_name  www.helloworld.com;

	#首頁
	index index.html

	#指向webapp的目錄
	root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp;

	#編碼格式
	charset utf-8;

	#代理配置參數(shù)
    proxy_connect_timeout 180;
    proxy_send_timeout 180;
    proxy_read_timeout 180;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarder-For $remote_addr;

    #反向代理的路徑(和upstream綁定),location 后面設(shè)置映射的路徑
    location / {
        proxy_pass http://zp_server1;
    }

    #靜態(tài)文件,nginx自己處理
    location ~ ^/(images|javascript|js|css|flash|media|static)/ {
        root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp\views;
        #過期30天,靜態(tài)文件不怎么更新,過期可以設(shè)大一點(diǎn),如果頻繁更新,則可以設(shè)置得小一點(diǎn)。
        expires 30d;
    }

    #設(shè)定查看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;
    }

	#錯(cuò)誤處理頁面(可選擇性配置)
	#error_page   404              /404.html;
	#error_page   500 502 503 504  /50x.html;
    #location = /50x.html {
    #    root   html;
    #}
}

好了,讓我們來試試吧:

啟動(dòng) webapp,注意啟動(dòng)綁定的端口要和 nginx 中的 upstream 設(shè)置的端口保持一致。

更改 host:在 C:\Windows\System32\drivers\etc 目錄下的 host 文件中添加一條 DNS 記錄

127.0.0.1 www.helloworld.com

啟動(dòng)前文中 startup.bat 的命令 在瀏覽器中訪問 http://www.helloworld.com,不出意外,已經(jīng)可以訪問了。

看完上述內(nèi)容,你們掌握 如何進(jìn)行Nginx入門級(jí)知識(shí)點(diǎn)分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI