我有一个用 PHP 构建的 CMS,它在磁盘上的文件中存储页面列表、页面导航结构和页面内容。此应用程序托管在 haproxy 服务器后面的 Apache/php-fpm 服务器集群上。这些服务器通过 NFS 从中央文件服务器挂载 Apache DocumentRoot 目录,因此从 CMS 所做的所有更改都会写入 NFS 共享上的文件。
我发现,除非我使用该noac选项挂载 NFS 共享,否则所做的更改可能需要 5-10 秒才能传播到集群中的所有服务器;这意味着当快速连续进行多次更改时,最终更改有时会覆盖较早的更改,因为最终更改可能会发送到尚未收到较早更改的服务器。
但是,在使用noac挂载选项时,访问者端访问内容会有2-5秒的延迟,这是完全不能接受的。
有没有办法以编程方式强制更改 NFS 共享上的文件以传播到所有客户端,或者使所有客户端刷新该文件的缓存?
我们正在设置 MySQL 主从复制,一切正常。
当前所有负载(读/写)都将转到主服务器。我们的应用程序有 99% 的读取和 1% 的写入。
我们考虑将负载(仅读取)分配给 Master 和 Slave。所以我们想到了使用 HAProxy 将负载分配到两个 MySQL 服务器。
我们的要求是所有写入都重定向到主服务器,读取在主服务器和从服务器之间分配。
我有一台运行 kibana 的服务器,我已将其设置为从本地主机访问。这是一个 linux 服务器,所以我可以这样做:
links http://localhost:5601
Run Code Online (Sandbox Code Playgroud)
这运行良好。我需要将此 kibana 服务器置于 HAProxy 之后,它将充当 Kibana 的反向代理。
我的 Haproxy 配置文件(/etc/haproxy/haproxy.cfg)看起来像
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode …Run Code Online (Sandbox Code Playgroud) 我有 2 个虚拟主机
app.example.com:80 在 IP 地址上 xxx.xxx.xxx.xxx
app2.example.com:80 在 IP 地址上 yyy.yyy.yyy.yyy
我的haproxy ipaddress是 sss.sss.sss.sss
这是 haproxy 配置:
global
log 127.0.0.1 local0 notice
maxconn 2000
user haproxy
group haproxy
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
timeout connect 5000
timeout client 10000
timeout server 10000
frontend www-http
mode http
bind *:80
default_backend appname
stats enable
stats uri /haproxy?stats
stats auth admin:password
stats show-node
backend appname
balance roundrobin
option httpclose
option forwardfor
server lamp1 …Run Code Online (Sandbox Code Playgroud) 我有使用 http 和 https 的 haproxy v1.5.4。我将 *:80 & :*443 绑定到相同的前端并使用相同的 acl。
我想创建一个 http -> https 重定向
frontend http-in
bind *:80
bind *:443 ssl crt /etc/pki/tls/certs/...
...
acl is_office path_beg /office
http-request redirect scheme https if !{ ssl_fc } is_office
use_backend office if is_office
Run Code Online (Sandbox Code Playgroud)
这引起
10.XXXXX:36909 [16/Dec/2015:17:23:07.678] http-in/2: SSL handshake failure
Run Code Online (Sandbox Code Playgroud)
当我通过 http 访问时(期待重定向)
如果我通过 https 访问,那么它会正确地访问后端并通过 443 代理通过服务。
backend office
balance roundrobin
server backbone-daily 10.XXXXXX:443 ssl check verify none
Run Code Online (Sandbox Code Playgroud)
自签名证书无需重定向即可验证和工作。感觉就像我在重定向阶段遗漏了一些东西。
非常感谢任何帮助
我使用 Haproxy 作为 SSL 终止来识别客户端证书。我想检查客户端证书中的 CN 值是否与客户端发送的标头值匹配。如果证书中的 CN 值与标头中的值不匹配,有没有办法设置 ACL?
就像是:
http-request set-header X-SSL-Client-CN %{+Q}[ssl_c_s_dn(cn)]
acl id_not_match hdr(client-id) -m hdr(X-SSL-Client-CN)Run Code Online (Sandbox Code Playgroud)
我正在尝试docker kill -s HUP <container>在 Ansible 中完成,但看起来我尝试的选项总是重新启动容器或尝试而不是重新加载配置。
运行以下命令允许我在不重新启动容器的情况下重新加载配置:
docker kill -s HUP <container>
Ansibledocker_container文档建议了以下选项:
force_kill停止正在运行的容器时使用 kill 命令。
kill_signal覆盖用于终止正在运行的容器的默认信号。
单独使用kill_signal没有任何作用。
下面是我希望能起作用的一个例子:
- name: Reload haproxy config
docker_container:
name: '{{ haproxy_docker_name }}'
state: stopped
image: '{{ haproxy_docker_image }}'
force_kill: True
kill_signal: HUP
Run Code Online (Sandbox Code Playgroud)
我假设覆盖force_kill并kill_signal会给我所需的行为。我也尝试将状态设置为“开始”和present.
这样做的正确方法是什么?
运行Web应用程序背后HAProxy的1.6.3-1ubuntu0.1,我越来越HAProxy的统计qtime,ctime,rtime,ttime值0,0,0,2704。
从文档(https://www.haproxy.org/download/1.6/doc/management.txt):
58. qtime [..BS]: the average queue time in ms over the 1024 last requests
59. ctime [..BS]: the average connect time in ms over the 1024 last requests
60. rtime [..BS]: the average response time in ms over the 1024 last requests
(0 for TCP)
61. ttime [..BS]: the average total session time in ms over the 1024 last requests
Run Code Online (Sandbox Code Playgroud)
我期望响应时间在 0-10 毫秒范围内。ttime2704 毫秒似乎高得不切实际。是否有可能单位关闭,这是 2704 微秒而不是 2704 毫秒?
其次,它ttime …
一段时间不活动后,我的 go web 服务在执行第一个 postgres sql 查询时收到一条net.OpError消息read tcp x.x.x.x:52086->x.x.x.x:24414: read: connection reset by peer。错误后,后续请求将正常工作。
postgres 数据库由 compose.com 托管,它在 postgres db 前面有 haproxy。我的 go web 应用程序使用标准 sql 和 sqlx。
我试过db.Ping()每 15 分钟运行一次自动收报机,但这并没有解决问题。
为什么 go 标准sql库不处理这些连接中断?
我需要从云功能访问谷歌云内存存储,但我知道它还不受支持,所以我尝试解决方法在我的 kubernetes 集群中添加 haproxy 并使其可以使用来自负载均衡器类型的 kubernetes 服务公开访问,并将 tcp 请求转发到内存存储。
它对我很好,我可以从云功能连接到我的 memorystore 实例,但只有我遇到的问题,我需要修复它以在 haproxy 级别或 memorystore 级别保护 memorystore,我尝试向 memorystore 添加密码但我发现 CONFIG 命令被禁用。
这是我的 haproxy 配置:
frontend redis_frontend
bind *:6379
mode tcp
option tcplog
timeout client 1m
default_backend redis_backend
backend redis_backend
mode tcp
option tcplog
option log-health-checks
option redispatch
log global
balance roundrobin
timeout connect 10s
timeout server 1m
server redis_server 10.0.0.12:6379 check
Run Code Online (Sandbox Code Playgroud)
那么有什么建议吗?
haproxy google-cloud-platform kubernetes google-cloud-memorystore
haproxy ×10
ssl ×2
ansible ×1
compose-db ×1
devops ×1
docker ×1
file-io ×1
go ×1
kibana-4 ×1
kubernetes ×1
latency ×1
master-slave ×1
metrics ×1
mysql ×1
networking ×1
nfs ×1
php ×1
postgresql ×1
redirect ×1
sqlx ×1