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一些環境說明啦,有機會再進行補充。😁
No Comment
Post your comment