Html5 + jsp + nginx + tomcat + mysql

안녕하세요

공부하는 학생인데 계속 눈팅하며 자료만 찾다가

이번에 도저히 해결이 안되서 질문남깁니다.

웹페이지를 하나 만들려고 하는데 이미 html5 책을 보면서 디자인은 어느정도 완성한 상태입니다.

제가 웹사이트를 만들기위한 구상을 위해 인터넷으로 자료 조사중에

html5는 마크업언어로 정적인 부분(디자인)을 표현하는 언어고 db조회나 로그인 등의 반응을 위해선

서버측에서 동작하는 jsp(제가 자바를 좀 할줄 알기 때문에…) 를 이용해야 한다고 이해했습니다.

nginx는 새로 떠오르는 효율이 좋은 서버라고 해서 계획하였고 대부분 nginx와 tomcat을 연동하여

많이 쓴다고 되있길레 여러 블로그 포스팅을 통해서 여차저차 진행하였습니다.

pc를 한대 구해서 리눅스 13 서버를 깔고 nginx 와 jdk, tomcat, mysql 을 설치하고

서버도 띄어 놓은 상태입니다.

제 애초 계획으로는 마크업언어로 html5를 잡고 서버언어로 jsp로 mysql의 db와 연동하여 서비스를 제공하는

웹사이트를 만들려고 했습니다.

인터넷을 어떻게 뒤적뒤적해서 정적페이지는 nginx, 동적인 jsp, do 파일은 tomcat7 에서 처리하게 만들었는데

기존 jsp & 서블릿 책을 참고 하려고 보면 대부분 이클립스를 깔고 웹프로젝트를 만들어

GUI환경에서 실습하는 것 밖에 없는데 CUI에서 구성하려고 하면 우분투의 어디폴더에 해야될지 모르겠습니다.

/usr/share/ngingx/html/ 폴더에 index.html 을 넣고 jsp파일은 어디다 넣어야 하는지

webapps와 어떤식으로 연동하는지 감이 안잡힙니다. 제가 애초부터 구성설계를 잘못한건가요??

어떤식으로 진행해나가면 좋을지 선배님들의 조언좀 부탁드립니다.

참고할만한 서적이나 사이트도 가르쳐주시면 정말 감사하겠습니다…

nginx 설정에 proxy 설정이 있습니다.

특정 주소로 요청이 들어오면 뒤에서 대기하고 있는 다른 앱에 이 요청을 전달해주고 처리 결과를 받아서 되돌려 주는 방식으로 동작 합니다.

https://library.linode.com/web-servers/nginx

위에 있는 두 문서 읽어보시면 감이 오실 겁니다. 설명이 좀 쉽게 되어 있습니다.

http://nginx.org/en/docs/beginners_guide.html

세밀한 부분은 공식 문서를 봐야 이해가 가더군요.

음 웹서버와 웹페이지 구성을 공부하신 다면, 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는 적당하지 않습니다.

웹서버에 충실한 구성은 어떤 것이며 nginx가 그에 적당하지 않은 이유는 무엇인가요? 아파치에 비교하자면요.

먼저 제가 말씀드린 웹서비스에 충실하다는 의미는,
웹서버의 본연의 기능만을 의미하는 것이 아니라, 동적인 기능 즉, 애플리케이션 서버로서의 기능까지 포함하는 것입니다.

nginx를 선택한 사람들의 선택의 이유는 무엇일까요?
그 점을 생각해 보시면 됩니다.

nginx를 선택하는 사람들은 대부분 그 이유가 속도와 심플함에 있다고 생각됩니다.
그러한 속도와 심플함이라는 것은 소규모 프로젝트에 어울리는 사항이죠.

그 외의 대부분은 아파치가 우세하다고 볼 수 있죠.
기능, 안정성, 편이성, 유연성, 호환성등에서 아파치가 우세합니다.

기능이라면 아파치는 별로 필요없다고 생각되는 것들도 포함하는 매우 많은 기능들을 제공합니다.
아파치의 기능은 열거하기 어려울 정도로 많습니다.
예를 들어, python등을 서버측 스크립트로 사용한다고 할 때, nginx의 경우 fastcgi 서버프로그램을 실행하여,
그 서버와의 통신을 통해 처리할 수 밖에 없으나, apache의 경우 python 모듈을 등록하면, apache 프로세스에서 직접 실행합니다.
2.4버전의 경우, mod_sed와 mod_auth_form 등을 포함하는 많은 모듈들이 추가되었습니다.

편이성이라면 아파치는 매우 많은 사람들에 의해 사용되어 왔으므로, 문서가 많고, 또한 문제가 발생했을 때, 그에 따른 해결도 하기 쉽습니다.
또한 다양한 제어 프로그램을 제공합니다.

유연성이라면 Loadable Module을 생각해 볼 수 있는데, apache에서는 Loadable Module을 지원하기 때문에,
필요한 모듈을 설치하는 것 만으로, 쉽게 설정할 수 있으나, nginx의 경우는 컴파일을 해줘야 합니다.
우분투의 경우 nginx-extras를 통해 많은 모듈들을 제공하고 있으나, 추가로 다른 모듈을 설치하고자 한다면,
소스를 다운받아서 다시 컴파일해서 설치하여야 합니다.

호환성이라면 아파치는 아주 많은 운영체제를 지원하며, 다양한 프로그램들과 연동된다는 점입니다.

만일 다른 WAS(웹 어플리케이션 서버)를 사용하거나, 그렇게 구성하실 경우,
굳이 웹서버가 동적인 기능을 제공할 필요가 없기 때문에,
nginx로 웹서버의 정적인 기능과 속도에 집중하고, WAS를 통하여 다양한 동적인 기능들을 구성하시면 됩니다.

현재 nginx가 웹서버로 인기있는 이유 중의 하나는, 많은 프로젝트는 단순하고 소규모이고, 정적인 웹페이지들이 많이 때문이며,
또한 상업적인 서비스의 경우, WAS를 사용하여 동적인 기능들을 제공하기 때문입니다.
따로 WAS를 사용하지 않고, 여러가지 서비스를 제공하는 유연한 웹서버로 구성하고 싶다면,
아파치를 사용하는 것을 추천하고 싶습니다.

선배님들의 정성어린 조언에 고개 숙여 감사드립니다.

아직 걸음마 단계라 100% 이해하지는 못했지만

200% 이해하는 날까지 정진하겠습니다.

다시한번 감사드립니다.