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

需要登入才可留言!

類似的文章


laravel

Facebook的測試用戶

是否有人跟我一樣網站用OAuth進行網站的使用者登入,在Facebook的開發者頁面有一個「測試用戶」, 可以用來測試Facebook的功能是否正常, 因為網站搬家到Google的GCE時,不知何故,我居然在Laravel的User的model中$fillable的array內多貼了一個~, 一般情況下程式都正常運作,但是在新使用者登入時,就出錯給你看。 一直聽到有人說,沒法登入這個網站留言,我想說,我都很正常呀。@@ 今天使用測試用戶測試後,哈,發覺我的網站上的登入功能根本壞很久了。

laravel,dotenv,seo

我如何依子域名動態載入Laravel不同的dotenv檔

開始前先來抱怨一下,本來我的網站可以依使用者的瀏覽器自動顯示不同的語系的。這有何不可,但Google的SEO似乎不喜歡這麼搞,他建議每種語言使用不同的網址,不要用cookie或瀏覽器設定來調整網頁內容,好吧那我只能乖乖就範了。他的建議作法,第一種方案:依國家區分,像是example.tw或example.de這真的天方夜譚怎麼可能,要嘛收購被註冊的域名,要不然取個全球沒人會取的怪域名還比較有機會。第二種方案:用子域名區分,這正式我準備要做的,等等來說明在Laravel中怎麼弄。第三種方案:example.com/tw/ 之類的,Apple好像就這麼弄的。第四種方案:site.com?loc=tw之類,不建議使用,確實我也覺的這個不是一個好主意。

laravel

Laravel上的jenkins CI Server pipeline基本運用教學

您想透過docker建立持續整合及交付的CI Server給Laravel使用嗎? 在CI Server上執行laravel dusk及phpunit輕鬆搞定自動化測試,及相關記錄。 看完本篇或許您會發現CI/CD有多簡單。 我指基本的運用。