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

需要登入才可留言!

类似文章


Synology,haproxy

用HAProxy移除Sysnolgy Mail Station的/mail路径

本文就DSM7的版本做说明。Synology Nas的包中心提供两种Mail Server,一种为Synology Mail Server,另一个为Synology MailPlus。对我来说Synology MailPlus好处,他可以在登录入口中,轻松指定域名,但限制最多五个帐号,多的就要买授权了。那如果使用Synoloyg Mail Server,则不会有帐号数的限制,但是他并没有集成登录入口,如果安装了Mail Station的webmail,会在网址的目录多一个/mail的路径,虽然不碍事,但我就是不喜欢。

laravel,oauth2

我最常用的Laravel passport命令

Laravel提供了相当多好用的Package,像Passport就是其中之一,当网站需要自架OAuth2验证主机时,真的是省时省力。本站为例,因为采前后台分离机制(有两个不同的Laravel项目),我都透过前台的WEB进行验证。基本上,我还有很多其他不同的项目,也都靠Laravel提供的OAuth2就搞定跨域验证。

laravel,livewire

livewire重要笔记

在开始您的 Livewire 之旅之前,以下是关於公开属性(public properities)的三项基本注意事项:一、属性名称不能与为 Livewire 保留的属性名称冲突(例如$rules或$message)二、保存在公开属性(public properities)中的数据,对前端 JavaScript 是可见的。因此,您不应在其中保存敏感数据。三、属性只能是 JavaScript 友好的数据类型(字符串、整数、数组、布尔值),或以下 PHP 类型之一:Stringable、Collection、DateTime、Model、EloquentCollection。