Docker+Django+Gunicorn+Nginx+Mysql容器化部署(下)

一顾复、前言

在上章內(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.8Linux操作環(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é)束吮螺,我們還缺少NginxMysql的鏡像配置。但是帕翻,我們在文章開頭就提到過鸠补,類似NginxMysql這類常用的鏡像,早就有人幫我上傳到公共倉庫中嘀掸,我們只需要直接從公共倉庫中拉取即可紫岩,不需要在自己手動編寫,所以我們真正需要自己自定義的鏡像文件睬塌,只有我們的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)容大致分為volumesnetworks磷斧、app振愿、mysqlnginx五個模塊瞳抓。其中app埃疫、mysqlnginx都是容器的配置孩哑,app容器使用的鏡像是我們上述的自定義鏡像栓霜,mysqlnginx容器使用的鏡像則是直接從公共倉庫中拉取的鏡像,我們先看下容器中的配置項:

  • restart: 除正常工作外横蜒,容器會在任何時候重啟胳蛮,比如遭遇 bug、進程崩潰丛晌、docker 重啟等情況仅炊。
  • command: 運行容器所需要執(zhí)行的操作,這邊是直接執(zhí)行一個shell腳本澎蛛,當然也可以直接執(zhí)行命令抚垄,比如python manage.py runserver 127.0.0.1:8000
  • container_name: 設(shè)置容器的名字
  • image: 鏡像的名字,在app這種使用自定義鏡像的情況中谋逻,表示的是設(shè)置自定義鏡像的名字呆馁。在mysqlnginx這種從倉庫中拉取鏡像的情況中,表示的是要從倉庫中獲取的鏡像的名字毁兆,而不是重新設(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)的文件
  • 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"},
    },
}

在上述容器配置項介紹中旭蠕,除了volumesnetworks外,對于其他配置項我們已經(jīng)有了一些了解旷坦。下面我們單獨講解一下volumesnetworks掏熬,尤其是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-volumemedia-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ù)共享的作用围肥,這樣appnginx就是共用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_networkdb_network西轩。在配置文件中可以看出员舵,appnginx都處于web_network網(wǎng)絡(luò),且appmysql處于db_network網(wǎng)絡(luò)藕畔,nginxmysql因為所處網(wǎng)絡(luò)不同马僻,無法通訊。

四注服、總結(jié)

關(guān)于使用Docker+Django+Gunicorn+Mysql+Nginx部署項目的介紹就到此結(jié)束了韭邓,博主對于Docker的使用也只是停留在基礎(chǔ)層面措近,如有不足之處,歡迎指正仍秤。有興趣的同學可以關(guān)注公眾號「Code滿滿」或者是博客「李益的小站」熄诡。另外此處推薦一個比較詳細的系列文章:《Django+Docker容器化部署》,本文亦參考了此系列文章诗力。

最后附上gunicornnginx的配置文件內(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;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市引有,隨后出現(xiàn)的幾起案子瓣颅,更是在濱河造成了極大的恐慌,老刑警劉巖弄捕,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異导帝,居然都是意外死亡斋荞,警方通過查閱死者的電腦和手機凤优,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜈彼,“玉大人筑辨,你說我怎么就攤上這事⌒夷妫” “怎么了棍辕?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長还绘。 經(jīng)常有香客問我楚昭,道長,這世上最難降的妖魔是什么拍顷? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任抚太,我火速辦了婚禮,結(jié)果婚禮上昔案,老公的妹妹穿的比我還像新娘尿贫。我一直安慰自己,他們只是感情好踏揣,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布庆亡。 她就那樣靜靜地躺著,像睡著了一般呼伸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钝尸,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天括享,我揣著相機與錄音,去河邊找鬼珍促。 笑死铃辖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的猪叙。 我是一名探鬼主播娇斩,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼穴翩!你這毒婦竟也來了犬第?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤芒帕,失蹤者是張志新(化名)和其女友劉穎歉嗓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體背蟆,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡鉴分,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年哮幢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片志珍。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡橙垢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伦糯,到底是詐尸還是另有隱情柜某,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布舔株,位于F島的核電站莺琳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏载慈。R本人自食惡果不足惜惭等,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望办铡。 院中可真熱鬧辞做,春花似錦、人聲如沸寡具。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽童叠。三九已至框喳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厦坛,已是汗流浹背五垮。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杜秸,地道東北人放仗。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像撬碟,于是被迫代替她去往敵國和親诞挨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容