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,laravel,nfs

Docker在macOS上的NFS

D-laravel的nfs模式,在这篇文章您可以了解到,如何在macOS使用NFS+Docker。

d-laravel, docker, docker-compose, laravel

D-Laravel释出v0.9.1版了

为了让D-Laravel保持在一个可运作的版本及稳定的本。 开始使用Tag标注该版本通过测试那些测试.. 这个版本已通过ubuntu实及macos实机测试,可顺利创建Container及运行哦..

laravel,Laravel security

Laravel调试模式锁IP

Laravel的调试模式相当丰富,Laravel官网有提醒,在本地端开发可设置APP_DEBUG为true,但是在产品环境,这个值必需永远都是False。