Nginx로 AWS ELB 대체하기

몇달 전 기존에 쓰고 있던 AWS EC2(t2.micro) 인스턴스 2개를 비용 문제로 예약 인스턴스로 바꿨다. 그런데 비용을 좀 아끼자고 결정한 일이 오히려 비용을 몇배로 키웠다. 

예약 인스턴스를 구매하고 ELB 사용하면서 비용이 더 증가했다.

처음엔 예약 인스턴스 기간이 제대로 설정이 안됐나 싶었지만 상세 내역을 보니 문제는 바로 ELB 였다. AWS에서 이녀석을 어떻게 구현했는지 모르겠지만 ELB 한대당 t2.micro 서버 한대와 맞먹는 요금이 나오는걸로 봐서는 ELB를 EC2 위에 올려서 서비스하는건가? 하는 생각도 든다.

ELB는 왜 썼나?

비용 문제를 제외하면 라우터(Route53)와 도커 컨테이너 사이에 로드발란서(ELB)를 두고 포트를 맵핑하는 방법은 정말 간편하다. 특히 SSL 인증서를 ELB에 넣는 것도 클릭 몇번이면 다 해결되지 이걸 안써야할 이유를 못찾을 정도 였는데… 이제서야 그 이유를 찾은것 같다. 쉬운 만큼 비싸다! 그럼 각설하고 ELB 대신에 nginx 를 설정해보자.

ELB를 대신할 nginx 의 위치

도커가 설치된 호스트 서버를 최전방에 위치시키면 출처를 알 수 없는 수많은 트래픽을 받아야하기 때문에 최대한 ELB 뒤에 숨기고 싶었으나 이제는 선택의 여지가 없다. 그래도 EC2 서버 자체가 털리지 않도록 AWS 보안 그룹 설정에서 80과 443 포트만 와이드 오픈으로 열어두자. 

어찌됐든 도커가 설치된 EC2 서버에 nginx를 설치해야되는데, 이 녀석을 도커 컨테이너로 띄울지 EC2 서버에 직접 서비스로 올릴지는 잠깐 고민했다. ELB를 대신할 nginx의 역할은 부하 분산의 목적보다는 한 서버위에 여러 컨테이너로 올려지는 서비스에 포트를 바인딩하기 위한 멀티 호스팅이 주 목적이기 때문에 그냥 EC2 서버에 직접 올리기로 했다.

nginx를 설치하고 멀티 호스팅 설정은 /etc/nginx/conf.d/ 폴더 하위에 호스트 별로 설정을 추가한다. 먼저 이 블로그는 도커 컨테이너의 8888번 포트와 맵핑되어 있다. 

## /etc/nginx/conf.d/miconblog.com.conf 파일
server {
	listen 80;
        server_name miconblog.com;

        location / {
                proxy_pass http://127.0.0.1:8888;
        	proxy_set_header X-Forwarded-For $remote_addr;
	        proxy_set_header Host $http_host;
        }

}

마찬가지로 운영중인 서비스도 같은 방식으로 맵핑한다.  

## /etc/nginx/conf.d/rlibro.com.conf 파일
server {
        server_name rlibro.com;

        location / {
                proxy_pass http://127.0.0.1:8080;
        	proxy_set_header X-Forwarded-For $remote_addr;
	        proxy_set_header Host $http_host;
        }
}

EC2 서버에 certbot 설치하기

이제 ELB를 선택한 또다른 이유중 하나인 SSL 인증서 문제를 해결해보자. SSL 인증서는 직접 구매해도 되지만 도메인을 가지고 있다면 Let’s Encrypt를 이용해 무료로 쓸수도 있다. 

Let’s Encrypt로 인증서를 발급받으려면 certbot 이라는 프로그램을 이용해야한다. 일단 certbot 패키지를 설치해야하는데, 내가 쓰고 있는 CentOS7 버전은 yum을 이용해 설치할수있다는데 몇몇 라이브러리의 파이썬 버전이 맞지 않아서 직접 다운로드 받아 설치했다.  설치는 아래 링크를 참고하자.

https://certbot.eff.org/lets-encrypt/centos6-nginx

Nginx 가 설치된 서버에서 certbot을 설치하고 아래 명령을 입력하면 certbot이 알아서 nginx 설정을 읽어와 원하는 도메인에 인증서를 설치해준다. 

$> ./certbot-auto --nginx

위 명령을 입력하면 앞에서 nginx에 2개의 멀티 호스트를 설정했기 때문에 certbot은 두 도메인 중 어떤 녀석을 HTTPS로 서비스하고 싶은지 물어봐준다. 당연히 나는 2번을 선택!

Requesting to rerun ./certbot-auto with root privileges...
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
1: miconblog.com
2: rlibro.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 2

... 중략 ... 

그럼 인증서를 /etc/letsencrpyt/live/도메인명/ 하위에 설치해준다. 그리고 이어서 http 요청이 들어오면 https로 강제 redirect 할지 말지를 묻는다. 나는 역시 강제 리다이랙션 옵션인 2번을 선택!

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

.... 중략 ...

자 이제 인증서 설정이 끝났다. nginx를 재시작하면 miconblog.com 과 rlibro.com 두 서비스가 모두 정상 동작한다. 

그리고 SSL 인증서를 설치한 rlibro.com.conf 파일을 열어보면 certbot 직접 추가한 설정을 볼수있다. 

server {
    server_name rlibro.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
      	proxy_set_header X-Forwarded-For $remote_addr;
	proxy_set_header Host $http_host;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/rlibro.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/rlibro.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = rlibro.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name rlibro.com;
    return 404; # managed by Certbot
}

와~ 세상 정말 좋아졌다!

워드프레스 업그레이드 관련 정리

해커들의 채굴 공격에 한바탕 홍역을 치른 뒤에 워드프레스 관리에 좀더 신경을 쓰고 있다. 그동안 내가 고생했던 이야기는 아래 링크를 참고하자.

아무튼 이런 저런 일들을 겪으면서 발생한 문제를 해결하다보니 이번에는 그동안 잘 되던 자동 업그레이드가 안되는 문제가 생겼다.

그동안 몰랐던 자동 업그레이드의 실체

자동 업그레이드는 2가지 기능을 한다. 중요한 패치버전을 자동으로 설치하는 기능과 사이트에서 손쉽게 원하는 플러그인과 테마를 클릭 한방에 설치해주는 기능이다. 특히 두번째 기능은 수동으로 파일을 업로드하는 수고로움과 귀차니즘을 줄여준다. 그리고 이 자동 업그레이드는 아마도 워드프레스 3.2 부터인가 자동으로 적용됐다. 지금은 4.9.5 버전이니까 한참 옛날일이다.

아무튼 내가 10년전 수동으로 모든 플러그인과 설치버전을 관리하다가 3.2 버전으로 넘어오면서 이런 편리함에 다른 블로그 툴로 못 넘어가고 워드프레스에 정착을 했던것 같다. 아무튼 그동안 잘 되던 원클릭 업그레이드가 이제 더이상 안되는 문제가 생겼다! 뚜둥!!

갑자기 FTP 권한이 틀렸다고 다시 입력 하랜다. 내가 ftp 데몬을 내렸나 싶어서 vsftp 데몬을 설치하고 잘되는것도 확인했는데, 여전히 같은 문제가 반복됐다. 원인을 도저히 못 찾다가 우연히 FTP를 우회하는 방법을 찾았다.

그냥 wp-config.php에 다음 한줄을 추가하면 FTP 설정 없이도 업그레이드가 된다.

define('FS_METHOD', 'direct');

즉, 이 말은 PHP가 직접 파일을 읽어다가 내 서버에 쓴다는 얘긴데, php가 파일이나 폴더를 생성 하려면 권한이 필요하다. php 는 당연히 nginx 위에서 동작하기 때문에 nginx 그룹 권한에 쓰기 권한도 넣어줘야한다.

아마 갑자기 원클릭 업그레이드가 안된 이유도 사실은 폴더권한을 775에서 755로 대폭 축소해서 나타난 문제였을 것이다.

업그레이드와 관련된 폴더

워드프레스 버전을 업그레이드 하려면 아래 폴더에 권한을 일단 775 이상으로 올려줘야한다.

  • wp-admin
  • wp-includes

그리고 플러그인이나 테마를 업그레이드 하려면 wp-content 폴더의 권한도 올려줘야한다. 업그레이드가 끝나면 올려줬던 폴더의 권한은 다시 낮추는걸 추천한다.

발리에서 생긴 일 +18

코워킹스페이스 – Outpost

오늘은 아침부터 화상회의가 필요해서 이곳에 유명한 코워킹스페이스인 Outpost에 왔다. 집에서 스쿠터타고 5분 거리에 있는 이곳은 시내 갈때마다 항상 지나던 곳인데 나름 유명한 곳이라 한번쯤은 가보고 싶었던 곳이다. 종은님 말씀으론 코워킹 스페이스를 검색하다가 우붓과 독일을 추렸다고 했다. 얼마나 유명하길래 검색에도 걸렸을까? 일단 급하게 해야할일이 있어서 화상통화를 끝내고 찬찬히 이곳이 왜 유명한지 둘러봤다.

재밌는건 이곳은 전부 맨발로 다닌다. 1층은 조용한 도서관처럼 책상과 의자가 자유롭게 배치되어 있고, 2층은 수다를 떨수 있어서 보다 자유로운 카페 분위기다. 1층 카페나 카운터에서 음식을 주문하면 자리로 가져다준다. 2층 테라스는 절벽뷰라서 전망이 참 좋다. 우붓답게 마사지와 요가 클래스도 있다. 재밌는건 이곳을 이용하는 사람들의 대부분이 외지인이라는 사실. 한국의 코워킹 스페이스는 사실 한국인이 거의 대부분이었다. 외국인의 비율이 극히 드문데 이곳은 외국인의 비율이 엄청 높다. 아마 직원을 빼면 90% 이상이지 않을까? 그래서 좀 독특했다. 수영장도 이용할수 있다고 하는데 집에 수영장이 있다보니 수영장은 이용하지 않았다.

당일치기 이용이라 인맥을 쌓고 같이 의쌰의쌰하는 그런 기회는 없었다. 네트워킹을 위한 프로그램들이 마련되어 있는 것 같긴한데 다들 각자 일하는 분위기라서 역시나 이곳도 한국과 다르지는 않은것 같긴하다. 아님 역시나 당일치기로는 뭐든 인맥을 만들긴 쉽지 않은것일수도….

어쨌거나 저쨋거나 인터넷은 내가 생각한만큼 빠르지 않았다. 한국 인터넷 어쩌나 싶다. 한국에 오래 있으면 그 어떤나라도 만족하기 어려울듯…ㅜㅜ

트리탑(TreeTop)

지난주말엔 트리탑 어드벤처 파크라는 곳엘 다녀왔다. 짚라인(ZipLine)을 해보고 싶어서 갔는데,… 아하하핳 일단 웃음부터.. 내가 생각했던 그런 짚라인은 아니고,.. 입에서 단내가 나고 “유격유격”이 저절로 외처지는 경험을 하고 왔다. 내가 왜…? 돈주고 이걸 하고 있나 싶기도하고… ㅋㅋㅋ 그래도 뭐 옆지기랑 같이 하니까 재밌긴하다. 덕분에 아침일찍 갔다가 돌아와서 그대로 뻗어 잤다. 하루가 그렇게 끝났다. ㅋㅋㅋㅋ 저질 체력~ ㅋㅋㅋ

도시의 노예

몇일전 방송을 위해 종은님 댁에 놀러갔다. 이런저런 이야기를 하다가 우붓에서의 노마드 삶은 생각보다 일할 시간이 충분하지 않다고 했다. 하루 4시간 일하기도 버거운 상황이라했다. 그래서 나의 지난 세계여행이 어땠는지를 떠올렸다. 실제로 내가 일한 시간은 한국에서보다 훨씬 많았다. 하루 14시간 코딩한 적도 있었고, 물론 어댑터가 터지면서 몇일간 임시휴업을 한적도 있었다. 그래서 무엇이 다른지 곰곰히 생각했다.

우붓은 나름 시골이다. 이말은 즉 인프라가 열악하다. 기본적인 인프라중에 인프라는 길이다. 대중교통은 전무하고 오로지 스쿠터와 택시만 있다. 따라서 내가 이동하려면 스쿠터를 배워야한다. 배우자가 있다면 배우자가 이동을 원할때 내가 데려다줘야하는 상황이다. 여기에 아이가 있다면 스쿠터로는 불가능하다. 차가 있어야한다.

도시(아파트)에 살다가 시골로 내려간 경우도 같은 맥락의 어려움이 있다. 어디나 도시가스가 있고, 인터넷에 대한 걱정없고, 난방 잘되고, 비와도 누수걱정 없고, 더우면 에어컨 켜면 되고, 이런 환경에 살다가 시골에 집을 지어 내려 갔다면 아마 아파트가 주었던 기본적인 편의를 모두 걱정해야할수도 있겠다싶다.

그래서 도시의 삶이 편할수록 도시민들을 도시의 노예로 만들고 있는지도 모르겠다. 그런데 그 편리함이 과연 우리의 행복지수를 높여주고 있을까? 잘 모르겠다.

이곳에선 내가 조금 불편해도 옆지기를 스쿠터에 태우고 다녀야만하는데 아니러니하게 그게 또 행복하다. 인터넷이 잘 안되는데 인터넷이 안되니까 핸드폰을 덜 보게 되고 옆지기를 보게된다. 밤이면 차소리와 시끄러운 오토바이 소리에 가끔 깨곤 했는데 여기선 아침에 닭우는 소리와 풀벌레 소리에 깨지만 귀에 거슬리지 않는다.

도시를 벗어난 삶에 익숙해지면서 삶의 만족도가 높아진다. 하지만 그래도 인터넷은 있으면 좋겠다. ㅋㅋㅋ

발리에서 생긴 일 +11

물갈이

몇일 앓아누웠더니 시간이 훅갔다. 물갈이라고해서 물을 잘못 먹으면 나타나는 증상인줄 알았는데, 몸속에 균들의 균형이 깨지면 나타나는 현상을 통칭한다고 한다. 두통과 설사에 침대와 변기 위에서 하루를 통으로 날리고 또 몇일간 약에 취해 해롱해롱 대다가 결국 구름네가서 “이모디움”이라는 약을 받아왔다. 먹고나니 3일이 훅 갔다.

우기, 비오는 날의 감상

한국에선 장마라고 하면 2~3주 동안 하루종일 비만 온다. 장마라고 하면 뭔가 우울하고 그런 멜랑콜리함이 떠오르는데, 우기도 겪어보니 비가 많이 온다는 점에서 큰 차이는 없다. 다만 하루종일 내리진 않고 내리고 개고를 반복하다. 요 몇일은 계속 구름낀 날씨로 있다가 오늘에서야 해가 들었다. 해가 드는 날도 드물다.

요 몇일 비가 참 많이 내렸다. 밤만 되면 억수처럼 쏟아지는 비들이 시원하다못해 상쾌하게 느껴졌다. 어릴때 느꼈던 바로 그런 상쾌함이다. 비가 올라치면 우산들고 나가서 우산집 짓고 놀던 그런 시절, 그 시절 비는 정말 반가웠다.

그런데 도시에서 맞는 비는 좀 우울하다. 내가 커서 그런가 싶다가도 여기서 비를 맞아보니 커서 그런건 아닌것 같다. 아무래도 환경의 영향인것 같다. 도시에선 빗소리마저 다르다. 창너머 내리는 빗줄기는 콘크리트와 시멘트에 부딪치고 그 부딪친 파동이 내 귀로 흘러들어오는데, 이곳에서의 빗소리는 땅에 내리고, 풀잎에 내리고, 나뭇가지에 내리고, 지붕위에 내리면서 온갖 다양한 소리를 만들어 낸다. 거기에 풀벌레와 두꺼비, 각종 샛소리… 확실히 다르다. 시골에서 살아야겠다.

시골 같지 않은 시골, 우붓

여기서 머무는 시간이 길어지는 만큼 그리고 내가 스쿠터로 운전하는 영역이 넓어지는 만큼 우붓의 매력을 조금씩 알아가고 있다. 처음엔 시골같았는데, 지금보니 시골은 아니다. 때론 종로 한복판, 인사동같은 느낌도 있고, 남대문 시장의 느낌도 있다. 연남동의 느낌도 있고, 가로수길 느낌도 있다. 뭔지 모를 온갖 독특함이 묻어나는데… 한마디로 정의하면 외톨이들의 집합소!!

도대체 이 시골에 왜 이렇게 사람들이 많은거야? 와보면 안다. 그리고 나도 가봤는데 난 잘 모르겠던데?.. 라고 얘기할수도 있겠다. 그럼 더 오래 있어보면 안다. 아무튼 평생 여기서 살아라하면 살고 싶지 않은데 한겨울 추위를 피해 잠깐 살기엔 나름 괜찮은것 같다.

이건 무슨 요가?

도무지 그 뜻을 알수 없는 요가 수업을 들었다. 그냥 누워서 음악듣고 명상하는 수업이라고 하는데, 누구는 울고 누구는 웃고, 자신의 내면의 나를 마주 한다고 한다. 나는 못봤다. 와이프도 나름 내면을 만나고 왔다고 하는데,.. 나는 컨디션 때문인지 허리와 두통때문에 누워서도 제대로 잠을 못잤다. 아… 잠을 자는 수업은 아니지.. 참… ㅎㅎㅎ

아무튼 수업 시작전에 카드 한장을 받았다. Aloneness 단어의 카드를 뽑았는데, 그 카드의 외로운 이미지가 한가득했다. 그리고 그 이미지를 떠올리며 누워서 편안한 자세로 내면을 마주하라는건지… 하아~ 영어의 벽을 여기서 느끼다니..ㅜㅜ..

수업 막바지엔 큰 원형으로 서로 손을 잡고 서로를 바라보며 눈인사를 했다. 그리고 돌아가며 지금 떠오르는 감정을 하나씩 얘기하는데,… 아.. 이건 또 단어가 생각이 안난다. “카오스”라고 해야하나? 아~ 몰라 그냥 카드에 적어준말.. “어론니스”라고 얘기했다. ㅎㅎㅎ 그랬더니… 수업 끝나고 한 여자분이 내게 다가오더니 포옹을 해준다… 아… 그..그게 아닌데…
바람이 말하길, 그 요가 수업을 들으면 사랑이 넘치는 사람들이 모인다더니… 그 이유를 이제야 알겠다.