我是 HAProxy 的新手,我想用它将 HTTPS 传入请求重定向到我的 HTTP 后端服务器。
我知道,如何使用 Nginx 来实现这一点,就像这样:
#SSL for all
server {
listen 443 ssl ;
server_name www.example.com;
absolute_redirect off;
proxy_redirect off;
access_log /var/log/nginx/example.com-ssl-access.log;
error_log /var/log/nginx/example.com-ssl-error.log;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1 ;
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
location / {
proxy_pass http://bo.example.com;
}
}
但我不知道如何使用 HAProxy 来做到这一点?
我已经尝试了几种方法。但每次都只有 HTTPS 到 HTTPS 的重定向。
你能帮助我吗 ?
这是我当前的 HAProxy 配置:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 5s
user haproxy
group haproxy
daemon
tune.ssl.default-dh-param 2048
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
stats enable
stats hide-version
stats refresh 30s
stats uri /hastats
frontend www-http
# Frontend listen port - 80
bind *:80
#Mode de fonctionnement
mode http
reqadd X-Forwarded-Proto:\ http
# Test URI to see if its a letsencrypt request
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
use_backend letsencrypt-backend if letsencrypt-acl
# Set the default backend
default_backend www-backend
# Enable send X-Forwarded-For header
#option forwardfor
#option httpchk GET /
# log reqs http
#option httplog
# acl
#acl prod_acl hdr(host) prod.local
#use_backend apache_backend_servers if prod acl
# Define frontend ssl
frontend www-ssl
bind *:443 ssl crt /etc/haproxy/certs/example.com.pem
reqadd X-Forwarded-Proto:\ https
default_backend www-backend
# define backend
backend www-backend
mode http
option httpchk
option forwardfor except 127.0.0.1
http-request add-header X-Forwarded-Proto https if { ssl_fc }
redirect scheme http if { hdr(Host) -i example.com } { ssl_fc }
balance roundrobin
#Define the backend servers
server web1 XXX.XXX.XXX.101 check inter 3s port 80
server web2 XXX.XXX.XXX.102 check inter 3s port 80
backend letsencrypt-backend
server letsencrypt 127.0.0.1:8080
答案1
我准备了一个干净的工作示例,您可以从中设置干净的配置并添加所需的功能。一般来说,我教给学习不同应用程序和主题的人的是,他们应该能够理解每行配置的基本功能。
这可以通过以下方式实现阅读文档围绕主题,进行逻辑思考。
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
tune.ssl.default-dh-param 2048
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend www
bind *:80
bind *:443 ssl crt /etc/ssl/localcerts/apache-full.pem
option forwardfor
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
use_backend letsencrypt-backend if letsencrypt-acl
default_backend www-backend
backend www-backend
option httpchk
balance roundrobin
server web1 10.0.0.1:80 check inter 3s
server web2 10.0.0.2:80 check inter 3s
backend letsencrypt-backend
server letsencrypt 127.0.0.1:8080
在上面的例子中,TLS 被正确终止并作为纯 HTTP 代理到上游(服务器)。
如果请求通过 HTTPS 发起,则标头“X-Forwarded-Proto”设置为“https”。否则将为“http”。
对上游的第 4 层检查不需要额外的端口,因为如果使用 IP 定义了端口,它也将自动用作检查端口。