HAProxy 설치
우분투 22.04 기준 패키지 매니저로 설치한다.
apt install 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 expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
ssl-default-bind-options no-sslv3
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-server-options no-sslv3
ssl-default-server-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
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
####################################################
listen stats
bind *:8080
stats enable
stats uri /
stats realm HAProxy\ Statistics
stats auth admin:1234
stats refresh 5s
####################################################
# jongwan.com
####################################################
frontend jongwan_com-front
mode http
bind 172.16.0.10:80
redirect scheme https code 301 if !{ ssl_fc }
frontend jongwan_com-ssl-front
mode http
bind 172.16.0.10:443 ssl crt /etc/haproxy/ssl/_wildcard_jongwan_com.pem
default_backend jongwan_com-backend
backend jongwan_com-backend
mode http
option httpchk
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
server www1 10.0.0.1:80 check weight 1
server www2 10.0.0.2:80 check weight 1 backup
listen stats
bind *:8080
stats enable
stats uri /
stats realm HAProxy\ Statistics
stats auth admin:1234
stats refresh 5s
stat은 8080포트로 바인딩하고 암호를 설정해준다.
frontend jongwan_com-front
mode http
bind 172.16.0.10:80
redirect scheme https code 301 if !{ ssl_fc }
프런트앤드를 추가한다.
- bind : 외부에서 접근하는 아이피 (공인아이피)
- redirect : https 포트로 리다이렉트한다.
frontend jongwan_com-ssl-front
mode http
bind 172.16.0.10:443 ssl crt /etc/haproxy/ssl/_wildcard_jongwan_com.pem
default_backend jongwan_com-backend
HTTPS 프런트앤드를 설정한다.
- bind : 외부에서 접근하는 아이피를 입력한다. PEM 형식의 인증서를 추가해야 하고 아래쪽에 만드는 방법이 있다.
- default_backend : 기본 백앤드
backend jongwan_com-backend
mode http
option httpchk
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
server www1 10.0.0.1:80 check weight 1
server www2 10.0.0.2:80 check weight 1 backup
- mode : http 방식으로 health 체크를 한다. ssl 확인을 위해 header를 사용하기 때문에 tcp로 하면 동작하지 않는다.
- server : 실제 웹서버 정보를 입력한다. 사용자와 통신은 443 (SSL) 통신을 하지만 haproxy와 webserver간에는 80으로 통신한다.
아파치 웹서버 설정
<VirtualHost *:80>
ServerAdmin aiseki@gmail.com
DocumentRoot /home/jongwan/public_html
ServerName jongwan.com
ServerAlias www.jongwan.com
<Directory /home/jongwan/public_html/>
Options FollowSymLinks
AllowOverride FileInfo
Require all granted
</Directory>
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 172.16.0.10/24
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
- RemoteIPHeader X-Forwarded-For : 사용자는 haproxy를 통해서 웹서버에 접근하기 때문에 실제 웹서버 로그에는 haproxy 아이피가 나온다. 이때 haproxy는 X-Forwarded-For 헤더에 클라이언트의 실제아이피를 담아준다.
mod_remoteip 모듈을 활성화하고 해당 옵션을 이용하면 아파치가 실제 클라이언트 아이피를 가져올 수 있다.
PHP의 경우 REMOTE_ADDR 값에 영향을 준다. - RemoteIPInternalProxy : haproxy 아이피 대역을 입력한다.
mod_remoteip 활성화하기
a2enmod remoteip
PEM 인증서 생성하기
key, crt 파일을 이용해서 pem 형식의 인증서를 만드는 방법이다.
합친파일에서 ^M 문자열이 있을 경우 오류가 나기 때문에 tr 명령을 이용해서 삭제해준다.
cat _wildcard_jongwan_com_SHA256WITHRSA.key _wildcard_jongwan_com.crt ChainCA/rsa-dv.chain-bundle.pem | tr -d '\015' > _wildcard_jongwan_com.pem