配置 nginx 遇到錯誤排查(初級)
系統版本:ubuntu 14.04,nginx 版本:nginx/1.4.6 (Ubuntu)
本文不是一步步搭建 nginx 的過程,而是我在使用 nginx 的過程中,整理自己遇到的的一些問題。適用於:nginx 遇到問題,排查問題的 checklist
一、安裝
sudo apt-get update
sudo apt-get install nginx
注意:用 root 身份安裝 nginx
二、常用命令
請在執行下面命令時,確保權限正確,統一在命令前加入:sudo
,使用 root 權限操作 nginx。
- 查看 nginx 版本:
nginx -v
- 檢查配置語法是否正確:
service nginx configtest
- 重啟:
service nginx restart
- 停止:
service nginx stop
- 查看狀態:
service nginx status
如遇到,啟動失敗的情況,請查看 nginx 錯誤日志,日志位於:/var/log/nginx/error.log
三、nginx 正則表達式匹配
location 支持的正則規則,注意:使用正則需要謹慎,確定正則的正確性。
容易出現:因為錯誤的正則,導致 NOT FOUND:The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.
3.1 正則表達式匹配
符號 | 含義 |
---|---|
~ | 區分大小寫匹配 |
~* | 不區分大小寫匹配 |
!和!* | 分別為區分大小寫不匹配及不區分大小寫不匹配 |
^ | 以什么開頭的匹配 |
^~ | 表示已某常規字符串開頭,不是正則表達式 |
$ | 以什么結尾的匹配 |
/ | 表示通用匹配 |
\ | 轉義字符。可以轉. * ?等 |
* | 代表任意字符 |
= | 表示精確匹配,如location = / ,表示只有域名的情況 |
3.2 例子
location = /
:匹配任何查詢,因為所有請求都已 / 開頭。但是正則表達式規則和長的塊規則將被優先和查詢匹配location ^~ /images/
:匹配任何已/images/開頭的任何查詢並且停止搜索。任何正則表達式將不會被測試。location ~* .(gif|jpg|jpeg)$
:匹配任何已.gif、.jpg 或 .jpeg 結尾的請求
四、必知參數
4.1 root
默認訪問請求文件的所在目錄。例如訪問:http://hellogithub.com/img/hello-github.jpg
,nginx 中配置如下:
location /img/ {
root /該圖片所在的絕對路徑;
}
該請求就會到 root
指定路徑去尋找 /img/hello-github.jpg
文件,返回請求。
注意:指定目錄的權限
4.2 user
user root;
worker_processes 4;
pid /run/nginx.pid;
user
參數,代表 worker 屬於那個用戶身份,這個身份牽扯到可以訪問那些目錄。正如上面的 root
參數指定的路徑,如果 worker 沒有訪問該目錄的權限,那么就會返回 403 Forbidden
錯誤。
4.3 server、server_name、listen
server {
listen 80;
server_name hellogithub.com;
...
}
server
是配置虛擬主機(Virtual Hostingserver_name
是對應的虛擬主機的域名(domain)listen
是該虛擬主機監聽的端口
虛擬主機配置實現了,如何一台計算機實現服務多個域名。
注意:在配置 listen
參數時,確保該端口為打開狀態、沒有其它進程占用。
4.4 關系
server {
listen 80;
...
server_name hellogithub.com www.hellogithub.com;
access_log /path/access.log;
error_log /path/hellogithub/error.log;
location / {
...
proxy_pass http://0.0.0.0:4000;
}
}
access_log
:虛擬主機的訪問日志error_log
:虛擬主機的錯誤日志
請求到了目標服務器,Nginx 接受請求,根據 nginx.conf
中的配置的虛擬主機。找到到具體的虛擬主機配置的規則,然后根據虛擬主機的 location
規則,匹配請求的 path 。最后,返回結果(靜態資源)或者通過 proxy_pass
參數,反向代理到本機上的處理服務,然后把處理后的結果再通過 nginx 返回結果。
注意:proxy_pass
參數配置的地址末尾不要帶 /
。例如上面的例子,就不要寫成:http://0.0.0.0:4000/
否則會出現:proxy_pass cannot have URI part in location given by regular expression...
,錯誤提示。
4.5 include
http {
...
##
# Virtual Host Configs
##
include conf.d/*.conf;
}
意思:引入 conf.d
目錄下后綴為 conf
的文件。該目錄下存放不同的虛擬主機的相關配置。
目的:為了方便以后的修改配置,使用 include
參數。把不同的虛擬主機的配置放在單獨的文件中,達到相互獨立,減少出錯的可能。
五、問題排查步驟
- 修改完
nginx.conf
文件后,執行sudo service nginx configtest
,檢查語法錯誤。無誤后再重啟 nginx。 - 如果語法出現的錯誤,查看
sudo vi /var/log/nginx/error.log
錯誤日志分析問題,根據異常信息,搜索問題的解決辦法。 - 語法正確也不一定可以正常啟動 nginx(端口被占用),如果啟動失敗。查看
sudo vi /var/log/nginx/error.log
錯誤日志分析問題。 - nginx 正常啟動了,訪問地址出現:
無法訪問此網站
(ERR_NAME_NOT_RESOLVED):檢查服務的 80 或 443 端口是否打開。NOT FOUND
:檢查location
是否匹配到了請求的 path。403 Forbidden
:檢查root
的文件權限和user
身份的權限。
六、總結
排查問題的關鍵,是需要清楚整個流程都經歷的那些步驟,逐一進行排查,取保每一步的正確。中間最關鍵的信息就是 日志中的錯誤說明。
就像排查 nginx,可以通過日志,定位到問題是在那一步出錯了。如果日志中沒有這一次訪問的記錄,那就需要查看端口是否開放、域名解析是否正確。
- 首先,清楚整個流程
- 然后,根據有限的信息,定位問題
- 最后,分析問題,整理問題的關鍵字,求教 Google
至此就是我在配置 nginx 遇到的問題和總結的經驗,這些折騰了我半天。所以,記錄、整理這些東西希望自己以后遇到這個問題有‘套路’,不至於浪費時間,同樣分享給大家,希望能幫到更多的人😁。
PS:在我搜索相關資料的時候,我發現如何配置環境的資料,一般都是雲服務商(linode、digitalocean)寫的最好、最詳細、最全。所以,遇到這類問題,可以多去看看他們的幫助文檔。