一顾复、前言
在上章內(nèi)容中班挖,簡單介紹了使用docker部署項目的優(yōu)勢以及如何在Linux環(huán)境下安裝docker,本章內(nèi)容將主要講解如何構(gòu)建容器來部署項目芯砸。
二萧芙、Docker的組成
- 鏡像: 一個只讀模板,其中配置了容器運行所需要的環(huán)境數(shù)據(jù)
- 容器: 使用鏡像創(chuàng)建的實例假丧,可以簡單理解為是一個虛擬機双揪,要注意的是容器與容器之間是相互隔離的,容器與外界操作環(huán)境之間也是相互隔離的
- 倉庫: 類似Nginx包帚、Mysql這樣的常用組件渔期,如果我們每次部署項目時都得自己編寫鏡像配置文件來構(gòu)建鏡像,那不是很麻煩?所以早有人將這些常用組件鏡像上傳至公共的遠程倉庫中疯趟,我們只要拉取就行拘哨,當然我們也可以上傳自己的鏡像到倉庫中,是不是感覺和Github很類似信峻!目前docker默認的公共倉庫是docker官方維護的Dockerhub倦青。
上述鏡像和容器的關(guān)系,我們可以簡單的理解為:鏡像是一個對象類型盹舞,容器是這個對象類型的實例产镐。
三、構(gòu)建Django的容器
在上章內(nèi)容中我們提到過矾策,如果項目由多個組件組成磷账,我們最好是為每個組件都構(gòu)建一個容器,使其能單獨運行贾虽,方便復(fù)用逃糟。此處我們需要部署的項目由Django+Nginx+Mysql
三個組件組成,我們需要為這三個組件分別單獨構(gòu)建一個容器蓬豁。首先是為Django
構(gòu)建容器绰咽。
構(gòu)建鏡像
我們先創(chuàng)建一個Django
項目,這個項目我們就暫時命名為room
地粪,我們在其中創(chuàng)建一個叫做deployment
(可以隨意命名)的文件夾取募,用于存放我們部署使用的配置文件,因為我們一般開始時會區(qū)分測試與正式環(huán)境蟆技,所以我們再在deployment
文件夾下創(chuàng)建一個dev
文件夾玩敏,用于存放測試環(huán)境下的部署配置文件,項目的最終目錄結(jié)構(gòu)如下:
|—— room
| |——deployment # 存放部署使用的配置文件
| | |——dev # 存放部署測試環(huán)境使用的配置文件
| | | |——app # django相關(guān)
| | | | |——Dockerfile # django項目的鏡像配置文件
| | | | |——startapp.sh # 啟動django項目的腳本文件
| | | |——gunicron # gunicorn相關(guān)
| | | | |——gunicorn.conf.py # gunicorn的配置文件
| | | |——nginx # nginx相關(guān)
| | | | |——nginx.conf # nginx的配置文件
| | | |——docker-compose.yml # 容器的配置文件
| | |——wait-for-it.sh # 控制服務(wù)順序執(zhí)行的腳本文件
| |——room
| |——static
| |——templates
| |——manage.py
可以看到质礼,目錄結(jié)構(gòu)中存在兩個sh文件旺聚,這兩個sh文件的作用如下:
-
startapp.sh:
編寫了啟動Django項目的命令行,因為運行項目時需要執(zhí)行多條命令眶蕉,我們將這些命令都寫入一個shell腳本中砰粹,我們后面會通過執(zhí)行這個sh文件來運行項目 -
wait-for-it.sh:
有些服務(wù)啟動需要一定的時間,而其他服務(wù)需要等這些服務(wù)啟動完成后才能執(zhí)行造挽,此文件的作用就是確保服務(wù)可以按順序啟動
編寫Django項目的鏡像配置文件
我們在項目中的Dockerfile
的文件中寫入如下內(nèi)容:
# 從倉庫拉取帶有python3.8的Linux環(huán)境
FROM python:3.8
# 鏡像維護者的姓名和郵箱地址
MAINTAINER albertlii <albertlii@163.com>
# 因為墻的關(guān)系碱璃,有時安裝庫可能會很慢或者失敗,所以推薦使用國內(nèi)鏡像源
# 此處是創(chuàng)建一個指向阿里云鏡像源的參數(shù)饭入,以便后面引用
ARG pip_url=http://mirrors.aliyun.com/pypi/simple/
ARG pip_host=mirrors.aliyun.com
# 定義一個變量嵌器,其值為項目在docker容器中的工作目錄
ARG work_home=/room
# 設(shè)置python環(huán)境變量
ENV PYTHONUNBUFFERED 1
# 容器默認的時間是UTC時間,此處設(shè)置為上海時間
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 在容器中創(chuàng)建room文件夾
RUN mkdir ${work_home}
# 將容器中的room文件夾設(shè)置為工作目錄
WORKDIR ${work_home}
# 將當前目錄內(nèi)容復(fù)制到容器的room目錄谐丢,因為build中指定的context環(huán)境目錄為project這一層爽航,所以當前目錄即項目目錄
COPY . ${work_home}
# 更新pip
RUN pip install pip -U
# 安裝所有依賴庫
RUN pip install -r requirements.txt -i ${pip_url} --trusted-host ${pip_host}
# 將deployment/dev下的startapp.sh 文件拷貝到容器的根目錄下
COPY deployment/dev/app/startapp.sh /startapp.sh
# 將deployment下的wait-for-it.sh文件拷貝到容器的根目錄下
COPY deployment/wait-for-it.sh /wait-for-it.sh
# 修改文件權(quán)限 ,為sh文件增加可執(zhí)行
RUN chmod +x /startapp.sh
RUN chmod +x /wait-for-it.sh
下面對上述的指令語句做一些簡單介紹:
-
FROM python:3.8:
從倉庫拉取一個包含Python3.8的Linux操作環(huán)境 -
WORKDIR:
這個指令是針對容器的,功能是將容器中的指定目錄設(shè)置為工作目錄 -
COPY:
將宿主機中的指定目錄拷貝到容器中的指定目錄中岳掐,docker中還有一個ADD
指令與COPY
指令功能相似,但是ADD
指令在拷貝后會自動解壓壓縮包饭耳,COPY
指令不會 -
RUN:
這個指令是針對容器的串述,主要是在容器中執(zhí)行你想要執(zhí)行的指令
Dockerfile
是默認的配置文件名稱,docker在創(chuàng)建鏡像時會默認去指定路徑(即指定的上下文環(huán)境目錄)中尋找名為Dockerfile
的配置文件寞肖。當然纲酗,我們也可以修改名稱,只需要我們重新手動指定一下配置文件的路徑即可新蟆,在下面內(nèi)容中我們會講到觅赊。
startapp.sh
文件內(nèi)容如下:
#!/bin/sh
python manage.py migrate
python manage.py collectstatic --noinput
gunicorn -c ./deployment/dev/gunicorn/gunicorn.conf.py room.wsgi:application
wait-for-it.sh
是直接從Github上下載的,鏈接如下:
https://github.com/vishnubob/wait-for-it
至此琼稻,Django
相關(guān)的鏡像配置到此結(jié)束吮螺,我們還缺少Nginx
與Mysql
的鏡像配置。但是帕翻,我們在文章開頭就提到過鸠补,類似Nginx
與Mysql
這類常用的鏡像,早就有人幫我上傳到公共倉庫中嘀掸,我們只需要直接從公共倉庫中拉取即可紫岩,不需要在自己手動編寫,所以我們真正需要自己自定義的鏡像文件睬塌,只有我們的Django
項目泉蝌。
使用Docker-compose
前面我們多次提到不要將多個組件放在一個容器中,而是分別為每個組件創(chuàng)建一個容器揩晴。而當我們要構(gòu)建和運行多個組件的容器時勋陪,我們?nèi)绻總€容器都去使用命令單獨去構(gòu)建和運行豈不是很麻煩?此時我們就可以使用Docker-compose
來解決這一問題文狱。Docker-compose
可以同時編排多個容器粥鞋,將多個容器的構(gòu)建與啟動操作放到一起執(zhí)行。我們在docker-compose.yml
文件中寫入如下內(nèi)容:
version: "3"
# 定義用于共享的數(shù)據(jù)卷
volumes:
# 定一個名稱為static-volumn的數(shù)據(jù)卷
static-volume:
# 定一個名稱為media-volumn的數(shù)據(jù)卷
media-volume:
# 定義兩個網(wǎng)絡(luò)瞄崇,只有處于同一網(wǎng)絡(luò)下的容器才能通訊
networks:
web_network:
driver: bridge
db_network:
driver: bridge
services:
app:
# 除正常工作外呻粹,容器會在任何時候重啟,比如遭遇 bug苏研、進程崩潰等浊、docker 重啟等情況
restart: always
build:
# 構(gòu)建鏡像的上下文環(huán)境所在目錄,相對當前docker-compose.yml的位置
context: ../../
# 指定用于構(gòu)建鏡像的Dockerfile(ps: 命名不需要一定為Dockerfile)
dockerfile: ./deployment/dev/app/Dockerfile
# 設(shè)置容器名字
container_name: room_dev
image: room_dev
command: "/wait-for-it.sh mysql:3306 -- /startapp.sh"
# 數(shù)據(jù)卷摹蘑,使宿主機的內(nèi)容可以映射到容器中筹燕,當宿主機指定目錄的內(nèi)容更新時,容器中的指定目錄中的內(nèi)容也會相應(yīng)更新
# 所以使用數(shù)據(jù)卷時,一定要注意路徑是否正確撒踪,否則會出現(xiàn)文件找不到或不存在的情況
volumes:
- ../../:/room
- static-volume:/room/collected_static
- media-volume:/room/media
# 暴露端口过咬,但不暴露給宿主機,只給連接的服務(wù)訪問
expose:
- "8000"
networks:
- web_network
- db_network
mysql:
image: mysql:5.7
restart: always
container_name: mysql
hostname: mysql # host的名字制妄,在django中需要使用
environment:
- MYSQL_HOST=localhost # mysql的主機
- MYSQL_PORT=3306 # mysql的端口號
- MYSQL_ROOT_PASSWORD=123456 # root用戶的密碼
- MYSQL_DATABASE=room_dev # 數(shù)據(jù)庫的名字
- MYSQL_USER=dev # 用戶名
- MYSQL_PASSWORD=123456 # dev用戶的密碼
- MYSQL_ALLOW_EMPTY_PASSWORD=no # 設(shè)置是否允許root用戶的密碼為空
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
volumes:
# mysql的數(shù)據(jù)目錄
- ../../../room_dev_db:/var/lib/mysql
ports:
- "3306:3306"
networks:
- db_network
nginx:
image: nginx:latest
restart: always
container_name: nginx
# 宿主機和容器的端口映射
ports:
- "8001:8001"
volumes:
- static-volume:/collected_static
- media-volume:/room_media_dev
- ./nginx:/etc/nginx/conf.d # 修改nginx的配置
networks:
- web_network
Docker-compose的安裝請參考上章內(nèi)容
上述文件內(nèi)容有些多掸绞,我們逐一分析。在文件開頭耕捞,有個version
衔掸,代表docker-compose.yml的版本,目前最新版為3俺抽,我們不需要改動它敞映。然后文件下面的內(nèi)容大致分為volumes
、networks
磷斧、app
振愿、mysql
、nginx
五個模塊瞳抓。其中app
埃疫、mysql
、nginx
都是容器的配置孩哑,app
容器使用的鏡像是我們上述的自定義鏡像栓霜,mysql
與nginx
容器使用的鏡像則是直接從公共倉庫中拉取的鏡像,我們先看下容器中的配置項:
- restart: 除正常工作外横蜒,容器會在任何時候重啟胳蛮,比如遭遇 bug、進程崩潰丛晌、docker 重啟等情況仅炊。
-
command: 運行容器所需要執(zhí)行的操作,這邊是直接執(zhí)行一個shell腳本澎蛛,當然也可以直接執(zhí)行命令抚垄,比如
python manage.py runserver 127.0.0.1:8000
- container_name: 設(shè)置容器的名字
-
image: 鏡像的名字,在
app
這種使用自定義鏡像的情況中谋逻,表示的是設(shè)置自定義鏡像的名字呆馁。在mysql
和nginx
這種從倉庫中拉取鏡像的情況中,表示的是要從倉庫中獲取的鏡像的名字毁兆,而不是重新設(shè)置鏡像名字 - expose: 容器對外暴露端口浙滤,因為容器與外界隔離是連端口一起隔離的,但是web服務(wù)是需要調(diào)用端口的气堕,因此需要將容器的端口對外暴露纺腊,但是要注意此命令不會對宿主機(即外界的系統(tǒng)操作環(huán)境)暴露端口畔咧,僅僅是對其他容器暴露端口
-
ports:定義了宿主機與容器之間的端口映射,寫法是
宿主機的端口號:容器的端口號
揖膜,例如8000:5000
即表示訪問宿主機的8000
端口就是訪問容器的5000
端口誓沸,與expose
一樣起到對外暴露端口的作用,但是ports
是針對宿主機而expose
是針對其他容器的 -
build: 用于指定構(gòu)建鏡像的上下文路徑
-
context: 指定構(gòu)建鏡像的上下文環(huán)境所在目錄壹粟,是相對配置文件
docker-compose.yml
的所在目錄蔽介,../../
表示docker-compose.yml
所在目錄的上級目錄的上級目錄,即最外層的room
目錄煮寡,注意上述鏡像配置文件中COPY
命令所涉及到的宿主機目錄就是由context
指定的,例如COPY deployment/dev/app/startapp.sh /startapp.sh
中犀呼,因為context
指向最外層的room
目錄幸撕,所以deployment/dev/app/startapp.sh
指的是最外層room
目錄下的對應(yīng)文件 -
dockerfile: 指定用于構(gòu)建鏡像的配置文件,即我們的前面編寫的
Dockerfile
文件外臂,其根路徑就是上述context
指定的路徑坐儿,即最層的room
,./deployment/dev/app/Dockerfile
即表示最外層room
目錄下對應(yīng)的文件
-
context: 指定構(gòu)建鏡像的上下文環(huán)境所在目錄壹粟,是相對配置文件
-
depends_on: 一個容器需要依賴另一個容器宋光,例如上述配置中
app
容器需要依賴mysql
容器貌矿,只有mysql
容器啟動后,app
容器才能正常使用罪佳。但是mysql
容器第一次啟動后逛漫,初始化需要一定的時間,而depends_on
并不會去等待mysql
初始化完成赘艳,再去啟動app
酌毡,這時app
啟動會因為mysql
沒有初始化完成而失敗,所以這時我們可以使用上述提到的wait-for-it.sh
腳本蕾管,使用方法是/wait-for-it.sh 容器名:容器端口號 -- 后續(xù)執(zhí)行的命令
枷踏,例如/wait-for-it.sh mysql:3306 -- /startapp.sh
因為我們使用到了mysql
,所以django
中的配置需要做如下修改:
# *************************
# 數(shù)據(jù)庫相關(guān)
# *************************
DATABASES = {
# 默認使用mysql數(shù)據(jù)庫
"default": {
"ENGINE": "django.db.backends.mysql", # 數(shù)據(jù)庫引擎
"NAME": "room_dev", # 數(shù)據(jù)庫名
"USER": "dev", # 用戶名
"PASSWORD": "123456", # 密碼
"HOST": "mysql", # HOST掰曾,配置文件中的hostname
"POST": 3306, # 端口
"OPTIONS": {"charset": "utf8mb4"},
},
}
在上述容器配置項介紹中旭蠕,除了volumes
與networks
外,對于其他配置項我們已經(jīng)有了一些了解旷坦。下面我們單獨講解一下volumes
與networks
掏熬,尤其是volumes
,其在容器中起到至關(guān)重要的作用塞蹭。
volumes
volumes
我們一般稱為容器的卷英染。因為容器與容器以及容器與宿主機是相互隔離的,但有時我們又需要它們可以互相連通碉渡,例如當宿主機上的項目代碼更新了默蚌,容器中的項目代碼也需要更新辆琅,如果我們每次都去手動更新,豈不是很麻煩这刷?另外婉烟,當容器被刪除時,容器中的數(shù)據(jù)也會丟失暇屋,如果數(shù)據(jù)庫的容器被誤刪似袁,這導(dǎo)致的結(jié)果也不是我們可以接受的。而卷正好解決這些問題咐刨!
卷大致可以分為兩種使用形式昙衅,
第一種:使用絕對路徑
app:
......
volumes:
- ../../:/room
上述配置中,:
是分割符定鸟,:
的左邊../../
是宿主機的目錄(這個路徑是相對docker-compose.yml
所在的目錄而涉,此處為docker-compose.yml
所在的目的上級目錄的上級目錄,即最外層的room
目錄)联予,:
的右邊/room
是容器中的目錄啼县,此時表示宿主機的../../
與容器的/room
目錄是連通的,當宿主機中的指定目錄中的項目代碼更新沸久,容器中的/room
目錄中的代碼也會更新季眷。
mysql:
......
volumes:
- ../../../room_dev_db:/var/lib/mysql
我們再看容器mysql
中的配置,../../../room_dev_db
表示在最外層room
目錄外新建了一個room_dev_db
文件夾與mysql
容器中的/var/lib/mysql
(mysql存放數(shù)據(jù)的地方)目錄連通卷胯。因為一開始room_dev_db
目錄是空的子刮,所以/var/lib/mysql
中的數(shù)據(jù)會映射到room_dev_db
中,這樣在宿主機中就持有了數(shù)據(jù)庫中的數(shù)據(jù)窑睁,即使我們不小心誤刪了mysql
容器话告,我們在宿主機中也有數(shù)據(jù)庫的數(shù)據(jù),不會造成數(shù)據(jù)丟失卵慰,當我們再次創(chuàng)建mysql
容器時沙郭,數(shù)據(jù)會自動恢復(fù)。
第二種:使用卷標
# 定義用于共享的數(shù)據(jù)卷
volumes:
# 定一個名稱為static-volumn的數(shù)據(jù)卷
static-volume:
# 定一個名稱為media-volumn的數(shù)據(jù)卷
media-volume:
在文件的頭部裳朋,我們定義了兩個卷病线,分別名為static-volume
與media-volume
。這兩個卷目前是空的鲤嫡,沒有任何數(shù)據(jù)送挑。然后在app
容器中有一段配置:
app:
......
volumes:
......
- static-volume:/room/collected_static
static-volume:/room/collected_static
中,:
左邊的static-volume
是我們在一開始在宿主機中定義的卷暖眼,:
右邊的/room/collected_static
指的是容器中的目錄惕耕,但此時的static-volume
只是個卷的名字,不是具體的宿主機中的路徑诫肠,此處將容器中的/room/collected_static
的內(nèi)容映射到宿主機的原來的空static-volume
卷中司澎,使得static-volume
持有/room/collected_static
中的數(shù)據(jù)欺缘,而static-volume
的具體存儲,則默認由宿主機上的docker統(tǒng)一管理挤安。
nginx:
......
volumes:
- static-volume:/collected_static
在nginx
容器中有一段static-volume:/collected_static
谚殊,因為在上面app
容器中已經(jīng)使static-volume
卷擁有了數(shù)據(jù),使其不再是空的狀態(tài)蛤铜,此處是將static-volume
卷中的數(shù)據(jù)映射到nginx
容器的/collected_static
目錄中嫩絮,使得nginx
容器也可以訪問static
資源,起到了數(shù)據(jù)共享的作用围肥,這樣app
與nginx
就是共用static-volume
這個卷剿干,起到數(shù)據(jù)共享的作用。
在上述介紹數(shù)據(jù)卷時穆刻,我們幾次提到數(shù)據(jù)卷的空狀態(tài)與非空狀態(tài)怨愤,其實從中可以看出,掛載空卷和非空卷是有區(qū)別的蛹批,所以我們需要記住以下數(shù)據(jù)卷的重要特性:
- 容器啟動時,如果掛載一個空的數(shù)據(jù)卷到容器中的一個非空目錄中篮愉,那么這個目錄下的文件會被復(fù)制到數(shù)據(jù)卷中腐芍;
- 如果掛載一個非空數(shù)據(jù)卷到容器中的一個目錄中,那么容器中的目錄中會顯示數(shù)據(jù)卷中的數(shù)據(jù)试躏;如果原來容器中的目錄中有數(shù)據(jù)猪勇,那么這些原始數(shù)據(jù)會被隱藏掉
舉個例子,就以collected_static
的數(shù)據(jù)卷static-volume
來說颠蕴,只要卷初始化完成后泣刹,容器原始的 collected_static
目錄就被隱藏起來不再使用了,新增的文件也只存在于static-volume
卷中犀被,容器中是沒有的椅您。
networks
# 定義兩個網(wǎng)絡(luò),只有處于同一網(wǎng)絡(luò)下的容器才能通訊
networks:
web_network:
driver: bridge
db_network:
driver: bridge
app:
……
networks:
- web_network
- db_network
mysql:
……
networks:
- db_network
nginx:
……
networks:
- web_network
在docker中可以給每個容器定義其工作網(wǎng)絡(luò)寡键,定義網(wǎng)絡(luò)后可以隔離容器的網(wǎng)絡(luò)環(huán)境掀泳,容器只有在相同的網(wǎng)絡(luò)之中才能進行通訊。此處一共定義了兩個網(wǎng)絡(luò)web_network和db_network西轩。在配置文件中可以看出员舵,app
與nginx
都處于web_network
網(wǎng)絡(luò),且app
與mysql
處于db_network
網(wǎng)絡(luò)藕畔,nginx
與mysql
因為所處網(wǎng)絡(luò)不同马僻,無法通訊。
四注服、總結(jié)
關(guān)于使用Docker+Django+Gunicorn+Mysql+Nginx部署項目的介紹就到此結(jié)束了韭邓,博主對于Docker的使用也只是停留在基礎(chǔ)層面措近,如有不足之處,歡迎指正仍秤。有興趣的同學可以關(guān)注公眾號「Code滿滿」或者是博客「李益的小站」熄诡。另外此處推薦一個比較詳細的系列文章:《Django+Docker容器化部署》,本文亦參考了此系列文章诗力。
最后附上gunicorn
與nginx
的配置文件內(nèi)容:
- gunicorn
# -*- coding: utf-8 -*-
import multiprocessing
from pathlib import Path
BASE_DIR = Path(__file__).resolve(strict=True).parent.parent.parent.parent
debug = False
# ============================================================
# gunicorn要切換到的目的工作目錄
# ============================================================
chdir = str(BASE_DIR)
# ============================================================
# server socket相關(guān)
# ============================================================
# 指定綁定的ip和端口
bind = "0.0.0.0:8000"
# 服務(wù)器中排隊等待的最大連接數(shù)凰浮,建議值64-2048,超過2048時client連接會得到一個error
backlog = 2048
# ============================================================
# 調(diào)試相關(guān)
# ============================================================
# 當代碼有修改時苇本,自動重啟workers袜茧,適用于開發(fā)環(huán)境
reload = False
# 以守護進程形式來運行Gunicorn進程,其實就是將這個服務(wù)放到后臺去運行
daemon = False
# ============================================================
# worker進程相關(guān)
# ============================================================
# 用于處理工作的進程數(shù)
workers = multiprocessing.cpu_count() * 2 + 1
# worker進程的工作方式瓣窄,有sync笛厦、eventlet、gevent俺夕、tornado裳凸、gthread, 默認是sync,
# django使用gevent容易造成阻塞, 使用gthread的方式好一些
worker_class = 'gthread'
# 指定每個工作進程開啟的線程數(shù)
threads = multiprocessing.cpu_count() * 2
# 訪問超時時間
timeout = 30
# 接收到restart信號后,worker可以在graceful_timeout時間內(nèi)劝贸,繼續(xù)處理完當前requests
graceful_timeout = 60
# server端保持連接時間
keepalive = 30
# ============================================================
# 日志相關(guān)
# ============================================================
"""日志文件格式姨谷,其每個選項的含義如下:
h remote address
l '-'
u currently '-', may be user name in future releases
t date of the request
r status line (e.g. ``GET / HTTP/1.1``)
s status
b response length or '-'
f referer
a user agent
T request time in seconds
D request time in microseconds
L request time in decimal seconds
p process ID
"""
access_log_format = '%(t)s %(h)s "%(r)s" %(s)s %(b)s "%(f)s" "%(L)s"'
LOG_DIR = Path(BASE_DIR, 'log')
if not LOG_DIR.exists():
LOG_DIR.mkdir(parents=True)
# 錯誤日志輸出等級,訪問日志的輸出等級無法設(shè)置
loglevel = "error"
# 正常的日志文件路徑映九,'-'表示輸出到終端
accesslog = '-'
# 錯誤日志文件路徑梦湘,'-'表示輸出到終端
errorlog = str(LOG_DIR / 'gunicorn_error.log')
# ============================================================
# 進程名相關(guān)
# ============================================================
# 設(shè)置進程名稱,默認是gunicorn
proc_name = 'gunicorn_room'
- nginx
#user root;
# 將請求分發(fā)到upstream池中的服務(wù)器中
upstream app {
ip_hash;
server app:8000;
}
server {
# nginx監(jiān)聽的端口
listen 8001;
server_name localhost;
# 限制用戶上傳文件大小
client_max_body_size 5M;
location /media {
alias /room_media_dev;
}
# 訪問一些其他靜態(tài)文件件甥,直接交給nginx處理捌议,可以指向django項目中配置的STATIC_ROOT路徑
# 這里的 /static 的意思就是你的域名加上/static/就訪問里面的那個路徑/項目了
# alias:直接查詢指定路徑
location /static {
alias /collected_static/;
}
location / {
proxy_pass http://app/; # 將指定的ip或者域名的http請求轉(zhuǎn)發(fā)到upstream池中
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}