1. 程式人生 > 程式設計 >寫給後端的Nginx初級入門教程:實戰篇

寫給後端的Nginx初級入門教程:實戰篇

在上一篇的文章寫給後端的Nginx初級入門教程:基礎篇中,我們主要說了Nginx是什麼,能做什麼,以及Nginx最重要的四個基本概念,分別是 正向代理,反向代理,負載均衡,以及動靜分離

本章作為實戰篇,將從實際的命令列出發,通過安裝,啟動,配置Nginx來逐漸認識和使用Nginx,並能夠自己實現一些簡單的反向代理,負載均衡的配置。

不廢話,直接上乾貨。

Nginx安裝:

Nginx的安裝還是比較容易的,有離線安裝,線上安裝多種安裝方式,這裡我只說最簡單的一種,開啟我們的命令列終端,直接輸入yum命令進行安裝

yum install -y nginx
複製程式碼

當終端顯示出Complete!字樣時,則代表我們的Nginx已經安裝成功了。

檢視Nginx版本:

nginx -v
#在這裡我安裝的是1.16.1版本的nginx
複製程式碼

Nginx基本操作:

和我們之前的docker一樣,nginx也有一些包括服務的啟動,停止,過載等基本操作。

啟動nginx:

##在centos7+ 啟動nginx服務
systemctl start nginx.service
#centos6+ 上啟動nginx服務
service nginx start
#或,簡單粗暴一句
nginx
複製程式碼

停止nginx:

##在centos7+ 停止nginx服務
systemctl stop nginx.service
#centos6+ 上停止nginx服務
service nginx stop #粗魯的停止,下班了,不幹了,就算請求來了我也不接了。 nginx -s stop ##優雅的停止,Nginx在退出前完成已經接受的連線請求。 nginx -s quit 複製程式碼

重啟nginx:

當我們修改了nginx的某些配置,為了使配置生效,我們往往需要重啟nginx,同樣的,linux下依然有兩種方式來重啟我們的nginx服務:

##在centos7+ 重啟nginx服務
systemctl restart nginx.service
#centos6+ 上重啟nginx服務
service nginx restart
#使用nginx命令停止,推薦這個
nginx -s reload 複製程式碼

而具體使用nginx原生的nginx -s 操作還是linux提供的systemctl ,這個主要看個人喜好,實際兩者的功能是差不多的,並沒有什麼明顯的不同。

其他命令:

檢視配置檔案是否ok:

#如果配置檔案有問題的話會顯示failed,如果沒得問題的話,會顯示successful
nginx -t
複製程式碼

顯示幫助資訊:

nginx -h 
#或者
nginx -?
複製程式碼

Nginx配置:

nginx本身作為一個完成度非常高的負載均衡框架,和很多成熟的開源框架一樣,大多數功能都可以通過修改配置檔案來完成,使用者只需要簡單修改一下nginx配置檔案,便可以非常輕鬆的實現比如反向代理,負載均衡這些常用的功能,同樣的,和其他開源框架比如tomcat一樣,nginx配置檔案也遵循著相應的格式規範,並不能一頓亂配,在講解如何使用nginx實現反向代理,負載均衡等這些功能的配置前,我們需要先了解一下nginx配置檔案的結構。

既然要了解nginx的配置檔案,那我總得知道nginx配置檔案在哪啊,nginx配置檔案預設都放在nginx安裝路徑下的conf目錄,而主配置檔案nginx.conf自然也在這裡面,我們下面的操作幾乎都是對nginx.conf這個配置檔案進行修改。

可是,我怎麼知道我nginx裝哪了?我要是不知道nginx裝哪了咋辦?

這個,細心的朋友們可能會發現,執行nginx -t命令,下面除了給出nginx配置檔案是否OK外,同時也包括了配置檔案的路徑。諾,就是這個

[root@izuf61d3ovm5vx1kknakwrz ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
複製程式碼

使用vim開啟該配置檔案,我們一探究竟,不同版本的配置檔案可能稍有不同,我的配置檔案內容如下:

# For more information on configuration,see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
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 {
    worker_connections 1024;
}

http {
    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;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/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 {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}

複製程式碼

? ? ?

這一堆都是啥玩意er,完全沒有頭緒啊

沒關係,下面我們就來詳細分析一下nginx.conf這個檔案中的內容。

按照功能劃分,我們通常將nginx配置檔案分為三大塊,全域性塊,events塊,http塊

第一部分:全域性塊

首先映入眼簾的這一堆:

user nginx;
worker_processes auto;
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;
複製程式碼

我們稱之為全域性塊,知識點吶朋友們,要記住,這裡呢,主要會設定一些影響 nginx 伺服器整體執行的配置指令,主要包括配 置執行 Nginx 伺服器的使用者(組)、允許生成的 worker process 數,程式 PID 存放路徑、日誌存放路徑和型別以及配置檔案的引入等。

比如 worker_processes auto; 這一行,worker_processes 值越大,我們nginx可支援的併發數量就越多,很多人想這不就爽了嗎,我設定成正無窮,無限併發flag達成,秒殺問題輕鬆解決,這個,受自己伺服器硬體限制的,不能亂來。

第二部分:events 塊:

events {
    worker_connections 1024;
}
複製程式碼

這一堆,就是我們配置檔案的第二部分,events 塊

起名字這麼隨意的麼,那第三部分是不是叫http塊?

wc,這你都知道,是的

events 塊涉及的指令主要影響 Nginx 伺服器與使用者的網路連線,常用的設定包括是否開啟對多 work process 下的網路連線進行序列化,是否允許同時接收多個網路連線,選取哪種事件驅動模型來處理連線請求,每個 word process 可以同時支援的最大連線數等。

第三部分:http塊:

內容太多,略

http {
    server {
        }
}
複製程式碼

注意:

http是一個大塊,裡面也可以包括很多小塊,比如http全域性塊,server塊等。

http 全域性塊配置的指令包括檔案引入、MIME-TYPE 定義、日誌自定義、連線超時時間、單連結請求數上限等。

而http塊中的server塊則相當於一個虛擬主機,一個http塊可以擁有多個server塊。

server塊又包括全域性server塊,和location塊。

全域性server塊主要包括了本虛擬機器器主機的監聽配置和本虛擬主機的名稱或 IP 配置

location塊則用來對虛擬主機名稱之外的字串進行匹配,對特定的請求進行處理。地址定向、資料緩 存和應答控制等功能,還有許多第三方模組的配置也在這裡進行。比如,對/usr相關的請求交給8080來處理,/admin則較給8081處理。

說了這麼多,我還是不是特別理解咋辦,問題不大,接下來我們通過幾個例項來幫助大家更好的理解這些配置在實際中所發揮的作用。

Nginx配置實戰:

接下來我們將通過對nginx配置檔案的修改來完成反向代理,負載均衡,動靜分離的簡單配置。

nginx配置反向代理:

我發現很多教程說nginx配置反向代理的時候上來就改host檔案,這裡的話,因為上一篇文章我們有總結過反向代理的精髓,也就是:

反向代理伺服器和目標伺服器對外就是一個伺服器,暴露的是代理伺服器地址,隱藏了真實伺服器 IP 地址。

所以接下來我們通過一個小栗子,當我們訪問伺服器的時候,由於我的伺服器沒備案,阿里雲預設80埠沒開,所以這裡我們設定對外服務的埠為8888,當我們訪問8888埠的時候,實際上是跳轉到8080埠的。

首先我們用docker啟動一個tomcat容器,然後配置埠對映為8080。

等等,不會docker怎麼辦?不會docker的話,可以看韓數最新的docker初級入門教程(滑稽)

如果對docker不是很瞭解的話,可以使用傳統的linux下執行tomcat,道理是一樣的。

然後修改我們的配置檔案nginx.conf裡面的server塊,修改之後的內容如下:

    server {
        listen       8888 ; ##設定我們nginx監聽埠為8888
        server_name  [伺服器的ip地址];

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            proxy_pass http://127.0.0.1:8080; ##需要代理的伺服器地址
            index index.html;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

複製程式碼

然後在瀏覽器中輸入:伺服器ip:8888 發現瀏覽器顯示出來了8080埠tomcat的歡迎介面,從而實現了隱藏真實伺服器地址這樣一個反向代理的要求。

哦?看著好神奇哦,那,我之前經常有看到那種,就是各種/image /video 不同的連結對應的是不同的網站,那也是這麼做的咯?

聰明,這裡我們再新建一個tomcat容器,埠為8081,同時把在容器中tomcat webapps目錄新建一個我們自己的目錄,這裡叫hello,裡面新建一個hello.html檔案,內容為

<h1>I am Hello<h1>
複製程式碼

同時我們在埠為8080的tomcat容器中,在webapps新建我們的檔案家hi,並新建hi.html檔案,內容為

<h1>I am Hi<h1>
複製程式碼

啊,這樣的話配置是不是很難啊?

你想多了,敲簡單的。

修改我們配置檔案中的server快,如下:

    server {
        listen       8888 ; ##設定我們nginx監聽埠為8888
        server_name  [伺服器的ip地址];

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location /hi/ {
            proxy_pass http://127.0.0.1:8080; ##需要代理的伺服器地址
            index index.html;
        }
        
        location /hello/ {
            proxy_pass http://127.0.0.1:8081; ##需要代理的伺服器地址
            index index.html;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
複製程式碼

在瀏覽器中輸入:伺服器ip:8888/hi/hi.html

瀏覽器顯示 I am hi 對應伺服器埠為 8080

在瀏覽器中輸入:伺服器ip:8888/hello/hello.html

瀏覽器顯示 I am hello 對應伺服器埠為 8081

從而實現了針對不同url請求分發給不同伺服器的功能配置。

少俠,且慢,你是不是忘了什麼東西,location /hello/ 是什麼意思,只能這麼寫麼?

當然不是。學會location指令匹配路徑,隨便換姿勢

location指令說明:

功能:用於匹配URL

語法如下:

1、= :用於不含正則表示式的 uri 前,要求請求字串與 uri 嚴格匹配,如果匹配
成功,就停止繼續向下搜尋並立即處理該請求。
2、~:用於表示 uri 包含正則表示式,並且區分大小寫。
3、~*:用於表示 uri 包含正則表示式,並且不區分大小寫。
4、^~:用於不含正則表示式的 uri 前,要求 Nginx 伺服器找到標識 uri 和請求字
符串匹配度最高的 location 後,立即使用此 location 處理請求,而不再使用 location 
塊中的正則 uri 和請求字串做匹配。
複製程式碼

注意:

如果 uri 包含正則表示式,則必須要有 ~ 或者 ~* 標識。

到這裡,關於nginx如何簡單的配置一個反向代理伺服器就大功告成了,下面我們來說一下怎麼實現負載均衡的簡單配置。

nginx配置負載均衡:

在nginx中配置負載均衡也是十分容易的,同時還支援了多種負載均衡策略供我們靈活選擇。首先依舊是準備兩個tomcat伺服器,一個埠為8080,一個埠為8081,這裡呢,推薦大家用docker部署,太方便了,什麼,不會docker,可以移步我的面向後端的docker初級入門教程,真的挺好用,省了很多工作量。

臥槽,廣告

然後修改我們的http塊如下:

http {

###此處省略一大堆沒有改的配置


    ##自定義我們的服務列表
    upstream myserver{
       server 127.0.0.1:8080;
       server 127.0.0.1:8090;
     }


   server {
       listen       8888 ; ##設定我們nginx監聽埠為8888
       server_name  [伺服器的ip地址];

       # Load configuration files for the default server block.
       include /etc/nginx/default.d/*.conf;

       location / {
           proxy_pass http://myserver; ##叮,核心配置在這裡
           proxy_connect_timeout 10; #超時時間,單位秒
       }

       error_page 404 /404.html;
           location = /40x.html {
       }

       error_page 500 502 503 504 /50x.html;
           location = /50x.html {
       }
   }

}

複製程式碼

這就完了?當然還沒有,之前就有說過,nginx提供了三種不同的負載均衡策略供我們靈活選擇,分別是:

  • 輪詢(預設方式): 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器 down 掉,能自動剔除。

    用法:啥也不加,上文例項就是預設的方式,就是預設的

  • 權重(weight): weight 代表權重,預設為 1,權重越高被分配的客戶端越多,權重越大,能力越大,責任越大,處理的請求就越多。

    用法:

         upstream myserver{
            server 127.0.0.1:8080 weight =1;
            server 127.0.0.1:8090 weight =2;
          }
    複製程式碼
  • ip_hash:每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決 session 的問題。

    用法:

     upstream myserver{
           ip_hash;#可與weight配合使用
           server 127.0.0.1:8080 weight =1;
           server 127.0.0.1:8090 weight =2;
         }
    複製程式碼

nginx配置動靜分離:

接下來說最後一個例項,動靜分離的簡單配置。

等等,我記得明明是四個,明明還有一個正向代理呢?

這個,愛國守法,人人有責,有需要訪問某些國內不能訪問的網站需求的同學,可以自行下去查閱資料。

至於怎麼配置正向代理,咱也不知道,咱也不敢說,咱也不敢問。

基礎篇回顧:

動靜分離就是把很少會發生修改的諸如影象,視訊,css樣式等靜態資原始檔放置在單獨的伺服器上,而動態請求則由另外一臺伺服器上進行,這樣一來,負責動態請求的伺服器則可以專注在動態請求的處理上,從而提高了我們程式的執行效率,與此同時,我們也可以針對我們的靜態資源伺服器做專屬的優化,增加我們靜態請求的響應速度。

具體的動靜分離配置也不是十分的複雜,和負載均衡,反向代理差不多。

為了演示動靜分離呢,首先我們需要準備兩個資料夾,一個是data資料夾,用來存放我們js,css這些靜態資原始檔,一個是html資料夾,用來存放我們的html檔案。

在html資料夾新建一個html檔案,index.html,內容如下

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>我是一個靜態介面</title>
</head>
<script type="text/javascript" src="jquery.js"></script>
<body>
<h1>我是一個靜態介面</h1>
<div id="test_div"></div>
</body
</html>

複製程式碼

注意,這裡我們並沒有將jquery.js 這個檔案放在html目錄下,而是將它放在了另外一個目錄data裡面,當伺服器接需要請求jquery.js這個檔案時,並不會去index.html所在的那個伺服器去請求這個檔案,而是會直接去我們配置好的伺服器或者路徑去尋找這個js檔案,在本例項中,會去data資料夾下面去找這個jquery.js這個檔案。

修改server的配置如下:

 server {
        listen      8886 ;
        server_name [你的伺服器ip地址];

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

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

         #攔截靜態資源,static裡面存放的我們圖片什麼的靜態資源
        location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|js|css)$ {
        root /data/;
       }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

複製程式碼

測試:

在瀏覽器中輸入ip地址:8888/index.html,螢幕上顯示我是一個靜態介面,同時開啟瀏覽器自帶的開發者工具

會發現jquery.js已經被正常請求到了。

下面開始技術總結:

寫到這裡實戰篇結束了嗎?並沒有,儘管上面給出了負載均衡,反向代理,動靜分離的例項,但仍然只是最基礎的配置,比如多層負載均衡,快取等高階配置,都需要我們在日後的開發生活逐漸的去接觸和了解。下一篇呢,我們將深入nginx腹地,去稍微稍微簡單不細緻大致看一眼那種去了解一下nginx內部是如何保持如此高效率的工作的。

最後,韓數的學習筆記目前已經悉數開源至github,一定要點個star啊啊啊啊啊啊啊

萬水千山總是情,給個star行不行

韓數的開發筆記

歡迎點贊,關注我,有你好果子吃(滑稽)