某俄羅斯小哥,竟靠一個服務器軟件直接封神?

最近在搭建一個網站,就不可避免地要用到 Nginx,索性就出一期 Nginx 的入門教程,希望也可以幫助到大家~😁

作爲開發者,相信大家都知道 Nginx 的重要性。Nginx 是一個高性能的 HTTP 和反向代理 Web 服務器,由俄羅斯的伊戈爾·賽索耶夫開發,第一個版本發佈於 2004 年 10 月 4 日。

YYDS
YYDS

Nginx 的特點是:

  • 內存佔用少
  • 併發能力強(可支持大約 50000 個併發連接)
  • 配置超簡潔
  • bug 非常少
  • 安裝超簡單
  • 服務特別穩(幾個月也不需要重啓)

基於這些特點,越來越多的網站開始使用 Nginx。於是,掌握 Nginx 就變成了開發者的一項必不可少的技能。

這篇已經收錄到《Java 程序員進階之路》專欄的「Nginx」篇,喜歡這個專欄的小夥伴可以去點個 star 關注下了。衝個 1000 star!

https://github.com/itwanger/toBeBetterJavaer

一、Nginx 的作用

反向代理是 Nginx 作爲 Web 服務器最常用的功能之一。什麼是反向代理呢?很多初學者在第一次遇到這個名詞的時候總免不了出現很多問號。

那要想搞明白什麼是反向代理,就必須得搞明白什麼是正向代理。

舉個例子,小二的瀏覽器是無法直接訪問谷哥的,但香港的代理服務器是可以訪問谷哥的,於是小二訪問了香港的代理服務器,也就間接地訪問了谷哥。那這臺代理服務器也就是正向代理

總結一句就是,正向代理是代理客戶端的,讓你能正常訪問目的服務器。

與之相反,反向代理是代理服務器的,讓大量的請求均衡地訪問到某一臺服務器上。

舉個例子,10 萬個小二同時在訪問 itwanger.com, 如果只有一臺服務器的話,很容易就癱瘓了,於是高併發的情況下會有很多臺服務器(假如 10 臺吧)來接這個活,那怎麼讓 10 萬個小二訪問到這 10 臺服務器呢?

這就需要一個反向代理服務器了,反向代理服務器讓 1 萬個小二訪問服務器 A,1 萬個小二訪問服務器 B,1 個小二訪問服務器 C,這樣的話,每臺服務器的壓力就相應減小了,是不是很 nice?

那問題來了。每臺服務器的能力可能不同,比如說服務器 A 的內存比較大一點,有 100 個 G;服務器 B 的內存小一點,有 10 個 G;服務器 C 的內存更小一點,只有 1 個 G。怎麼才能讓沒臺服務器承擔起它能力範圍內的訪問呢?

Nginx 內置了輪詢和加權輪詢來達到負載均衡的目的。服務器 A 牛逼就把它的權重加大一點,讓 5 萬個小二訪問它;服務器 B 弱一點,權重就再小一點,讓 2 萬個小二訪問它;服務器 C 更弱,權重就最小,讓 1 萬個小二訪問它。

除此之外,Nginx 還有一個很牛逼的功能是動靜分離

在我們的軟件開發中,有些請求是需要後臺處理的;有些請求是不需要後臺處理的,比如說 css、js 這些文件請求,這些不需要經過後臺處理的文件就叫靜態文件。

我們可以根據一些規則,把動態資源和靜態資源分開,然後通過 Nginx 把請求分開,靜態資源的請求就不需要經過 Web 服務器處理了,從而提高整體上的資源的響應速度。

二、Nginx 的安裝

針對不同的操作系統,Nginx 的安裝各不相同。Windows 可以直接到官網下載 zip 綠色安裝包,解壓後就可以了。

http://nginx.org/en/download.html

之前帶大家白票過阿里雲的服務器,有 Linux 服務器的話,直接通過寶塔面板這個神器就可以安裝了。

不過,如果在安裝寶塔面板必備工具包的時候,如果選擇了 phpmyadmin(MySQL 的管理工具),會覆蓋掉 80 端口,就導致沒辦法直接通過默認配置的方式訪問 Nginx 啓動頁面了。

我這裏以 macOS 環境爲例,來演示一下。

第一步,通過 brew info nginx 命令查看 Nginx 是否安裝。

第二步,通過 brew install nginx 命令安裝 Nginx。

從以上信息可以得出:

  • 根目錄是 /usr/local/var/www
  • 配置文件是 /usr/local/etc/nginx/nginx.conf
  • 默認端口是 8080

第三步,通過 nginx 命令啓動 Nginx。

第四步,在瀏覽器地址欄通過 localhost:8080 訪問,可以看到以下歡迎頁面。

三、Nginx 常用命令

通常來說,Nginx 一旦啓動後,我們是很少讓它退出的,使用最多的就是 reload 命令。當我們修改了配置文件,是需要執行一次 reload 命令讓 Nginx 生效的。

nginx  啓動
nginx -s stop  停止
nginx -s quit  安全退出
nginx -s reload  重新加載配置文件
ps aux|grep nginx  查看nginx進程

要知道,Nginx 的 reload 對用戶是無感的,這一點我覺得很牛逼~

四、Nginx 的配置

我們先來看一下 Nginx 的配置結構圖:

main        # 全局配置
├── events  # 配置網絡連接
├── http    # 配置代理、緩存、日誌等
│   ├── upstream # 配置負載均衡
│   ├── server   # 配置虛擬主機,可以有多個 server
│   ├── server
│   │   ├── location  # 用於匹配 URI(URL 是 URI 的一種),可以有多個 location
│   │   ├── location
│   │   └── ...
│   └── ...
└── ...

再把 Nginx 的默認配置拉出來看一下,我把註釋加了進去,這樣大家很容易就明白這行配置是用來幹嘛的了。

worker_processes  1# Nginx 進程數,一般設置爲和 CPU 核數一樣

events {
    worker_connections  1024# 每個進程允許最大併發數
}

http {
    include       mime.types; # 文件擴展名與類型映射表
    default_type  application/octet-stream;

    sendfile        on# 開啓高效傳輸模式
    keepalive_timeout  65# 保持連接的時間,也叫超時時間,單位秒

    server {
        listen       8080# 配置監聽的端口
        server_name  localhost; # 配置的域名

        location / {
            root   html; # 網站根目錄
            index  index.html index.htm; # 默認首頁文件
        }

        error_page   500 502 503 504  /50x.html; # 默認50x對應的訪問頁面
        location = /50x.html {
            root   html;
        }
    }

    include servers/*; # 加載子配置項
}

好,現在我們登錄寶塔面板,嘗試把默認的 server 配置複製到 Linux 服務器中的 Nginx 配置裏。

簡單解釋一下。

由於我的服務器上 80 端口是默認打開的,所以我將監聽端口配置成了 80,如果你配置成其他端口的話,記得寶塔面板和雲服務的安全組裏把端口打開。

root 我指定了 /home/www 目錄,首頁文件爲 index.html。這個文件是我自定義的,來看一下內容。

<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>沉默王二</title>
  <body>
    <img src="niubi.jpeg" />
  </body>
</html>

很言簡意賅,總之就是二哥,牛逼~

好,保存配置文件,並且 reload Nginx,我們在本地的瀏覽器中輸入服務器的 IP 地址就可以看到效果了。

五、Nginx 的學習資料

關於 Nginx 的負載均衡,還有動靜分離,等到二哥的網站跑起來後,可以專門搞個視頻給大家演示下,比較直觀一點。Nginx 的入門非常簡單,但有一說一,如果想要在工作中用好 Nginx,還是需要花費一番功夫的。

我這裏再給大家推薦一些不錯的學習資料吧。

1)狂神X的視頻入門教程,我個人覺得,狂神的入門教程還是非常舒適的,語速和內容都剛剛好。

https://www.bilibili.com/video/BV1F5411J7vK

2)黑X程序員Nginx教程,總共 159 講,基本上算是非常全面的 Nginx 的視頻教程了。

https://www.bilibili.com/video/BV1ov41187bq

3)極客xx上的 Nginx100 講,講的比較深一點,涉及到不少原理層面的東西。錢包比較鼓的話,可以去付費下。不過,聽說在某個地方也可以白票。

4)Nginx 從入門到實踐,萬字詳解,圖文版的,可以到x金上看看這篇文章,內容基本上面面俱到了(可以看一下下面的目錄),配合前面的視頻課,拿下 Nginx 基本上是穩了。

https://juejin.cn/post/6844904144235413512

這些資料如果能全部過一遍的話,我要喊你 Nginx 小王子了,估計公司遇到 Nginx 問題的話,你肯定是解決問題的那一個。


本篇已收錄至 GitHub 上開源專欄《Java 程序員進階之路》,最近更新了不少乾貨上去,所以沒點 star 的小夥伴趕緊去點一波了,畢竟 star 了這個倉庫就等於成爲了一名更優秀的 Java 程序員。

https://github.com/itwanger/toBeBetterJavaer

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