16강 / 20강
nginx — 손님을 맞이하는 앞단
리버스 프록시, 그리고 502 의 정체
쇼핑몰은 127.0.0.1:8000 에서 돌고 있습니다.
그런데 손님은 shop.example.com 으로 들어와요.
게다가 127.0.0.1 은 이 컴퓨터 자신이라는 뜻이라 바깥에서 닿지도 않습니다.
왜 일부러 바깥에서 못 닿게 해 놨을까요? 앱을 인터넷에 직접 노출하지 않기 위해서입니다. 대신 nginx 를 앞에 세워 손님을 맞게 합니다.
🌍손님shop.example.com
→
🏠nginx80번 포트에서 대기
→
🧪gunicorn127.0.0.1:8000
→
🐍app.pyFlask 가 판단
nginx 가 앞에 서면 좋은 점
정적 파일훨씬 빠름CSS·이미지는 앱까지 안 가도 됨HTTPS암호화 담당앱은 신경 쓸 필요 없음여러 사이트한 서버에 여럿주소로 구분해 각각 다른 앱으로과부하 방어완충느린 손님을 앞에서 받아 줌앱 보호직접 노출 안 됨127.0.0.1 은 바깥에서 못 닿음설정 파일 읽기
쇼핑몰의 nginx 설정 — 한 줄씩 읽어 봅시다
bash
내 가상 Ubuntu 서버에서 실행
listen 80어느 문에서 기다릴까80 = 웹의 기본 포트server_name어느 주소로 온 손님?한 서버에 여러 사이트를 둘 때 구분location /static/이 주소로 오면파일을 직접 준다 (앱을 안 거침)location /나머지 전부뒤의 앱으로 넘긴다proxy_pass어디로 넘길까127.0.0.1:8000 ← 우리 앱X-Forwarded-For원래 손님 IP없으면 앱은 모든 손님을 nginx로 착각sites-available 과 sites-enabled
Ubuntu 의 nginx 에는 폴더가 둘 있습니다. 왜 나눠 놨을까요?
sites-enabled 안의 것은 파일이 아니라 <b>링크</b>입니다
bash
내 가상 Ubuntu 서버에서 실행
🎮 요청 라우팅 실험실
설정을 바꿔 가며 어떤 요청이 어디로 가는지 확인해 보세요. 502·404·200이 각각 언제 나오는지 알 수 있습니다.
설정을 고치는 올바른 순서
이 순서를 지키지 않으면 사이트가 통째로 죽습니다. 외워 두세요.
① cp … .bak백업부터② sudo nano …고치기③ sudo nginx -t문법 검사 ← 가장 중요④ systemctl reload nginx끊김 없이 적용③ 문법 검사 — 통과해야만 다음으로 갑니다
bash
내 가상 Ubuntu 서버에서 실행
502 Bad Gateway — 가장 자주 보게 될 오류
실제로 만들어 봅시다. nginx 는 살아 있는데 뒤의 앱이 죽으면 무슨 일이 생길까요?
nginx 는 멀쩡한데 뒤가 죽었습니다 → 502
bash
내 가상 Ubuntu 서버에서 실행
이 화면을 보는 순간 범인은 nginx 가 아닙니다. "대신 전해 주려고 갔더니 뒤에 아무도 없더라"는 뜻이에요.
502 Bad Gateway뒤의 앱이 죽음→ systemctl status shop 을 보세요504 Gateway Timeout뒤가 너무 느림→ 앱이 멈춰 있거나 DB가 느림404 Not Found그런 주소 없음→ 앱의 라우트 문제연결 거부nginx 자체가 죽음→ systemctl status nginx앱을 살리면 바로 정상으로 돌아옵니다
bash
내 가상 Ubuntu 서버에서 실행
🤔 확인 문제
502 Bad Gateway 가 떴을 때 가장 먼저 확인할 것은?해설 502 는 nginx 는 살아 있는데 넘겨줄 곳이 대답을 안 한다는 뜻입니다.
systemctl status shop 과 journalctl -u shop 이 다음 순서입니다.🤔 확인 문제
nginx 설정을 고친 뒤
sudo nginx -t 를 먼저 하는 이유는?해설
-t 는 test 입니다. 통과하면 안심하고 reload 할 수 있어요. 이 한 단계를 건너뛰어 사이트를 죽이는 일이 정말 자주 일어납니다.🤔 확인 문제
sites-enabled 폴더에 설정 파일이 아니라 심볼릭 링크를 두는 이유로 가장 알맞은 것은?해설 보관(available)과 사용(enabled)의 분리입니다. 사이트를 잠시 내려도 설정 원본은 그대로 남아 있어서, 되살릴 때 링크만 다시 걸면 됩니다.