docker-compose之Nginx二級目錄反向代理禪道

本次項目會用到3個鏡像分別是nginx、mysql 和禪道,以後若遷移服務器環境則只需下載這3個鏡像即可

mysql與禪道鏡像下載與構建參考:mysql   禪道

 

目錄介紹

cloud                                # 文件名
+----mysql_db                        # mysql的掛載目錄,掛載到容器
|    +----mysqld.cnf                 # mysql的配置文件,掛載到容器
+----nginx                      
|    +----conf.d                     # nginx服務配置目錄,掛載到容器
|         +----default.conf          # nginx服務配置文件,掛載到容器
|    +----log 
|         +----host.access.log       # nginx日誌文件,掛載到容器
|         +----error.log             # nginx錯誤日誌文件,掛載到容器
|    +----html
|         +----50x.html              # nginx報錯50X返回頁面
+----zentao                          # 禪道掛載目錄,掛載到容器
+----.env                            # docker-compose環境變量配置文件
+----docker-compose.yml              # docker-compose的運行文件

配置

環境變量 — .env文件

# mysql信息配置
MYSQL_IMAGE=mysql:5.7
MYSQL_ROOT_PASSWORD=password
MYSQL_IP=192.110.0.2

# 禪道信息配置
ZENTAO_IMAGE=zentao:latest
ZENTAO_IP_BACKEND=192.110.0.10
ZENTAO_IP_FRONTEND=182.120.0.3

# nginx信息配置
NGINX_IMAGE=nginx:mainline-alpine-perl
NGINX_IP=182.20.0.2

# network信息配置
BACKEND_SUBNET=192.110.0.0/16
FRONTEND_SUBNET=182.120.0.0/16

docker-compose.yml

version: '3.1'

services:
  mysql:
    image: ${MYSQL_IMAGE}                                            # mysql鏡像
    container_name: "mysql_5.7"                                      # 容器名稱
    volumes:
      - ./mysql_db/mysqld.cnf:/etc/mysql/mysql.conf.d/               # 掛載mysql配置文件
      - ./mysql_db/datadir:/var/lib/mysql/                           # 掛載mysql數據文件
    restart: always                                                  # 開機啓動
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}                   # 設置ROOT賬號密碼
    ports:
      - "3306:3306"
    networks:
      my_backend:                                                    # 加入網絡-my_backend
        ipv4_address: ${MYSQL_IP}                                    # 指定的IP地址


  zentao:
    image: ${ZENTAO_IMAGE}                                           # 禪道鏡像
    container_name: "zentao_latest"                                  # 容器名稱
    volumes:
      - ./zentao/zentaopms:/app/zentaopms                            # 掛載禪道源碼路徑
      - ./zentao/mysql:/var/lib/mysql                                # 禪道自帶的mysql掛載到本機
    restart: always                                                  # 開機啓動
    environment:
      - MYSQL_ROOT_PASSWORD=password                                 # 禪道鏡像mysql的root賬號密碼
    ports:
      - "80:8010"                                                    # 容器80端口映射宿主機8010端口
    networks:
      my_backend:                                                    # 加入網絡-my_backend
        ipv4_address: ${ZENTAO_IP_BACKEND}                           # 指定IP地址
      my_frontend:                                                   # 加入網絡-my_frontend
        ipv4_address: ${ZENTAO_IP_FRONTEND}                          # 指定的IP地址


  nginx:
    image: ${NGINX_IMAGE}                                            # nginx鏡像
    container_name: "nginx_latest"                                   # 容器名稱
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d                             # 掛載nginx配置文件
      - ./nginx/log/host.access.log:/var/log/nginx/host.access.log   # 掛載nginx日誌文件
      - ./nginx/html:/usr/share/nginx/html                           # 掛載nginx首頁
    restart: always                                                  # 開機啓動
    ports:
      - "80:80"                                                      # 容器80端口映射宿主機80端口
      - "443:443"                                                    # 容器443端口映射宿主機443端口
    networks:
      my_frontend:                                                   # 加入網絡-my_frontend
        ipv4_address: ${NGINX_IP}                                    # 指定的IP地址


networks:

  my_backend:                                                        # 自定義網絡-my_backend
    driver: bridge                                                   # 定義的網絡模式
    ipam:
      config:
        - subnet: ${BACKEND_SUBNET}                                  # 定義網段
        
  my_frontend:                                                       # 自定義網絡-my_frontend
    driver: bridge                                                   # 定義的網絡模式
    ipam:
      config:
        - subnet: ${FRONTEND_SUBNET}                                 # 定義網段

mysql配置文件mysqld.cnf

[mysqld]
explicit_defaults_for_timestamp=true
character-set-server=utf8
collation-server=utf8_unicode_ci
init_connect='SET NAMES utf8;'
max_allowed_packet=10M
wait_timeout=288000
interactive_timeout = 288000
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
skip-name-resolve
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql/
symbolic-links=0

nginx配置文件default.conf

server {
    listen       80;
    server_name  localhost/zentaopms;
    
    # 日誌
    access_log  /var/log/nginx/host.access.log  main;

    # 錯誤日誌
    error_log /var/log/nginx/error.log error;
    
    # 二級目錄代理禪道
    location /zentaopms {
        proxy_pass      http://182.120.0.3/zentaopms;
        proxy_redirect  off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 首頁
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # 50X錯誤頁
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

部署

sudo docker-compose up -d
# 以守護進程模式運行(-d)

查看網絡

docker network ls

docker新增了兩個網絡定義的網絡 — filename_my_backend 和 filename_my_frontend,如圖:

 

查看容器的運行情況

docker ps -a

禪道安裝配置參考博客:Docker部署安裝禪道

容器啓動運行成功,如圖:

修改禪道源碼

通過8010端口訪問禪道並安裝成功

修改禪道配置文件my.php

sudo vim  /app/zentaopms/config/my.php

# 將 $config->requestType修改成GET   $config->webRoot修改成你的二級目錄/zentaopms/
# $config->requestType     = 'PATH_INFO';
$config->requestType     = 'GET';
# $config->webRoot         = getWebRoot();
$config->webRoot         = '/zentaopms/';

重啓禪道容器後, 訪問禪道發現了個問題:禪道的靜態資源無法加載(因爲二級目錄問題,無法正確獲取),修改nginx配置對靜態文件做個處理,在配置文件default.conf加個location, 如下:

# 靜態文件代理到nginx下/usr/share/nginx/html/
location ~*\.(ico|gif|jpg|jpeg|png|bmp|swf|css|js|eot|svg|ttf|woff|woff2|properties|json)$ {
	root /usr/share/nginx/html/;
    }

將禪道源代碼下的靜態複製到/usr/share/nginx/html/zentaopms, nginx的/usr/share/nginx/html/文件和禪道源碼源碼都掛載到了宿主機,直接宿主機下操作就可以,這樣子nginx的html文件儲存靜態文件,相當於一個cdn的作用,複製結果如下:

如此,客戶端瀏覽器就可通過二級目錄訪問禪道, 如下圖:

 

不積跬步無以至千里

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章