最近在搭建一個網站,就不可避免地要用到 Nginx,索性就出一期 Nginx 的入門教程,希望也可以幫助到大家~😁
作爲開發者,相信大家都知道 Nginx 的重要性。Nginx 是一個高性能的 HTTP 和反向代理 Web 服務器,由俄羅斯的伊戈爾·賽索耶夫開發,第一個版本發佈於 2004 年 10 月 4 日。
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 程序員。