by Devin Yang

建立於: 1年前 ( 更新: 1年前 )

PHPENV已經加入了haproxy.yml的支援了囉,如果您有外網IP及域名,想弄HAProxy及憑證申請
透過deviny/phpenv 應該相當簡單。
本文就讓我們看看如何在PHPENV中的HAProxy環境中設定中使用HAProxy吧。

實際操作,也可以看看我YouTube上的說明:
https://youtu.be/eI2oxakC6pA

在phpenv的目錄下,haproxy.yml檔案內容如下:

version: '3.6'
services:
 haproxy:
  build:
    context: ./dockerfiles
    dockerfile: Dockerfile-haproxy
  image: ${PROJECT}_haproxy
  ports:
    - ${HTTP_PORT-80}:80
    - ${HTTPS_PORT-443}:443
  volumes:
    - ./etc/haproxy:/etc/haproxy
    - ./etc/haproxy/proxy.pem:/etc/ssl/phpenv/proxy.pem
    - ./etc/ssl:/etc/letsencrypt
  #-f <configuration file|dir>
  #command: /usr/local/sbin/haproxy -f /etc/haproxy -d
  networks:
    - dlaravel_net

networks:
    dlaravel_net:

在這個檔案中可以看到,他會去build,dockerfiles目錄下的Dockerfile-haproxy,為何要用HAProxy,因為他reload的速度超快,
對於憑證的更換使用者幾乎完全不會查覺,他的功能真的相當好用,不同的ACL可以導向不同的主機,而且極為穩定。

在phpenv的HAProxy設定中,所有的.well-known/acme-challenge都會打到本地端的backend port 8080。
透過這個機制,我們可以讓所有HAProxy的backend的主機,都不需要建資料夾就能申請Let's encrypt的憑證囉。

phpenv中的HAProxy環境設定檔非常簡單,我們可以自訂打名放到envs的資料夾,內容如下,其中PROJECT名稱可以依自己的喜歡設定。

DEFAULT=haproxy
PROJECT=ha
HTTP_PORT=80
HTTPS_PORT=443

在上方的設定中,有指定了DEFAULT=,代表當phpenv link到這個設定檔時,他會使用目錄下的haproxy.yml為他預設的YAML檔。

所以第一步,當我們在envs中建立好PHPENV的環境設定檔後,可執行一次./link進行連結

第二步,新環境中只需執行一次Build環境的image。

第三步就可以啟動看看囉
我們可以透過./start啟動,及./stop停止,然後也可以透過./console ps查看啟動的狀態。

如果啟動上出了問題,我們可以用./console up指令來查看,是否那裡出了問題

./console up

在我們完全沒有憑證的情況下,我們可以進入到容器中,執行如下指令,取得免費的SSL憑證

透過如下的指令可以進入到HAProxy的容器中

./console exec haproxy bash

進入容器後,就能用如下的指令申請憑證囉

certbot certonly --standalone --http-01-port 8080 --email devin@ccc.tc \
--dry-run \
--agree-tos --preferred-challenges http \
-d <your domain>

上方的--dry-run可以先試跑看看,確認沒問題後,再移除掉--dry-run跑正式,一直失敗太多次會被鎖起來不給申請。


後端主機的環境設定,我們可透過phpenv.cfg.example拷貝出來進行調整及修改,變成phpenv.cfg。

phpenv中的Backend是必需要有憑證檔案的,如果您用的是let's encrypt就把fullchain.pem跟privkey.pem合成一個檔,並存成proxy.pem即可。

  frontend phpenv
     mode http
     bind :443 ssl crt /etc/haproxy/proxy.pem alpn h2

     option forwardfor header X-Real-IP
     http-request add-header X-Real-IP %[src]
     http-request add-header X-Forwarded-For %[src]

     acl acme path_beg -i /.well-known/acme-challenge
     redirect scheme https code 301 if !{ ssl_fc } !acme

  acl SUBDOMAIN_url hdr_beg(host) -i SUBDOMAIN.duckdns.org

  use_backend SUBDOMAIN_server if SUBDOMAIN_url

  backend SUBDOMAIN_server
     mode http
     fullconn   10000
     cookie SITEID insert indirect nocache
     server SUBDOMAIN host.docker.internal:1050

在上例中,我們可以有很多的acl跟use_backend及backend,導向不同的後端。
如有需要,也可以同時有多個憑證檔案哦。

ind :443 ssl crt /etc/ssl/ccc.tc/ccc.tc.pem alpn h2,http/1.1 crt /etc/ssl/ccc.tc/demo.ccc.tc.pem alpn h2,http/1.1 crt /etc/ssl/ccc.tc/e-course.app.pem alpn h2,http/1.1


關於多ACL及backend的設定,大概像下方這樣:

frontend phpenv
   mode http
   bind :443 ssl crt /etc/haproxy/proxy.pem alpn h2

   option forwardfor header X-Real-IP
   http-request add-header X-Real-IP %[src]
   http-request add-header X-Forwarded-For %[src]

   acl acme path_beg -i /.well-known/acme-challenge
   redirect scheme https code 301 if !{ ssl_fc } !acme

acl a_url hdr_beg(host) -i aaa.ccc.tc
acl b_url hdr_beg(host) -i bbb.ccc.tc

use_backend a_server if a_url
use_backend b_server if b_url

#BACKEND A
backend a_server
   mode http
   fullconn   10000
   cookie SITEID insert indirect nocache
   server demo3tc-a host.docker.internal:1050

#BACKEND B
backend b_server
   mode http
   fullconn   10000
   cookie SITEID insert indirect nocache
   server demo3tc-a host.docker.internal:1051



對了,phpenv還能進行tcp的mapping,例如像下方這樣:

listen vscode
        bind *:8444
        option tcplog
        mode tcp
        acl network_allowed src 211.72.111.145 111.248.102.24
        tcp-request connection reject if !network_allowed
        server sagent 192.168.99.123:1443


以上就是phpenv的HAProxy一些環境說明啦,有機會再進行補充。😁

Tags: laravel letsencrypt haproxy

Devin Yang

文章內容無法一一說明,如果您有什麼不了解處,歡迎提問哦:)

No Comment

Post your comment

需要登入才可留言!

類似的文章


docker, d-laravel, docker-compose, laravel

docker-compose載入多個設定檔

我們會用docker --network建立多個container互連,但是如果四個container時, 是不是就要下四次docker run不同container的指令,殺了我吧, 本文介紹透過docker-compose這個yaml檔定義一次搞定多個container的建立。 了解如何用dokcer-compose -f 參數載入多個設定檔。 &nbsp;

dlaravel

如何啟動D-Laravel上的supervisor

由於queue workers是一個長期執行的程序,所以我們會需要一個程序管理員supervisor來監控Linux系統上的process是否持續運作,例如:當queue:work運作失敗時,可以自動重啟queue:work process。很幸運的D-Laravel已內建supervisor囉,所以不需要再自行安裝即可使用。 本文簡單的介紹,我們如何來啟動container內的supervisor。

laravel

如何使用Laravel的Validator自訂錯誤訊息

我們通常開發Laravel時,有時會進行欄位驗證,但使用Validator預設的訊息是英文的。 但當然想要有更精確顯示中文訊息顯示, 本文介紹,我如何使用Laravel的Validator自訂中文的訊息。