음 웹서버와 웹페이지 구성을 공부하신 다면, nginx대신 apache를 설치하고 설정하시고, 사용해 보세요.
nginx는 기본적으로 목적이 Reverse Proxy입니다.
Proxy는 다른 서버와 연결하여, 그 서버를 대신하는 것을 말하는 것으로,
주요한 기능은 본래의 서버가 하고, 프록시 서버는 그들을 묶거나, 보조적인 로드밸런싱, 캐싱이나 필터링등을 담당합니다.
리버스 프록시는 아파치등의 웹서버 여럿을 백엔드로 두고, 그 위에서 로드밸런싱, 캐싱, 필터링등을 합니다.
사용자는 리버스 프록시 서버에 직접 연결하여 요청을 하고, 서버는 그것을 백엔드에 요청하여 결과를 사용자에게 보내줍니다.
리버스 프록시는 자신이 백엔드에 있는 웹서버인 양 동작하고, 사용자는 리버스 프록시가 직접 결과를 전송하는 것으로 알게 됩니다.
즉, 리버스 프록시의 입장은 사용자보다 관리적 측면을 우선하는 것입니다.
포워드 프록시는 백엔드가 존재하지 않고, 사용자는 프록시 설정을 해야합니다.
즉, 사용자가 목적하는 주소에 접근하고 싶으나, 이가 여의치 않거나, 다른 컴퓨터를 통하여 접근하는 것이 이익된다 생각되면,
포워드 프록시를 설정하여, 다른 컴퓨터로 접근하듯 처리하는 것입니다.
즉, 포워드 프록시의 입장은 서버측 보다, 클라이언트 사용자의 측면을 우선하는 것입니다.
이 두가지, 프록시의 기능 중, nginx는 리버스 프록시의 기능을 잘 살리고 있으며, 포워드 프록시의 역할로 구성할 수 도 있으나,
이러한 기능은 주 기능이 아니기 때문에, 미흡하고 불편합니다.
대표적인 리버스 프록시 서버로는 nginx가 있고, 포워드 프록시 서버로는 squid가 있습니다.
물론 nginx가 자체의 웹서버 기능도 가지고 있지만, 본래 웹서버를 목적으로 만들어진 아파치에 비할 바가 못됩니다.
또한, 아파치는 proxy모듈을 통하여, 포워드, 리버스 프록시를 구현할 수 있습니다.
물론 다양한 기능을 제공하지 않을 수 도 있지만, 본연의 기능으로 보면 그렇습니다.
포워드 프록시 설정의 예
[code:372859z3] ProxyRequests On
ProxyVia On
<Proxy *>
Order deny,allow
Deny from all
Allow from 192.168.1
</Proxy>[/code:372859z3]
리버스 프록시 설정의 예
[code:372859z3] ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar[/code:372859z3]
차이를 보면 두가지가 있는데, 바로 ProxyRequests와 ProxyPass입니다.
포워드 프록시는 사용자로 부터 어디로 요청할지 정보를 받기 때문에, 그 요청인 ProxyRequests를 On해야 합니다.
리버스 프록시는 사용자로 부터 목적지를 받는 것이 아니라 서버 스스로가 결정하는 것이므로,
ProxyPass로 어디로 갈지 설정해 줘야 합니다.
JSP를 예를 들면, tomcat을 설치하여, 8080등의 포트를 할당하고, 서비스를 시작한 경우,
tomcat은 자체적으로 서버의 기능을 하고 있기 때문에,
nginx에서 tomcat 서버로 proxypass하여 리버스 프록싱 할 수 있습니다.
[code:372859z3]
http {
# 로드밸런싱을 하는경우
upstream tomcat {
server 192.168.0.10:8080;
server 192.168.0.20:8080;
}
server {
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
# 요청할 서버
proxy_pass http://tomcat;
index index.jsp;
}
}
}
[/code:372859z3]
아파치로 JSP연동의 예
아파치 설정
[code:372859z3]
LoadModule jk_module modules/mod_jk.so
<ifModule jk_module>
JkWorkersFile conf/workers.properties
JkShmFile logs/mod_jk.shm
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
</ifModule>
JkMount /*.jsp ajp13
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
[/code:372859z3]
/etc/apache2/conf/workers.properties
[code:372859z3]
worker.list=ajp13
worker.ajp13.type=ajp13
worker.ajp13.host=localhost
worker.ajp13.port=8009
worker.ajp13.lbfactor=1
worker.ajp13.connection_pool_timeout=600
worker.ajp13.socket_keepalive=1
[/code:372859z3]
기본적인 웹서버 기능과 tomcat으로 JSP 서비스만을 제공할 것이라면, 가볍게 nginx를 사용할 수 도 있지만,
가벼운 웹서버라면 nginx만 있는 것이 아닙니다. cherokee등을 생각해 볼 수 도 있습니다.
프록시를 전제로 한다면, 목적에 맞게 nginx나 squid등을 사용하시면 됩니다.
웹서비스와 프록시 서비스는 서로 다른 서비스입니다.
예를들어, Telnet 프록시나, FTP 프록시등도 있으며, 이런 것들은 중간에서 연결을 매개하는 것이 목적입니다.
결론적으로 말씀드리자면, 웹서비스에 충실하게 구성하시려면, nginx는 적당하지 않습니다.