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