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-storage,sftp

用Laravel的Storage SFTP Drvier进行远程文件上传

为何我把网站的搞前后台分离,我的想法很简单,就是靠一套后台管控所有前台的网站数据。假设前台的网站为单纯的行销网站,那不外乎主题内容,就是上上文章那种,没有什么特别复杂的逻辑。所以后台的数据库设记好连不同的前台就好了,那还剩最后一个问题,我的后台HTML编辑器如何贴图直接贴文到前台呢?Laravel的Storage SFT Driver就是很好的解药。

dlaravel

D-Laravel 释出 v1.1.5

因应Laravel 5.5推出了,刚好php也出了php 7.0.23及php 7.1.9版了。 D-Laravel使用的fpm版本也进行更新罗...只要调整您的docker-compose所定义的版本 即可使用最新的php罗...

laravel

我如何升级后台到Lravel 5.5

我的后台一开始是自己打造的框架,一样采用MVC架构,自己做的数据库连线及环境设置档等,包含自己的样版语法,直到我想要去支持Restful时, 有个想法,别人都写好了我何必自己去重写同样的功能,写出来会比较好吗? 所以开始改用框架, 一开始采用Slim,主要因为他对於php的支持版本较低,但由於的Slim的twig templates没有Laravel的blade template好用...