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

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

本章做爲實戰篇,將從實際的命令行出發,經過安裝,啓動,配置Nginx來逐漸認識和使用Nginx,並可以本身實現一些簡單的反向代理,負載均衡的配置。css

不廢話,直接上乾貨。html

Nginx安裝:

Nginx的安裝仍是比較容易的,有離線安裝,在線安裝多種安裝方式,這裏我只說最簡單的一種,打開咱們的命令行終端,直接輸入yum命令進行安裝java

yum install -y nginx
複製代碼

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

查看Nginx版本:jquery

nginx -v
#在這裏我安裝的是1.16.1版本的nginx
複製代碼

Nginx基本操做:

和咱們以前的docker同樣,nginx也有一些包括服務的啓動,中止,重載等基本操做。linux

啓動nginx:nginx

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

中止nginx:git

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

重啓nginx:github

當咱們修改了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

語法以下:

一、= :用於不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,若是匹配
成功,就中止繼續向下搜索並當即處理該請求。
二、~:用於表示 uri 包含正則表達式,而且區分大小寫。
三、~*:用於表示 uri 包含正則表達式,而且不區分大小寫。
四、^~:用於不含正則表達式的 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行不行

韓數的開發筆記

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

相關文章
相關標籤/搜索