1. 安裝Nginx
使用 docker pull nginx
下載最新的 Nginx Docker 鏡像。
下載完畢后,使用 docker run -d -p 80:80 --name nginx nginx
,即可啟動 Nginx 容器同诫。其中咙俩,-p 80:80
表示將容器的 80 端口映射到 主機的 80 端口向胡;--name nginx
表示將容器命名為“nginx”矾湃。
這時候,訪問主機 ip堕澄,可以看到 Nginx 的歡迎頁邀跃,說明已經(jīng)運行成功。
2. Nginx 配置
Nginx 的默認配置文件是 /etc/nginx/nginx.conf
蛙紫。
使用 docker exec -it nginx /bin/sh
命令拍屑,進入 nginx 容器的命令行,然后進入 /etc/nginx
目錄坑傅,查看 nginx.conf
文件僵驰。
以下是該文件內(nèi)容及注釋:
# 設(shè)置運行 nginx 的用戶為 nginx 用戶
user nginx;
# 根據(jù)系統(tǒng)資源情況自動設(shè)置 worker 進程數(shù)量
worker_processes auto;
# 指定錯誤日志的位置和日志級別為 notice
error_log /var/log/nginx/error.log notice;
# 指定 nginx 的主進程 ID 存儲位置
pid /var/run/nginx.pid;
# events 塊定義了事件模型和連接數(shù)配置
events {
# 每個 worker 進程的最大連接數(shù)
worker_connections 1024;
}
# http 塊是 nginx 配置的主要部分,包含了 http 相關(guān)的配置
http {
# 引入 mime.types 文件唁毒,該文件定義了 MIME 類型映射
include /etc/nginx/mime.types;
# 設(shè)置默認 MIME 類型為 application/octet-stream
default_type application/octet-stream;
# 設(shè)置日志格式 main蒜茴,記錄客戶端訪問日志
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 功能,提高文件傳輸性能
sendfile on;
# 如果客戶端連接非辰鳎快速粉私,則可能啟用 tcp_nopush,否則請注釋掉此行
# tcp_nopush on;
# 客戶端與服務(wù)器之間的連接保持時間近零,超過這個時間將會自動關(guān)閉連接
keepalive_timeout 65;
# 如果需要開啟 gzip 壓縮功能诺核,可以去掉此行的注釋
#gzip on;
# 引入 /etc/nginx/conf.d/ 目錄下的所有 .conf 配置文件
include /etc/nginx/conf.d/*.conf;
}
根據(jù)上述配置,可以在 /etc/nginx/conf.d
文件夾下久信,找到所有的 nginx 配置文件窖杀。默認情況下,該文件夾中只有一個 default.conf
文件裙士,查看之:
# cat default.conf
# 定義一個HTTP服務(wù)器塊入客,監(jiān)聽80端口,并且同時監(jiān)聽IPv4和IPv6地址的80端口
server {
listen 80;
listen [::]:80;
# 服務(wù)器名為localhost潮售,即請求的域名為localhost時痊项,會使用該server塊的配置
server_name localhost;
# 注釋掉以下access_log配置,表示不記錄訪問日志
#access_log /var/log/nginx/host.access.log main;
# 配置根目錄和默認的索引文件
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# 注釋掉以下error_page配置酥诽,表示不自定義錯誤頁
#error_page 404 /404.html;
# 配置5xx錯誤碼的錯誤頁
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# 注釋掉以下配置鞍泉,表示不使用代理將PHP腳本傳遞給Apache服務(wù)器
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# 配置FastCGI服務(wù)器,將PHP腳本傳遞給監(jiān)聽在127.0.0.1:9000的FastCGI服務(wù)器
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# 注釋掉以下配置肮帐,表示禁止訪問.htaccess文件
#
#location ~ /\.ht {
# deny all;
#}
}
可以看到咖驮,這里配置了 http 的監(jiān)聽端口边器,和一些跳轉(zhuǎn)規(guī)則。
2.1 http 塊配置
Nginx 的配置分為多個塊托修,其中 http 塊是其中的主要部分忘巧,包含了 http 的相關(guān)配置。
http 塊主要可以設(shè)置以下參數(shù):
- include:可以引入其他配置文件睦刃。例如砚嘴,
include /etc/nginx/mime.types;
表示引入了/etc/nginx/mime.types
文件,其中包含了支持的文件類型涩拙。 - default_type: 指定默認的Content-Type际长,當請求的資源沒有明確指定Content-Type時,將使用該默認類型兴泥。
- log_format: 定義日志格式工育,可以自定義日志輸出的格式,可以使用預定義的變量來包含特定信息搓彻,例如
$remote_addr
表示客戶端IP地址如绸,$request
表示請求內(nèi)容,等等旭贬。 - access_log: 配置訪問日志的路徑和格式怔接。可以指定日志輸出到文件骑篙,也可以將日志重定向到標準輸出流蜕提。
- error_log: 配置錯誤日志的路徑和日志級別“卸耍可以指定日志輸出到文件谎势,也可以將日志重定向到標準錯誤流。
- sendfile: 是否開啟sendfile指令杨名。當該指令開啟時脏榆,nginx會嘗試使用sendfile系統(tǒng)調(diào)用來直接傳輸文件,提高文件傳輸效率台谍。
- tcp_nopush: 開啟后须喂,允許發(fā)送TCP_NODELAY選項來減少網(wǎng)絡(luò)傳輸延遲。
- keepalive_timeout: 配置HTTP keep-alive連接的超時時間趁蕊。如果一個客戶端在這個時間內(nèi)沒有發(fā)送新的請求坞生,連接將被關(guān)閉。
- gzip: 配置gzip壓縮掷伙。開啟后是己,nginx會對響應的內(nèi)容進行g(shù)zip壓縮,減少傳輸數(shù)據(jù)量任柜,提高性能卒废。
- server: 用于配置一個虛擬主機(Server Block)沛厨,包含了服務(wù)器的監(jiān)聽端口、域名摔认、請求處理等配置逆皮。一個http塊可以包含多個server塊,用于配置多個虛擬主機参袱。
- location: 用于配置請求處理的規(guī)則电谣。location塊可以根據(jù)URL路徑或正則表達式來匹配請求,并指定相應的處理邏輯抹蚀,例如反向代理辰企、重定向、文件處理等况鸣。
- upstream: 配置代理服務(wù)器的集群。upstream指令用于定義一組后端服務(wù)器竹观,并可以指定負載均衡算法來分配請求镐捧。
2.2 http - server 塊配置
在 Nginx 的 http 配置中,可以包含多個 server 配置臭增。如下:
http {
# server塊1
server {
# 該server塊的配置
}
# server塊2
server {
# 該server塊的配置
}
}
其中懂酱,server 塊的主要參數(shù)包含:
- listen: 配置服務(wù)器監(jiān)聽的端口號和IP地址√芘祝可以通過listen指令指定多個端口號和IP地址列牺,比如listen 80;表示監(jiān)聽80端口,默認監(jiān)聽所有可用IP地址拗窃。
- server_name: 配置服務(wù)器的域名或IP地址瞎领。可以配置多個域名随夸,用空格隔開九默。當請求的Host頭部與server_name中的某個域名匹配時,該server塊將會處理該請求宾毒。
- add_header: 用于設(shè)置響應頭信息驼修。
- location: 用于配置請求處理的規(guī)則。location塊可以根據(jù)URL路徑或正則表達式來匹配請求诈铛,并指定相應的處理邏輯乙各,例如反向代理、重定向幢竹、文件處理等耳峦。
- access_log和error_log: 配置訪問日志和錯誤日志的路徑和格式。
- try_files: 配置文件搜索順序妨退。當請求的文件不存在時妇萄,可以通過try_files指令指定多個備用文件蜕企,服務(wù)器會按照指定的順序查找并返回第一個存在的文件。
- gzip: 配置gzip壓縮冠句。開啟后轻掩,nginx會對響應的內(nèi)容進行g(shù)zip壓縮,減少傳輸數(shù)據(jù)量懦底,提高性能唇牧。
例如,上述提到過的 default.conf
文件聚唐,主要內(nèi)容如下:
# 定義一個HTTP服務(wù)器塊丐重,監(jiān)聽80端口,并且同時監(jiān)聽IPv4和IPv6地址的80端口
server {
listen 80;
listen [::]:80;
server_name localhost;
# 注釋掉以下access_log配置杆查,表示不記錄訪問日志
#access_log /var/log/nginx/host.access.log main;
# 配置根目錄和默認的索引文件
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# 注釋掉以下error_page配置扮惦,表示不自定義錯誤頁
#error_page 404 /404.html;
# 配置5xx錯誤碼的錯誤頁
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
該配置定義了一個名為 localhost
的 server,監(jiān)聽本機 80 端口亲桦。
2.3 http - server - location 配置
location
配置是Nginx中用來匹配請求URI(Uniform Resource Identifier)并指定如何處理請求的指令崖蜜。在Nginx配置文件中,location 塊用于根據(jù)不同的 URI 路徑來定義不同的行為客峭,如代理請求豫领、重定向、設(shè)置緩存等舔琅。
配置類型
location 塊有不同的匹配類型:
- 普通匹配:使用前綴匹配或完全匹配來匹配請求URI等恐。
例如location /example
:匹配以/example開頭的URI路徑。 -
=
:精準匹配备蚓。
例如location = /path/to/resource
课蔬,只有當請求的URI完全等于/path/to/resource
時,該 location 塊才會生效星著。 -
~
:正則表達式匹配购笆。
例如location ~ ^/images/.*\.jpg$
:匹配以/images/
開頭且以.jpg
結(jié)尾的URI路徑。 -
~*
:不區(qū)分大小寫的正則表達式匹配虚循。
例如location ~* \.jpg$
:會匹配以.jpg
結(jié)尾的URI同欠,不區(qū)分大小寫。 -
^~
:優(yōu)先匹配横缔。
例如location ^~ /static/
:匹配以/static/
開頭的URI路徑,該匹配的優(yōu)先級高于其他匹配茎刚。
配置塊參數(shù)
location 配置塊中可以配置一些參數(shù)襟锐,常見的如下:
- root:指定location塊的根目錄,用于確定請求資源的實際文件路徑蚊荣。例如:
root /usr/share/nginx/html
; - alias:類似于root媳叨,但是可以將URI路徑替換為指定的路徑糊秆,不包括location路徑平痰。例如:
alias /path/to/files
; - try_files:定義嘗試查找文件的順序觉增,用于處理靜態(tài)文件請求逾礁。例如:
try_files $uri $uri/ /index.html
; - proxy_pass:將請求代理到指定的后端服務(wù)。例如:
proxy_pass http://backend_server
; - rewrite:重寫URI砾嫉,可用于重定向或修改請求URI墙杯。例如:
rewrite ^/oldpath/(.*)$ /newpath/$1 permanent
; - auth_basic:啟用基本的HTTP身份驗證观腊。例如:
auth_basic "Restricted Area"
; - if:條件判斷鲸阔,根據(jù)條件執(zhí)行不同的指令。注意if指令有一些限制和陷阱,建議謹慎使用。
- limit_rate:限制請求速率倘核,用于限制客戶端訪問速度。例如:
limit_rate 100k
; - expires:設(shè)置緩存過期時間轻庆,用于控制靜態(tài)資源的緩存時間。例如:
expires 1d
; - add_header:添加自定義HTTP響應頭作岖。例如:
add_header X-MyHeader "My Custom Header"
; - proxy_set_header:設(shè)置代理請求頭。例如:
proxy_set_header X-Real-IP $remote_addr
; - proxy_redirect:修改代理請求的重定向頭沉删。例如:
proxy_redirect off
; - proxy_pass_header:設(shè)置代理響應的頭信息采幌。例如:
proxy_pass_header Server
;
下面是一個簡單的Nginx配置示例:
# 定義一個HTTP服務(wù)器塊,監(jiān)聽80端口,并且設(shè)置主機名為example.com
server {
listen 80; # 監(jiān)聽80端口
server_name example.com; # 設(shè)置主機名為example.com
# 處理請求根路徑的配置
location / {
root /usr/share/nginx/html; # 設(shè)置根目錄為/usr/share/nginx/html
index index.html; # 設(shè)置默認的索引文件為index.html
}
# 處理以/images/開頭的請求路徑
location /images/ {
alias /var/www/images/; # 將URI路徑替換為/var/www/images/
}
# 處理以/api/開頭且以.json結(jié)尾的請求路徑
location ~ ^/api/.*\.json$ {
proxy_pass http://backend_server; # 將請求代理到后端服務(wù)器backend_server
}
}
2.4 http - server - upstream 配置
upstream
塊用于定義一組后端服務(wù)器犀农,用于負載均衡或代理請求惰赋。
例如:
upstream my_backend {
server backend_server1:8000; # 定義第一個后端服務(wù)器,格式為 server [IP或域名]:端口
server backend_server2:8000; # 定義第二個后端服務(wù)器,可以配置多個服務(wù)器
server unix:/tmp/backend.sock; # 也可以使用Unix Socket代替IP和端口
weight=1; # 設(shè)置服務(wù)器的權(quán)重赁濒,默認為1轨奄,負載均衡時會根據(jù)權(quán)重分配請求
max_fails=3; # 設(shè)置請求失敗次數(shù)的閾值,默認為1拒炎,超過閾值后服務(wù)器被認為不可用
fail_timeout=10s; # 設(shè)置服務(wù)器的失敗超時時間挪拟,默認為10秒
backup; # 設(shè)置服務(wù)器為備份服務(wù)器,在其他服務(wù)器不可用時使用
down; # 設(shè)置服務(wù)器為暫時不可用狀態(tài)击你,不會分配請求給該服務(wù)器
}
在 upstream 塊中玉组,可以配置多個后端服務(wù)器,Nginx 會根據(jù)負載均衡算法將請求分發(fā)給這些后端服務(wù)器丁侄。
需要注意的是惯雳,如果是在 Docker 中運行的 Nginx,則這里的 server 字段可以配置為 容器名稱:端口號
绒障,如 ixiaoniu:8080
吨凑。
在定義了 upstream 塊后,便可以在 location 塊中通過 proxy_pass 指令將請求代理到定義的 upstream 塊中的后端服務(wù)器:
location / {
proxy_pass http://my_backend; # 將請求代理到名為 my_backend 的 upstream 塊中定義的后端服務(wù)器
}
3. 一些常用命令
-
docker exec -it nginx bash
:進入在 Docker 中運行的 Nginx 容器命令行户辱。 -
nginx -v
:顯示 Nginx 版本鸵钝。 -
nginx -t
:測試 Nginx 配置文件是否有錯誤。 -
nginx -s reload
:重新加載配置庐镐。