網(wǎng)站首頁 編程語言 正文
前言
前后端聯(lián)調(diào)接口時,經(jīng)常會用到nginx反向代理來解決跨域問題。部署時,同一份前端代碼有時候會根據(jù)開發(fā)環(huán)境不同,需要切換不同的后端接口地址進行代理。 傳統(tǒng)方式是為每個環(huán)境都獨立部署一份nginx配置,但是多數(shù)情況下,這些配置里的內(nèi)容大體上相同,只有少數(shù)部分內(nèi)容需要修改,這時候我們就希望nginx配置能夠從docker中獲取環(huán)境變量,動態(tài)設(shè)置有差異的那部分配置。本文將以代理接口地址為例,介紹下解決方案
Docker安裝nginx服務(wù)
我們先從配置一份靜態(tài)的nginx環(huán)境開始。
- 首先,找一個空文件夾,把前端項目打包后的
dist
文件夾拷貝到根目錄 - 在根目錄下配置
nginx.conf
如下,代理接口的關(guān)鍵點在于proxy_pass
:
server { listen 80; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } location /api/ { #這里假設(shè)接口地址為http://127.0.0.1:8081 #前端以/api/開頭的接口將被代理到http://127.0.0.1:8081 proxy_pass http://127.0.0.1:8081; } }
- 同時在根目錄下面創(chuàng)建一份
Dockerfile
文件,寫入以下內(nèi)容
# 拉取nginx鏡像 FROM nginx:stable-alpine # 把本地的dist文件夾下所有內(nèi)容復(fù)制到/usr/share/nginx/html下 COPY dist/ /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d # 暴露80端口 EXPOSE 80 # 將docker環(huán)境下的命令行路徑切換到/etc/nginx/conf.d下執(zhí)行 WORKDIR /etc/nginx/conf.d # 此時相當(dāng)于在docker容器里的/etc/nginx/conf.d路徑下,運行nginx命令 ENTRYPOINT nginx -g 'daemon off;'
執(zhí)行
docker build . -t my-nginx
命令將本地資源打包成鏡像,鏡像名為my-nginx
執(zhí)行
docker run --name nginx-server -d -p 8080:8080 my-nginx
運行鏡像,--name nginx-server
設(shè)置docker容器的名稱,-p 8080:8080
指將容器內(nèi)8080端口映射到宿主機的8080端口,my-nginx
就是之前打包好的鏡像這時瀏覽器打開
http://localhost:8080
進行訪問,接口就被代理到了http://127.0.0.1:8081
動態(tài)配置nginx.conf
上一步我們使用靜態(tài)配置運行了nginx服務(wù),現(xiàn)在我們來試試通過環(huán)境變量,動態(tài)注入nginx配置。
- 將
nginx.conf
重命名為nginx.template
(名字可以隨便起,不重命名也行,這里為了表示這是一個模板),修改內(nèi)容如下
server { listen 80; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } location /api/ { #使用變量替換具體的地址,或者用${URL_1}也行 proxy_pass $URL_1; } location /login/ { #新增一個代理接口,方便演示注入多個變量,或者用${URL_2}也行 proxy_pass $URL_2; } }
2.同時Dockerfile
也有修改一下
FROM nginx:stable-alpine COPY dist/ /usr/share/nginx/html #這里改成將nginx配置模板復(fù)制過去 COPY nginx.template /etc/nginx/conf.d EXPOSE 80 WORKDIR /etc/nginx/conf.d #添加環(huán)境變量的寫入 ENTRYPOINT envsubst '$URL_1 $URL_2' < nginx.template > default.conf && cat default.conf && nginx -g 'daemon off;'
這里實現(xiàn)環(huán)境變量注入的核心原理是利用linux
自帶的envsubst
指令。envsubst '$URL_1 $URL_2' < nginx.template
作用是取環(huán)境的$URL_1
和$URL_2
(此處變量名也可以寫成${URL_2},與模板保持一致即可)的值注入到nginx.template
模板里對應(yīng)的位置,然后后半句> default.conf
是將替換好變量后的模板內(nèi)容寫入到docker容器下default.conf
文件里。cat default.conf
這句話方便我們查看nginx的配置內(nèi)容,下文會提到。
重新執(zhí)行
docker build . -t new-nginx
重新打包鏡像執(zhí)行
docker run --name new-nginx-server -d -p 8080:8080 -e URL_1=http://127.0.0.1:8081 -e URL_2=http://127.0.0.1:8082 new-nginx
運行鏡像,這里我們新增了-e URL_1=http://127.0.0.1:8081 -e URL_2=http://127.0.0.1:8082
,往容器里注入了環(huán)境變量,URL_1
的值為http://127.0.0.1:8081
,URL_2
的值為http://127.0.0.1:8082
然后我們使用
docker logs -f new-nginx-server
查看容器里打印的內(nèi)容,因為之前已經(jīng)提前寫好cat default.conf
,所以執(zhí)行完命令后,可以直接在 控制臺看到打印出的nginx配置,之前的變量部分,已經(jīng)成功的被替換掉:
server { listen 80; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8081; } location /login/ { proxy_pass http://127.0.0.1:8082; } }
總結(jié)
整個方案,采用的是通過docker run -e xxxx=xxx
先往容器注入環(huán)境變量,然后進一步通過envsubst
指令將環(huán)境變量寫入到具體的文件當(dāng)中,實現(xiàn)動態(tài)配置文件內(nèi)容。 當(dāng)然這個方案依然有一些缺陷,例如當(dāng)需要替換的變量有成百上千時,命令會很長,那時可能需要找一些其他方案進行優(yōu)化。此外這里envsubst
只是實現(xiàn)變量替換的其中一種方式, 其實實現(xiàn)類似的功能的方式有很多,例如利用nodejs
配合ejs
動態(tài)寫入也是可以的,本文僅是提供一下大體的思路,具體實現(xiàn)可以結(jié)合自身項目靈活變通。
原文鏈接:https://juejin.cn/post/7104908571053129735
相關(guān)推薦
- 2022-10-26 C#實現(xiàn)文件與字符串互轉(zhuǎn)的方法詳解_C#教程
- 2023-07-22 測試springboot log4j2異步配置是否生效
- 2022-06-15 GO文件創(chuàng)建及讀寫操作示例詳解_Golang
- 2022-08-12 virtualenv隔離Python環(huán)境的問題解析_python
- 2022-06-10 FreeRTOS使用任務(wù)通知實現(xiàn)命令行解釋器_操作系統(tǒng)
- 2022-07-21 數(shù)據(jù)庫分組查詢--GROUP BY及排序
- 2022-09-29 Kotlin協(xié)程launch原理詳解_Android
- 2022-05-13 Headless Chrom自動化工具詳解
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支