개발자 되어버리기
Springboot + Flutter Web + Apache2 + Let's Encrypt로 https 구성하기 본문
이전에는 let's encrypt가 플러터 통신할때 뭔가 안맞아서 zero ssl로 cname 찾아서 인증받고 그랬었는데..
이제는 문제가 해결된듯 하여 다시 Let's Encrypt를 사용하기로 마음먹었다.
기존에는 Springboot 자체적으로 https를 적용해왔었는데
이게 서비스가 많아지다 보니 그냥 웹서버 하나 두고 얘가 reverse proxy로 퍼다 나르는게 낫겠다 싶었다.
일단 기존 스프링부트에서 쓰던 인증서는 주석 처리 해준다.
#server:
# ssl:
# enabled: true
# key-store: ./cert_and_key.p12
# key-store-password: helloworld
# key-store-type: PKCS12
# key-alias: tomcat
우분투부터 업데이트 해준다.
sudo apt-get update
아파치도 야무지게 설치해주고 시작해준다.
sudo apt install apache2
sudo systemctl start apache2
sudo systemctl enable apache2
그리고 Certbot 설치 해준다.
sudo apt install certbot python3-certbot-apache
나는 pwmw.xyz 라는 도메인을 사용하므로 같이 넣어준다.(www 도 쓰면 추가해주자. 나는 참고로 안 씀)
sudo certbot --apache -d pwmw.xyz -d www.pwmw.xyz
아마 이메일 입력하라고 나왔던 것 같은데 적당히 입력해주자.
추후 Certbot이 기본적으로 갱신 스케줄러를 설정하기에 재갱신 걱정은 없다고 한다.
인증서 발급까지 잘 되었으면 이후에도 발급이 잘 될지 봐야하니 테스트를 해준다.
sudo certbot renew --dry-run
그러면 아래와 같이 무언가 물어본다.
1: Attempt to reinstall this existing certificate
2: Renew & replace the certificate (may be subject to CA rate limits)
- 1번: 인증서가 손상되었거나 문제가 있어서 다시 설치해야 한다면 선택.
- 2번: 인증서를 새로 갱신하고 교체하려면 선택.
하게 되면 기존 인증서를 재설치할건지( 1 번 ) 새로운 인증서를 다시 발급받을건지( 2 번 ) 물어보는데 Lets Encrypt에서는 매주 50번의 갱신 요청을 하기 때문에 걱정없이 2번으로 하면 된다.
아마 여기까지는 다들 기본적으로 하는 세팅이다.
문제는 지금부터다.
나는 8080, 9010, 9011, 9020, 9021을 https로 쓸 예정이다. 이는 아파치에서 바인딩 시켜줘야하는 포트들이다.
실제 스프링부트는 19020, 19021 포트로 실행될 예정이다.
우선 관련 포트들을 우분투에서 받아줄 수 있도록 열어줘야 한다.
sudo ufw allow 8080
sudo ufw allow 9010
sudo ufw allow 9011
sudo ufw allow 9020
sudo ufw allow 9021
Flutter web에서 쓰일 포트는 9010과 9011이다.
Springboot로 들어갈 코드는 9020과 9021이다.
먼저 Flutter web에서 쓰일 설정값을 써보겠다.
sudo vim /etc/apache2/sites-available/default-ssl.conf
전체 파일 구조는 이러하다.
Springboot에서는 웹소켓도 사용하고 있기에 관련 설정이 추가 된다.
<IfModule mod_ssl.c>
<VirtualHost _default_:8080>
ServerAdmin dev@pwmw.xyz
ServerName pwmw.xyz
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error8080.log
CustomLog ${APACHE_LOG_DIR}/access8080.log combined
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/pwmw.xyz/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/pwmw.xyz/privkey.pem
</VirtualHost>
<VirtualHost _default_:9010>
ServerAdmin dev@pwmw.xyz
ServerName pwmw.xyz
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/pwmw.xyz/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/pwmw.xyz/privkey.pem
</VirtualHost>
<VirtualHost _default_:9011>
ServerAdmin dev@pwmw.xyz
ServerName pwmw.xyz
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/pwmw.xyz/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/pwmw.xyz/privkey.pem
</VirtualHost>
<VirtualHost _default_:9020>
ServerAdmin dev@pwmw.xyz
ServerName pwmw.xyz
DocumentRoot /var/www/html
ProxyPreserveHost On
ProxyPass / http://localhost:19020/
ProxyPassReverse / http://localhost:19020/
# WebSocket 트래픽 프록시
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule /(.*) ws://localhost:19020/$1 [P,L]
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error9020.log
CustomLog ${APACHE_LOG_DIR}/access9020.log combined
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/pwmw.xyz/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/pwmw.xyz/privkey.pem
</VirtualHost>
<VirtualHost _default_:9021>
ServerAdmin dev@pwmw.xyz
ServerName pwmw.xyz
ProxyPreserveHost On
ProxyPass / http://localhost:19021/
ProxyPassReverse / http://localhost:19021/
# WebSocket 트래픽 프록시
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule /(.*) ws://localhost:19021/$1 [P,L]
#DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error9021.log
CustomLog ${APACHE_LOG_DIR}/access9021.log combined
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/pwmw.xyz/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/pwmw.xyz/privkey.pem
</VirtualHost>
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
이제 남은건 아파치에서 해당 포트들을 리스닝하게 해주는 것 뿐이다.
우선 프록시부터 활성화 해준다.
sudo a2enmod proxy
sudo a2enmod proxy_http
포트 리스닝
sudo vim /etc/apache2/ports.conf
Listen 80
Listen 9010
Listen 9020
Listen 9021
Listen 8080
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
이후 아파치를 재시작해주면 된다.
sudo systemctl restart apache2
'개발' 카테고리의 다른 글
개발자라면 서버 한 대 집에 있는게 좋은 이유 (3) | 2024.11.13 |
---|---|
2020년부터 개발 제대로 해보고 느낀점과 회고 (1) | 2024.06.24 |