docker啟動(dòng)nginx及常見(jiàn)nginx配置方式
nginx
為方便在設(shè)置出錯(cuò)時(shí)快速恢復(fù),使用docker方式來(lái)配置nginx,下文所有命令針對(duì)docker方式。
簡(jiǎn)單啟動(dòng)
sudo docker run --name nginx_3000 -p 3000:80 -d nginx
可以在3000端口訪問(wèn)nginx,如下圖:

nginx相關(guān)目錄
實(shí)際使用過(guò)程中,我們需要對(duì)nginx的轉(zhuǎn)發(fā)規(guī)則等選項(xiàng)進(jìn)行配置。docker版本的各個(gè)配置文件默認(rèn)所在路徑為:
- 網(wǎng)頁(yè)root目錄:/usr/share/nginx/html
- nginx配置文件:/etc/nginx/nginx.conf
- 日志文件目錄:/var/log/nginx
nginx主要命令
nginx stop #快速關(guān)機(jī) nginx quit #優(yōu)雅的關(guān)機(jī) nginx reload #重新加載配置文件 nginx reopen #重新打開(kāi)日志文件 nginx -t #檢查配置,同時(shí)也是輸出配置文件所在位置 nginx -s reload #修改配置后重載
掛載文件啟動(dòng)
docker啟動(dòng)nginx后每次修改配置文件都得執(zhí)行
docker exec nginx_3000 /bin/bash
進(jìn)入容器的shell后進(jìn)行操作,比較繁瑣,而且用vi編輯器修改內(nèi)容多時(shí)不太方便,所以可以將網(wǎng)頁(yè)文件及配置文件從宿主機(jī)中掛載到nginx中,這樣可以方便在在宿主機(jī)中利用vscode進(jìn)行修改。
首先先在宿主機(jī)中某一位置建立網(wǎng)頁(yè)、日志和配置目錄
mkdir html mkdir logs mkdir conf
拷貝容器中nginx默認(rèn)配置到宿主機(jī)剛才新建的conf目錄中
docker cp nginx_3000:/etc/nginx/nginx.conf ./conf/
刪掉剛才建立的nginx容器,重新建立帶目錄映射的容器,
docker run -d -p 80:80 --name nginx_zf -v ~/docker_file/nginx/html:/usr/share/nginx/html -v ~/docker_file/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/docker_file/nginx/logs:/var/log/nginx nginx
其中各個(gè)配置項(xiàng)含義如下:
- -d 后臺(tái)運(yùn)行
- -p 端口映射 3000宿主機(jī)端口 80 docker監(jiān)聽(tīng)端口
- –name 指定容器名稱(chēng)
- -v 目錄映射 前者是宿主機(jī)路徑 后者是docker容器路徑 具體路徑根據(jù)自己情況設(shè)定
- html為網(wǎng)頁(yè)內(nèi)容
- conf 為nginx配置
- logs 為 日志
啟動(dòng)成功后,我們就可以在宿主機(jī)中修改nginx的配置文件了,一般修改完成后,可以restart容器來(lái)生效配置,或者進(jìn)入nginx容器,執(zhí)行重載配置。
默認(rèn)nginx配置文件內(nèi)容/etc/nginx/nginx.conf如下:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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 on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}注意文件中又引入了 /etc/nginx/conf.d/*.conf文件,如下:
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}為簡(jiǎn)化操作,可以直接修改宿主機(jī)中的 nginx.conf文件,不導(dǎo)入其他文件,現(xiàn)在以一個(gè)url轉(zhuǎn)發(fā)為例修改宿主機(jī)的配置文件如下:
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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 on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
autoindex on;# 消除403報(bào)錯(cuò)
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# 訪問(wèn) localhost:端口號(hào)/test 轉(zhuǎn)發(fā)到 www.baidu.com
location /test {
proxy_pass http://www.baidu.com;
}
}
}如果啟動(dòng)后報(bào)403 可以在location上加上 autoindex on; 配置
配置文件解析
主要結(jié)構(gòu)
... #全局塊
events { #events塊
...
}
http #http塊
{
... #http全局塊
server #server塊
{
... #server全局塊
location [PATTERN] #location塊
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局塊
}- 1、全局塊:配置影響nginx全局的指令。一般有運(yùn)行nginx服務(wù)器的用戶組,nginx進(jìn)程pid存放路徑,日志存放路徑,配置文件引入,允許生成worker process數(shù)等。
- 2、events塊:配置影響nginx服務(wù)器或與用戶的網(wǎng)絡(luò)連接。有每個(gè)進(jìn)程的最大連接數(shù),選取哪種事件驅(qū)動(dòng)模型處理連接請(qǐng)求,是否允許同時(shí)接受多個(gè)網(wǎng)路連接,開(kāi)啟多個(gè)網(wǎng)絡(luò)連接序列化等。
- 3、http塊:可以嵌套多個(gè)server,配置代理,緩存,日志定義等絕大多數(shù)功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時(shí)時(shí)間,單連接請(qǐng)求數(shù)等。
- 4、server塊:配置虛擬主機(jī)的相關(guān)參數(shù),一個(gè)http中可以有多個(gè)server。
- 5、location塊:配置請(qǐng)求的路由,以及各種頁(yè)面的處理情況。主要修改都集中在這一塊。
舉例子:
########### 每個(gè)指令必須有分號(hào)結(jié)束。#################
#user administrator administrators; #配置用戶或者組,默認(rèn)為nobody nobody。
#worker_processes 2; #允許生成的進(jìn)程數(shù),默認(rèn)為1
#pid /nginx/pid/nginx.pid; #指定nginx進(jìn)程運(yùn)行文件存放地址
error_log log/error.log debug; #制定日志路徑,級(jí)別。這個(gè)設(shè)置可以放入全局塊,http塊,server塊,級(jí)別以此為:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #設(shè)置網(wǎng)路連接序列化,防止驚群現(xiàn)象發(fā)生,默認(rèn)為on
multi_accept on; #設(shè)置一個(gè)進(jìn)程是否同時(shí)接受多個(gè)網(wǎng)絡(luò)連接,默認(rèn)為off
#use epoll; #事件驅(qū)動(dòng)模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大連接數(shù),默認(rèn)為512
}
http {
include mime.types; #文件擴(kuò)展名與文件類(lèi)型映射表
default_type application/octet-stream; #默認(rèn)文件類(lèi)型,默認(rèn)為text/plain
#access_log off; #取消服務(wù)日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
access_log log/access.log myFormat; #combined為日志格式的默認(rèn)值
sendfile on; #允許sendfile方式傳輸文件,默認(rèn)為off,可以在http塊,server塊,location塊。
sendfile_max_chunk 100k; #每個(gè)進(jìn)程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值,默認(rèn)為0,即不設(shè)上限。
keepalive_timeout 65; #連接超時(shí)時(shí)間,默認(rèn)為75s,可以在http,server,location塊。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #熱備
}
error_page 404 https://www.baidu.com; #錯(cuò)誤頁(yè)
server {
keepalive_requests 120; #單連接請(qǐng)求上限次數(shù)。
listen 4545; #監(jiān)聽(tīng)端口
server_name 127.0.0.1; #監(jiān)聽(tīng)地址
location ~*^.+$ { #請(qǐng)求的url過(guò)濾,正則匹配,~為區(qū)分大小寫(xiě),~*為不區(qū)分大小寫(xiě)。
#root path; #根目錄
#index vv.txt; #設(shè)置默認(rèn)頁(yè)
proxy_pass http://mysvr; #請(qǐng)求轉(zhuǎn)向mysvr 定義的服務(wù)器列表
deny 127.0.0.1; #拒絕的ip
allow 172.18.5.54; #允許的ip
}
}
}常用三個(gè)配置詳細(xì)解析
location
location [=|~|~*|^~|@] /uri/ {
...
} - = : 表示精確匹配后面的url
- ~ : 表示正則匹配,但是區(qū)分大小寫(xiě)
- ~* : 正則匹配,不區(qū)分大小寫(xiě)
- ^~ : 表示普通字符匹配,如果該選項(xiàng)匹配,只匹配該選項(xiàng),不匹配別的選項(xiàng),一般用來(lái)匹配目錄
- @ : “@” 定義一個(gè)命名的 location,使用在內(nèi)部定向時(shí),例如 error_page
上述匹配規(guī)則的優(yōu)先匹配順序:
- = 前綴的指令嚴(yán)格匹配這個(gè)查詢(xún)。如果找到,停止搜索;
- 所有剩下的常規(guī)字符串,最長(zhǎng)的匹配。如果這個(gè)匹配使用 ^~ 前綴,搜索停止;
- 正則表達(dá)式,在配置文件中定義的順序;
- 如果第 3 條規(guī)則產(chǎn)生匹配的話,結(jié)果被使用。否則,使用第 2 條規(guī)則的結(jié)果。
if
用法:if (條件判斷) { 具體的rewrite規(guī)則 }
- 條件判斷語(yǔ)句由Nginx內(nèi)置變量、邏輯判斷符號(hào)和目標(biāo)字符串三部分組成。
- rewite規(guī)則見(jiàn)下方
rewrite部分
常見(jiàn)邏輯判斷符號(hào):
- = 等于
- != 不等于
- ~ 匹配 區(qū)分大小寫(xiě)
- ~* 匹配 不區(qū)分大小寫(xiě)
- !~ 不匹配 區(qū)分大小寫(xiě)
- !~* 不匹配 不區(qū)分大小寫(xiě)
!表示相反的意思,為匹配符號(hào),它右側(cè)為正則表達(dá)式,區(qū)分大小寫(xiě),而*為不區(qū)分大小寫(xiě)匹配。
目標(biāo)字符串可以是正則表達(dá)式,通常不用加引號(hào),但表達(dá)式中有特殊符號(hào)時(shí),比如空格、花括號(hào)、分號(hào)等,需要用單引號(hào)引起來(lái)。
常見(jiàn)Nginx內(nèi)置變量:
- 1.$remote_addr 與 $http_x_forwarded_for 用以記錄客戶端的ip地址;
- 2.$remote_user :用來(lái)記錄客戶端用戶名稱(chēng);
- 3.$time_local : 用來(lái)記錄訪問(wèn)時(shí)間與時(shí)區(qū);
- 4.$request : 用來(lái)記錄請(qǐng)求的url與http協(xié)議;
- 5.$status : 用來(lái)記錄請(qǐng)求狀態(tài);成功是200;
- 6.$body_bytes_s ent :記錄發(fā)送給客戶端文件主體內(nèi)容大??;
- 7.$http_referer :用來(lái)記錄從那個(gè)頁(yè)面鏈接訪問(wèn)過(guò)來(lái)的;
- 8.$http_user_agent :記錄客戶端瀏覽器的相關(guān)信息;
例子:
if ($http_user_agent ~ MSIE) //user_agent帶有MSIE字符的請(qǐng)求,直接返回403狀態(tài)碼 ,MSIE ->IE瀏覽器
{
return 403;
}
if ($request_method = POST) //當(dāng)請(qǐng)求的方法為POST時(shí),直接返回405狀態(tài)碼
{
return 405; //在該示例中并未用到rewrite規(guī)則,if中支持用return指令,直接返回狀態(tài)碼
}
if(!-f $request_filename) //當(dāng)請(qǐng)求的文件不存在,將會(huì)執(zhí)行下面的rewrite規(guī)則,-f判斷是否為文件,!-f判斷這個(gè)文件是否存在
{
rewrite 語(yǔ)句; #重要
}rewrite
用法: rewrite [正則] [替換] 標(biāo)志位
rewrite是實(shí)現(xiàn)URL重寫(xiě)的關(guān)鍵指令,根據(jù)regex(正則表達(dá)式)部分內(nèi)容,重定向到replacement,結(jié)尾是flag標(biāo)志位
正則表達(dá)式匹配,與if邏輯判斷相同,如下:
- ~ 為區(qū)分大小寫(xiě)匹配
- ~* 為不區(qū)分大小寫(xiě)匹配
- !和!*分別為區(qū)分大小寫(xiě)不匹配及不區(qū)分大小寫(xiě)不匹配
rewrite除正則匹配外,還支持對(duì)文件目錄判斷,有以下幾種:
- -f和!-f用來(lái)判斷是否存在文件
- -d和!-d用來(lái)判斷是否存在目錄
- -e和!-e用來(lái)判斷是否存在文件或目錄
- -x和!-x用來(lái)判斷文件是否可執(zhí)行
flag標(biāo)記分為下面4種:
- last :本條規(guī)則匹配完成后,繼續(xù)向下匹配新的location URI規(guī)則
- break :本條規(guī)則匹配完成即終止,不再匹配后面的任何規(guī)則
- redirect :返回302臨時(shí)重定向,瀏覽器地址會(huì)顯示跳轉(zhuǎn)后的URL地址
- permanent :返回301永久重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址
使用last和break實(shí)現(xiàn)URI重寫(xiě),瀏覽器地址欄不變。而且兩者有細(xì)微差別,使用alias指令必須用last標(biāo)記;使用proxy_pass指令時(shí),需要使用break標(biāo)記。
Last標(biāo)記在本條rewrite規(guī)則執(zhí)行完畢后,會(huì)對(duì)其所在server{…}標(biāo)簽重新發(fā)起請(qǐng)求,而break標(biāo)記則在本條規(guī)則匹配完成后,終止匹配。
常用配置
反向代理后端api
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 10240;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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 on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#后端多實(shí)例集群,可根據(jù)權(quán)重分配請(qǐng)求
upstream apiaddr{
server 192.168.31.101:8080 weight=5; #weight 為權(quán)重
server 192.168.31.102:8080 weight=3;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
autoindex on;# 消除403報(bào)錯(cuò)
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri /index.html;#加上該配置項(xiàng),使能在react項(xiàng)目中手動(dòng)在瀏覽器url欄手動(dòng)輸入url。
}
# 反向代理配置
location /api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://apiaddr/; #多實(shí)例 利用upstream來(lái)轉(zhuǎn)發(fā)
#proxy_pass http://192.168.31.101:8080/; #單實(shí)例直接指定后端api地址
#根據(jù)是否有跨域需求修改
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,DELETE,OPTIONS;
#也可以單獨(dú) 附加請(qǐng)求頭,根據(jù)需要修改
#proxy_set_header your-custome-header "myHeader";
#proxy_set_header X-NginX-Proxy true;
}
}
}
react 項(xiàng)目配置服務(wù)于爬蟲(chóng)的頁(yè)面TDK
user nginx;
worker_processes auto;
#error_log /var/log/nginx/error.log warn;
#修改 日志輸出等級(jí) 配合下方 rewrite_log on; 可以在errlog中查看rewrite轉(zhuǎn)發(fā)日志,方便調(diào)試
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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 on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
server {
listen 80;#HTTP 的端口
server_name localhost; #域名
charset utf-8;
#access_log logs/host.access.log main;
#此處是開(kāi)啟rewrite日志,并且需要把nginx的錯(cuò)誤日志級(jí)別改為notice
rewrite_log on;
# 前端頁(yè)面
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri /index.html;#加上了這個(gè),就可以在url后面直接加路由上配置path了。
}
# 多個(gè)預(yù)先生成的 供爬取的 html頁(yè)面
# 1.商城首頁(yè) /front/shoppingIndex
# 2.幫助中心 /front/help
# 3.商品列表 /front/goodsList
# 4.直接采購(gòu) /front/directbuy
# 5.優(yōu)質(zhì)供應(yīng)商 /front/highQualitySupplier
# 6.快速采購(gòu) /front/rapidbuy
location ~ /front/(shoppingIndex|help|goodsList|directbuy|highQualitySupplier|rapidbuy)/?$ { #?表示0個(gè)或者1個(gè)/
root /usr/share/nginx/html;
index index.html;
try_files $uri /index.html;#加上了這個(gè),就可以在url后面直接加路由上配置path了。
#設(shè)置一個(gè) 判斷是否為爬蟲(chóng)的 變量
set $isspider no; #默認(rèn)不是爬蟲(chóng)
#爬蟲(chóng)判斷(谷歌、百度、360、微軟)
if ($http_user_agent ~* .*(Googlebot|Baiduspider|360Spider|bingbot).*){
set $isspider yes; #是爬蟲(chóng)
}
#如果是爬蟲(chóng)的話 則重寫(xiě)到 front 文件夾中 的對(duì)應(yīng)靜態(tài)html
if ($isspider = yes) {
rewrite ^(.*)$ $1.html break;
#permanent;
#rewrite ^(.*)$ /prerender/index3.html break;
}
}
error_page 404 /html/404.html;
# redirect server error pages to the static page /50x.html
#
error_page 502 503 /html/502.html;
error_page 500 504 /50x.html;
location = /50x.html {
root html;
}
}
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker?compose啟動(dòng)服務(wù)遇到的問(wèn)題小結(jié)
這篇文章主要介紹了Docker?compose啟動(dòng)服務(wù)遇到的問(wèn)題小結(jié),這個(gè)是檢驗(yàn)我們的docker?compose掌握程度,因此里面的鏡像沒(méi)有提前拉取,掛載數(shù)據(jù)卷的目錄也沒(méi)有提前創(chuàng)建,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
在wsl-ubuntu中如何通過(guò) docker 啟動(dòng) gpu-jupyter
這篇文章主要介紹了在wsl-ubuntu中如何通過(guò) docker 啟動(dòng) gpu-jupyter,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
SpringBoot打包docker鏡像發(fā)布的詳細(xì)步驟
這篇文章主要介紹了SpringBoot打包docker鏡像發(fā)布,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
CentOS 7安裝Docker服務(wù)詳細(xì)過(guò)程
這篇文章主要為大家介紹了CentOS 7安裝Docker服務(wù)詳細(xì)過(guò)程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Docker安裝配置RabbitMQ的實(shí)現(xiàn)步驟
RabbitMQ是基于AMQP的一款消息管理系統(tǒng)。AMQP(Advanced?Message?Queuing?Protocol),是一個(gè)提供消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級(jí)消息隊(duì)列協(xié)議,其中RabbitMQ就是基于這種協(xié)議的一種實(shí)現(xiàn)2021-11-11
IDEA集成Docker實(shí)現(xiàn)打包的方法
本文主要介紹了IDEA集成Docker實(shí)現(xiàn)打包的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Docker搭建prometheus(普羅米修斯)的方法步驟
phometheus:當(dāng)前一套非常流行的開(kāi)源監(jiān)控和報(bào)警系統(tǒng),本文主要介紹了Docker搭建prometheus(普羅米修斯)的方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
Docker多容器編排Compose實(shí)戰(zhàn)案例
Docker Compose是用于管理多容器應(yīng)用的工具,通過(guò)YAML文件定義服務(wù)、網(wǎng)絡(luò)、卷,實(shí)現(xiàn)一鍵部署和配置,解決手動(dòng)操作繁瑣問(wèn)題,簡(jiǎn)化依賴(lài)管理,適用于開(kāi)發(fā)測(cè)試環(huán)境,生產(chǎn)需Kubernetes等更強(qiáng)大工具,本文給大家介紹Docker多容器編排Compose實(shí)戰(zhàn)教程,感興趣的朋友一起看看吧2025-09-09
Docker 端口映射與容器互聯(lián)的實(shí)現(xiàn)
Docker的端口映射和容器互聯(lián)是構(gòu)建和管理微服務(wù)架構(gòu)時(shí)重要的概念,本文主要介紹了Docker 端口映射與容器互聯(lián)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01

