原文:如何在 Ubuntu 20.04 中安裝和配置 Nginx - 卡拉雲 (kalacloud.com)
前言
Nginx 是全球使用最廣泛的 web servers 之一。它甚至負責托管互聯網上一些超級大流量的網站也不在話下。很多情況下,它比 Apache 占用更少資源,並且可以使用它作為 Web 服務器或反向代理來使用。
在本教程中,我們要學習如何在 Ubuntu 20.04 中安裝和配置 Nginx。
准備工作
要根據本教程學習,首先我們要有一台安裝好 Ubuntu 20.04 的服務器:
- 有 sudo 的 root 用戶權限,大家可根據《Ubuntu 120.04初始服務器設置》(撰寫中,稍后上線)指南來配置自己的服務器。
第 1 步:安裝 Nginx
由於 Nginx 可以從 ubuntu 軟件源中獲得,因此我們可以使用 apt 來安裝 Nginx。
我們可以使用以下命令安裝 Nginx 到 Ubuntu 中。
sudo apt update sudo apt install nginx
選擇 Y 來開始安裝,apt 會幫你把 Nginx 和它所必備的依賴安裝到我們的服務器中。
第 2 步:調整防火牆
在測試 Nginx 之前,我們需要調整防火牆,讓他允許 Nginx 服務通過。Nginx ufw
在安裝時會把他自身注冊成為服務。
sudo ufw app list
輸出結果:
kalacloud@chuan-server:~$ sudo ufw app list Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH
你可以看到 Nginx 提供了三個配置文件:
-
Nginx Full
開端口80 正常,未加密的網絡流量
端口443 TLS / SSL加密的流量
-
Nginx HTTP
僅打開端口80 正常,未加密
-
Nginx HTTPS
僅打開端口443 TLS / SSL加密
我們使用 Nginx HTTP 來做本教程演示。
sudo ufw allow 'Nginx HTTP'
我們用以下命令來查看更改結果
sudo ufw status
我們可以在輸出結果中看到
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)
第3步:檢查我們的 Web 服務器
在安裝結束后,Ubuntu 會啟動 Nginx 。 Web 服務器應該已經在運行了。
我們可以通過 systemd
來檢查 init 系統狀態,確保它正在運行:
systemctl status nginx
kalacloud@chuan-server:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset:> Active: active (running) since Wed 2020-07-29 07:21:53 UTC; 23min ago Docs: man:nginx(8) Main PID: 3340 (nginx) Tasks: 2 (limit: 2248) Memory: 4.3M CGroup: /system.slice/nginx.service ├─3340 nginx: master process /usr/sbin/nginx -g daemon on; master_> └─3341 nginx: worker process Jul 29 07:21:52 chuan-server systemd[1]: Starting A high performance web server> Jul 29 07:21:53 chuan-server systemd[1]: Started A high performance web server > lines 1-13/13 (END)
如上所示,這個服務已經成功啟動。接下來我們要直接來測試 Nginx 是否可以通過瀏覽器訪問。
首先我們執行以下命令:
ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
這可以讓我們在瀏覽器中查看他們是否正常工作。
接着我們要找到服務器在公網上的ip,我們可以使用這個命令
curl -4 icanhazip.com
獲得服務器ip后,我們可以在瀏覽器輸入這個 ip 。當然除了公網,我們也可以輸入主機的內網 ip 通過局域網來訪問。
http://your_server_ip
打開瀏覽器輸入ip 就能看到 Nginx 的默認頁面。這也說明服務器運行起來了。
這里推薦一下可與 Nginx 搭配使用的卡拉雲。卡拉雲是一套低代碼開發工具,可接入常見的數據庫(MySQL、MongoDB等)及 RESTful API, 你無需懂會任何前端技術,只要會寫 SQL,就可以快速搭建屬於你自己的數據庫管理工具。>> 深入了解卡拉雲 <<
第 4 步:管理 Nginx
現在,您已啟動並運行了Web服務器,讓我們回顧一些基本的管理命令。
上一步,我們已經啟動起來 Web 服務器了。接下來,讓我們來學習一下 Nginx 的基本命令。
要停止Web服務器,輸入:
sudo systemctl stop nginx
要在停止時,啟動Web服務器,鍵入:
sudo systemctl start nginx
要停止,然后再次啟動該服務,鍵入:
sudo systemctl restart nginx
如果我們只是修改配置,Nginx 可以在不終端的情況下熱加載。我們可以鍵入:
sudo systemctl reload nginx
默認情況下,Nginx 會在服務器啟動時,跟隨系統啟動,如果我們不想這樣,我們可以用這個命令來禁止:
sudo systemctl disable nginx
要重新讓系統啟動時引導 Nginx 啟動,那么我們可以輸入:
sudo systemctl enable nginx
- nginx重啟報錯:nginx: [error] invalid PID number "" in "/run/nginx.pid"
- 問題描述:執行 nginx -t 是OK的,然而在執行 nginx -s reload 的時候報錯
nginx: [error] invalid PID number “” in “/run/nginx.pid”
- 解決辦法
需要先執行
nginx -c /etc/nginx/nginx.conf
nginx.conf文件的路徑可以從nginx -t的返回中找到。
nginx -s reload
第5步:設置服務器塊(Server block)
使用Nginx Web服務器時,服務器塊(類似於Apache中的虛擬主機)可用於封裝配置詳細信息,並在一台服務器中托管多個域。我們將建立一個名為 example.com 的域,但我們可以用自己的域名替換它。
在 Ubuntu 上的 Nginx 默認情況下啟用了一個服務器塊(server block),服務器塊的配置是為給服務器的目錄提供地址 /var/www/html
。盡管這對於單個站點非常有效,但是如果我們在服務器上托管多個站點,則可能變很臃腫。讓我們給/var/www/html
目錄添加上分站點目錄。
比如我們的網站是 example.com ,那我們創建一個對應的目錄 example.com 目錄:
sudo mkdir -p /var/www/example.com/html
接下來,使用$USER
環境變量分配目錄的所有權:
sudo chown -R $USER:$USER /var/www/example.com/html
如果我們沒有修改自己的umask
值,那么 Web 根目錄的權限應該正確,我們可以通過輸入以下命令來確認:
sudo chmod -R 755 /var/www/example.com
接下來,讓我們來編輯index.html
可以使用 nano 編輯器或其他你用這順手的編輯器:
nano /var/www/example.com/html/index.html
在其中,添加以下示例HTML:
/var/www/example.com/html/index.html
<html> <head> <title>Welcome to Example.com!</title> </head> <body> <h1>Success! The example.com server block is working!</h1> </body> </html>
完成后保存並關閉文件。
接下來我們為 Nginx 來創建一個服務器塊。與直接修改默認配置文件不同,我們在以下位置創建一個新文件:/etc/nginx/sites-available/example.com
sudo nano /etc/nginx/sites-available/example.com
粘貼到以下內容添加到文件中,這個塊的配置與默認塊的配置相似,但針對我們的新目錄和域名進行了更新:
/etc/nginx/sites-available/example.com
server {
listen 80;
listen [::]:80;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}
接下來,讓我們通過在sites-enabled
目錄新建一個鏈接,好讓 Nginx 在啟動過程中會讀取這個目錄:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
現在已啟用並配置了兩個服務器塊,以及基於它們的listen
和server_name
指令響應請求:
example.com
: 將會響應example.com
和www.example.com
的請求default
: 將會響應 80 端口的請求,以及不能匹配到兩個服務器塊上的請求
為避免可能由於添加其他服務器名稱而引起的哈希存儲區內存問題,有必要調整/etc/nginx/nginx.conf
文件中的單個值。
打開文件:
sudo nano /etc/nginx/nginx.conf
找到server_names_hash_bucket_size
指令並刪除#
符號:
... http { ... server_names_hash_bucket_size 64; ... } ...
完成后保存並關閉文件。
接下來,測試以確保我們在 Nginx 文件中的改動,沒有任何問題:
sudo nginx -t
如果沒有任何問題,請重新啟動 Nginx:
sudo systemctl restart nginx
Nginx 現在已經可以按照剛剛我們配置的方式來工作啦。當用戶通過http://example.com
域名訪問我們的服務器時,Nginx 會將它指向我們剛剛創建的 Html 頁面。
第 6 步 學習 Nginx 文件及目錄結構
到這一步,我們已經學會了如何在 Ubuntu 上安裝和配置 Nginx 服務。接下來,我們來學習 Nginx 的文件及目錄結構。
內容
-
/var/www/html
默認的 Web 頁面。默認打開可以看到 Nginx 頁面。 -
/var/www/html
實際的 Web 內容。默認請看下只有 Nginx 自己的原生頁面。我們可以通過更改 Nginx 配置來更改文件。
服務器配置
-
/etc/nginx
Nginx 配置目錄。所有 Nginx 的配置文件都在這里。 -
/etc/nginx/nginx.conf
Nginx 的配置文件。大多數全局配置可以通過這個文件來修改。 -
/etc/nginx/sites-available/sites-enabled
用來存儲服務器下每個站點服務器塊的目錄。 默認情況下 Nginx 不會直接使用目錄下的配置文件,需要我們更改配置來告訴 Nginx 來去讀。 -
/etc/nginx/sites-enabled/sites-available
這里是存儲已經啟用站點服務器塊的目錄。 -
/etc/nginx/snippets
這個目錄包含一些 Nginx 的配置文件。可打開詳細查看這些配置文件到文檔進行學習。
服務器日志
/var/log/nginx/access.log
這里是 Nginx 到日志文件,對 Web 服務器的每個請求都會記錄在這個日志中。/var/log/nginx/error.log
記錄 Nginx 運行過程中發生的錯誤日志。