如何讓 Discourse 與其它網站共存在同一台機器上

目的:wordpress 和 discourse 服務 並存在同一台機器裡
觀看最好能具備…

  • docker 使用經驗
  • nginx 設定經驗

How

  • discourse 透過 docker 安裝建置服務
  • 利用 docker 建置 nginx+mysql+php-fpm

.
.

ref. 其中第一、第二篇文章很重要


discourse docker app 內有自己的 nginx 服務
所以需要先把 discourse docker container

./launcher stop app

discourse 修改重點

containers/app.yml 內

templates
停用: - “templates/web.ssl.template.yml”
新增: - “templates/web.socketed.template.yml”

停用/曝光 port
expose:
#- “80:80” # http
#- “443:443” # https

ps: 如果有使用 https(ssl) 也一並停用上面相對應的設定

調整完後, 重建 discourse docker 服務, 並啟動他

./launcher rebuild app
./launcher start app

.
.

建立 nginx+mysql+php-fpm

我們需要有另一個 nginx 做全站網站導向~
用另一個 docker-compose 建立 nginx, mysql, php-fpm 這些服務
git clone https://github.com/cscolabear/docker-dev
(記得另外使用(加入) mysql branch)

docker-compose.yml 稍做調整

version: '2.2'

services:
  fpm:
    hostname: docker-php-fpm
    build:
      context: ./Dockerfiles/php-fpm
    image: cscolabear/7.2-fpm:latest
    ports:
      - 9000:9000
    volumes:
      - /var/www:/var/www
      - ./Dockerfiles/php-fpm/php.ini:/usr/local/etc/php/php.ini
    mem_limit: 256m
    restart: on-failure
    depends_on:
      - mysql
    extra_hosts:
      - "localhost:172.16.1.50"
    networks:
      app_net:
        ipv4_address: 172.16.1.40

  mysql:
    hostname: docker-mysql
    image: mysql:5.7
    ports:
      - 3306:3306
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - ./Database/mysql:/var/lib/mysql
    mem_limit: 256m
    environment:
      MYSQL_ROOT_PASSWORD: roor_password
      MYSQL_USER: non_user
      MYSQL_PASSWORD: non_password
    command: mysqld --sql_mode="" --character-set-server=utf8 --init-connect='SET NAMES UTF8;'
    restart: on-failure
    networks:
      - app_net

  nginx:
    hostname: docker-nginx
    build:
      context: ./Dockerfiles/nginx
    image: cscolabear/nginx:latest
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/www:/var/www
      - ./Logs:/var/log/nginx
      - ./Dockerfiles/nginx/sites-enabled:/etc/nginx/sites-enabled
      - /var/discourse/shared/standalone:/var/discourse/shared/standalone
    mem_limit: 32m
    depends_on:
      - fpm
    restart: on-failure
    networks:
      app_net:
        ipv4_address: 172.16.1.50

  workspace:
    hostname: docker-workspace
    build:
      context: ./Dockerfiles/workspace
    image: cscolabear/workspace:latest
    #ports:
            #- "22:22"
    volumes:
      - /var/www:/var/www
    depends_on:
      - fpm
      - mysql
    restart: on-failure
    extra_hosts:
      - "localhost:172.16.1.50"
    tty: true
    networks:
      app_net:
        ipv4_address: 172.16.1.30

networks:
  app_net:
    driver: "bridge"
    ipam:
      config:
        - subnet: 172.16.1.0/16

ps:

  • 為了mem_limit 降版為 2.2
  • nginx volumes 的設定別忘, 設定相對應目錄
  • workspace 可以不用掛載
// 由 master 開一個新的 branch
git branch wordpress

// 將 my-sql 合併, 建立一個 nginx, mysql, php-fpm 的 docker-compose.yml
git fetch origin service/add-mysql && git merge service/add-mysql

接著就可以依 https://github.com/cscolabear/docker-dev/blob/master/README.md 上的流程建立 docker container

ref.

初次建立需要一點時間~~~


安裝、建立完成, 可以執行指令查看 docker 運作狀況, cpu, memory 使用情形

docker stats


ps: 該圖內 docker 啟用了四個服務 php-fpm, nginx, mysql, discourse app

上述 git repo 放在這個位置 /var/www/docker-dev
(其實不要放這比較好; /var/docker-dev 可能比較適合)

/var/www 這個目錄下的東西被定義是曝光到前端的網站

建立測試網站

先建立一個測試站目錄
/var/www/test

新增一個 php 檔做為測試
/var/www/test/index.php
內容為…

<?php
phpinfo();

用 php 檔做測試, 測試 nginx 和 php-fpm 是否正常啟用

記得將 dns/domain 指向指定的 IP
e.g. test.workxplay.net

設定 nginx 接收 domain 後要指定哪個資料夾目錄


ps: 該目錄下副檔名為 conf 才會被 nginx 載入

一般來說, 會把 domain 當成 .conf 的主檔名

e.g. test.workxplay.net.conf

server {
    listen 80; listen [::]:80;
    server_name test.workxplay.net;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;  listen [::]:443 ssl http2;

    ssl_certificate      /var/discourse/shared/standalone/ssl/uni.workxplay.net.cer;
    ssl_certificate_key  /var/discourse/shared/standalone/ssl/uni.workxplay.net.key;

    server_name test.workxplay.net;

    root /var/www/test.workxplay.net;
    index index.html index.htm index.php;

    access_log /var/log/nginx/test.workxplay.net.access.log main;
    error_log /var/log/nginx/test.workxplay.net.error.log;

    charset utf-8;
    autoindex off;

    error_page 403 = 404;
    error_page 404 /404.html;

    location ~ /\.ht {
        deny all;
    }
   
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass fpm:9000;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_read_timeout 600;
        include fastcgi_params;
    }
}

ps: 設定路徑時注意 docker 內和本機的路徑關係

也可以試著用 nginx tools 自動產出

將新建好的 nginx conf 放到下面位置
/var/www/docker-dev/Dockerfiles/nginx/sites-enabled/

接著重啟 docker 內的 nginx

sudo docker-compose restart nginx

接著 test.workxplay.net 這個 domain 就可以看見測試頁面了

外部 nginx 導向 discourse docker container

同上面動作,新建一個 nginx conf; 並指向 uni.workxplay.net

e.g.

server {
    listen 80; listen [::]:80;
    server_name uni.workxplay.net;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;  listen [::]:443 ssl http2;
    server_name uni.workxplay.net;

    ssl_certificate      /var/discourse/shared/standalone/ssl/uni.workxplay.net.cer;
    ssl_certificate_key  /var/discourse/shared/standalone/ssl/uni.workxplay.net.key;
    ssl_session_tickets off;

    http2_idle_timeout 5m; # up from 3m default

    location / {
        proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
        #proxy_set_header Host $http_host;
        proxy_set_header Host https;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location ~ /\. {
        access_log off;
        log_not_found off;
        deny all;
    }
}

ps: 設定路徑時注意 docker 內和本機的路徑關係

重啟外部的 nginx, 試著用瀏覽器打開 uni.workxplay.net :slight_smile:

障礙排除

Q. docker 服務啟用沒反應、失敗
A.

docker-compose logs

查看所有 docker 服務的log

1 Like

:dizzy_face: 是一整篇咒語嗎