'Web'에 해당되는 글 14건

IT 지식/nginx

nginx 정리와 설치 및 기본 설정방법

Ngnix 설명

nginx는 기존 웹서버에서 많은 트래픽을 감당하기 위해서 확정성을 가지고 설계된 비동기 이벤트 드라이븐 방식의 웹서버를 칭한다.


Nginx 설치

nginx를 맥이 있으면 brew를 통해서 간단하게 설치가 가능하다.

1
brew install nginx
cs


Nginx 프로세스

nginx는 하나의 마스터 프로세스와 여러 worker 프로세스를 가진다. 마스터 프로세스의 주요 목적은 read 권한 그리고 성능 측정과 worker 프로세스 관리이다. worker 프로세스는 요청을 처리한다. nginx는 event-based 모델을 사용하고 worker 프로세스 사이에 요청을 효율적으로 분배하기 위해서 os에 의존하는 매커니즘을 사용한다. worker 프로세스에 개수는 설정 파일에서 정의되며 정의된 프로세스 개수와 사용가능한 cpu 코어 숫자에 맞게 자동으로 조정된다.


Nginx 동작 -S

nginx를 동작시키기 위해서는 다음 옵션을 붙여서 진행한다.

1
nginx -s signal
cs


signal의 종류는 다음과 같다.

 종류

설명 

 stop

 빠른 중지

 quip

 graceful stop

##graceful stop은 요청이 중단되었을 때 로드밸런스에게 해당 노드에 요청을 추가적으로 못하게 하고 현재 노드에 작업을 중지시키고 정상적으로 끝내는 것을 말한다.

 reload

 설정 파일 재 로드

 reopen

 로그 파일  재 오픈


quip를 진행하면 현재 요청을 워커 프로세스에게 끝내라고 보낸다. 그럼 해당 워커 프로세스에 새로운 요청을 보내지 않고 워커 프로세스가 진행중이던 작업이 마무리되면 정상적으로 애플리케이션이 꺼진다. 이를 graceful stop이라고 한다.

reload를 진행하면 syntax 체크를 진행하고 성공하게 되면 older worker 프로세스를 중지 시키고 새로운 worker 프로세스를 만들어서 동작 시킨다. 만약 설정이 이상하면 마스터 프로세스는 작업을 롤백하고 예전 설정으로 동작한다. 중지 요청을 받은 workder 프로세스들은 새로운 요청을 받는 것을 멈추고 자신이 하고 있는 동작을 마무리 한다. 이 동작이 완료되면 그때 older worker 프로세스는 죽는다.

Nginx 설정파일

nginx 정책과 그 모듈들에 동작은 /usr/local/nginx/conf, /etc/nginx, /usr/local/etc/nginx 위치중에 존재하는 nginx.conf 파일 내에서 설정한대로 동작한다. (brew로 설치하는 경우 /usr/local/etc/nginx에 위치)

설정 파일 구조.

설정 파일에 입력하는 값들은 두 가지 형태로 입력이 가능하다. simple 디렉티브와 block 디렉티브 두 가지이다. simple은 이름과 파라미터로 구성되어있고 마지막에 ;이 붙는다. block 디렉티브은 simple과 구조가 같지만 끝에 ; 대신 ({ })이 붙는다. block 명령은 내부에 다른 명령들을 포함할 수있다.

events, http 명령은 main context에 위치하고 server, location은 http에 위치한다.


static content
웹 서버에서 중요한 역할중 하나는 image, html pages와 같은 정적 페이지를 전달하는 것이다. 이를 위해서 http 블록 내부에 있는 server와 location 블록을 수정해보자.

일반적으로 설정 파일은 server_name과 listen port로 구분되는 여러 server 블록을 가지고 있다.

1
2
3
4
http {
  server {
  }
}
cs

기본형태는 이렇다.


그럼 이걸 이용해서 static content에 접근할 수 있게 해보자.

아래와 같이 설정하면 /dd로 오는 요청은 무조건 저쪽 static 페이지를 통하게 된다. 

1
2
3
4
location /dd {
    root /Users/we/Documents
    index index.html
  }
cs

만약 호출 uri가 중첩되는 경우가 아래와 같이 발생하면 가장 긴 uri의 매칭을 따르게 된다.

1
2
3
4
5
6
7
8
9
server {
    location / {
        root /data/www;
    }
 
    location /images/ {
        root /data;
    }
}
cs


만약 설정이 정상적으로 동작하지 않을 때는 로그를 확인해봐야 한다. 로그에는 access.log, error.log가 존재한다. 맥 기준으로 log 폴더는 /usr/local/var/log/nginx에 존재한다.


proxy 설정

정적 페이지 연결과 더불어서 proxy로서 역할을 진행할 수 있다. 여러 서버들 사이에서 요청을 분배하는 것을 reverse proxy라고 한다.

proxy설정은 정적 페이지와 동일하게 http 블록 내에 server 블록으로 설정한다.

1
2
3
4
5
6
7
8
9
10
11
12
server {
  listen 80;
  
  location / {
    proxy_pass http://127.0.0.1:8081;
  }
 
  location /dd {
    root /Users/we/Documents/static;
    index index.html;
  }
}
cs

만약 listen을 기재하지 않으면 80으로 기본으로 매핑된다. 만약 아래와 같이 server 바로 밑에 root를 적게되면 server에 기재한 root에서 정적페이지 index.html을 찾고 각 location에 root를 입력해도 무시된다.

1
2
3
4
5
6
7
server {
    listen 8080;
    root /data/up1;
 
    location / {
    }
}
cs


또한 경로 매핑을 정규식으로도 진행할 수 있다. 아래와 같이 설정하면 .gif, .jpg, .png 형태로 들어오는 경우에 매핑 된다.

1
2
3
location ~ \.(gif|jpg|png)$ {
    root /data/images;
}
cs


설정 파일 폴더 구조

  • sites-available : 가상 서버 환경들에 대한 설정 파일들이 위치하는 부분. 가상 서버를 사용하거나 사용하지 않던간에 그에 대한 설정 파일들이 위치하는 곳
  • sites-enabled : sites-available에 있는 가상 서버 파일들중에서 실행시키고 싶은 파일을 symlink로 연결한 폴더. 실제로 이 폴더에 위치한 가상서버 환경 파일들을 읽어서 서버를 세팅한다.
  • nginx.conf : Nginx에 관한 설정파일로 Nginx 설정에 관한 블록들이 작성되어 있으며 이 파일에서 sites-enabled 폴더에 있는 파일들을 가져온다. (include 명령어를 사용).


gzip

gzip은 전달해오는 요청을 압축해서 진행하기 위해서 사용하는 옵션이다. types를 통해서 수용하는 타입도 정의할 수 있다.


apache와 많은 부분이 다르다. 정확하게 어떤 웹 서버가 좋다고 할 수는 없지만 많은 트래픽을 받는 경우에는 nginx를 사용하면 좋을 것 같다.

'IT 지식 > nginx' 카테고리의 다른 글

nginx 정리와 설치 및 기본 설정방법  (0) 2019.02.15
web/Spring

Spring Context 종류 및 특성

Spring Context 종류 및 특성

Spring 프로젝트를 처음 생성할 시 root-context.xml과 servlet-contex.xml 두 개가 생성됩니다.
이 두개가 각각 하는일이 지정되어 있는데 무심코 사용하는 경우가 많습니다.

이 둘의 차이점에 대해서 설명하겠습니다.

spring은 multi context 환경을 제공해주는데 기본적으로는 root context와 servlet context로 구분됩니다.

1. servlet-context
web application의 client의 요청을 받기 위한 entry point 입니다. 따라서 해당 context의 설정에는 요청에 대한 처리를 해줄 controller의 매핑설정(handler mapping)과 요청처리 후 view처리를 어떻게 할 것인가에 대한 설정(view resolver) 등이 존재하게 됩니다.


2. root-context
web application의 실제 비지니스 혹은 목적을 위한 service layer와 해당 service layer에서 조회 및 처리에 필요한 database 와 연결되는 repository layer를 구성하는 bean들에 대한 설정을 하게 됩니다.







web/Spring

/과 /*의 차이점을 포함한 url-mapping 정리

web.xml에서 

servlet-mapping 설정 시 url-pattern을 설정하는 것에 대해 
정확한 정리가 되어 있지 않아서 정리해보았다. 


[url-pattern별 의미] 
1. "/"로 시작하고 "/*"로 끝나는 패턴은 path로 인식 
-> /wedul/list, /wedul/user 등 모든 URL 패턴을 매칭 


2. "*."으로 시작하는 경우 확장자 매칭 
-> 과거 확장자 *.do 또는 *.ajax와 같은 패턴 매칭 


3. "/"만 정의한 경우 디폴트 서블릿 의미 
-> default servlet은 servlet mapping에 걸리지 않은 나머지 매핑요소들을 처리한다. 


4. 그 외의 경우는 정확하게 일치하는 매칭 


/* Dispathcher servlet을 /*으로 했을때의 문제

/*으로 매핑하였을 경우에 모든 매핑 패턴에 대해 매핑되어서 
.jsp, .html 등 이런 요소들에 대한 매핑이 되지 않을 수 있다. 



※ 오류내용 
No mapping found for HTTP request with URI [/WEB-INF/jsp/article.jsp] in DispatcherServlet with name 'dispatcher


그래서 이를 해결 하기 위해서는 dispatcher servlet의 url-pattern별을  
/으로 변경하여야 한다. 

그렇게 되면 *.jsp, *.html 과 같은 패턴이 jspServerlet등에서 처리를 다하고, 넘어오는 요청에 대해서 Default Servlet이 잡아서 이를 처리하게하는 것이다. 

그러면 jsp와 같은 패턴이 다른 서블릿에 걸리지 않는 문제를 해결할 수 있다. 


1
2
3
4
5
6
7
8
<!-- viewResolver --> 
<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <property name="viewClass" 
        value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 
cs



※주의사항 
DispatcherServlet에 / url-pattern을 지정하면서 
tomcat의 server.xml에 /를 무시하기 때문에 정적 요소들에 대한 접근이 되지 않는 경우가 있을 수 있다. 

그 이유는 /wedul/picture.jpg와 같은 요청이 
@Controller에 정의 되어 있지 않는 경우 매핑될 곳이 없기 때문이다.

ex) 
http://10.77.171.151/wedul/picture.jpg 


※ 오류내용 
DispatcherServlet with name 'dispatcher' processing GET request for [/img/button.jpg] 


이를 해결하기 위해서는 다음 xml을 적어주면된다. 
<mvc:default-servlet-handler /> 


이는 매핑이 안된 나머지 url을 DefaultServletHttpRequestHandler가 담당하게 하여 처리하게 하게 해준다. 내부에 url-patting은 /**로 되어있다. 


[결론] 

 

/로 했을 때 모든 url-mapping을 dispatcher-servlet에서 처리하겠다고 했으나,  
처리가 안된 url에 대해서 다시 spring의 default 서블릿에게 넘겨버리는 형태이다. 그래서 정적 리소스에 대한 접근을 가능하게 해주는 것이다.


web/Spring

외부 properties 파일을 이용해서 스프링 빈을 생성하는 방법

1. XML에서 프로퍼티 설정


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// xml
 
<context:property-placeholder location="classpath:database.properties" />
 
<bean id="dataSource" class=".............">
  <property name="driverClass" value="${db.driver}" />
  <property name="jdbcUrl" value="${db.jdbcUrl}" />
  <property name="user" value="${db.user}" />
  <property name="password" value="${db.password}" />
</bean>
 
// properties 파일
db.driver=com.mysql.jdbc.Driver
db.jdbcUrl=jdbc:mysql://localhost/spring4fs?characterEncoding=utf8
db.user=test
db.password=test
cs



<context:property-placeholder> 태그는 location 속성으로 지정한 프로퍼티 파일로부터 정보를 읽어와 빈 설정에 입력한 플레이스 홀더의 값을 프로퍼티 파일에 존재하는 값으로 변경한다.
# place holder는 ${로 시작하고 }로 끝나는 값.

주의 할 점은
서로 다른 xml에서 서로다른 위치에 프로퍼티 파일을 사용한다고 해도 
먼저 열린 프로퍼티 값이 우선순위를 가지게 되어 두 번째 프로퍼티 파일이 열리지 않을 수 있다.

예를 들면



1
2
3
4
5
test.xml에서 
<context:property-placeholder location="classpath:test.properties" />
 
db.xml에서
<context:property-placeholder location="classpath:db.properties" />
cs



오류 메시지
Could not resolve placeholder .... in string value ...

이를 해결하기 위해서는 한 곳에서 placeholder를 사용하도록 구성하는 것이 좋다.

2. @Configuartion 애노테이션 이용 자바 설정에서의 프로퍼티 사용




@Configuration public class Config { @Value("${db.driver}") private String driver; @Bean public static PropertySourcesPlaceHolderConfigurer properties() { PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); configurer.setLocation(new ClassPathResources("test.properties")); return configurer; }


web/javaScript

javascript로 여러 파일 다운로드 하기

회사에서 프로젝트를 진행하다가 
자바스크립트로 여러 파일을 동시에 다운받게 할 일이 있었다.

기존에 다음과 같이 반복을 통해서 진행하였더니, 정상적으로 동작하지 않았다.
그 이유는 정확히 알지 모르지만 같은 요청을 동시에 요청하는 것을 막는 것 같다.



1
2
3
4
5
6
7
8
<a id="link" href="http://www.querybox.com/down/QB_x86/QueryBox-3.2.1.1139-windows_Freeware_i386.exe"/>
 
<script>
(function() {
  document.getElementById('link').click();
  document.getElementById('link').click();
})();
</script>
cs






코드에 두개를 요청하였으나, 하나만 다운로드가 되는 것을 알 수 있다.




실패에 원인이 제대로 출력되지 않아 정상적으로 확인하기는 어렵다.

[해결법]
이를 바꾸기 위해서는 어느정도에 interval을 주어야 한다.



1
2
3
4
5
6
7
8
9
10
<a id="link" href="https://dl.bandisoft.com/bandizip.kr/BANDIZIP-SETUP-KR.EXE">dd</a>
 
<script>
(function() {
      document.getElementById('link').click();
    setTimeout(function() {
      document.getElementById('link').click();
    }, 4000);
  })();
</script>
cs





이렇게 하면 해결이 되지만, 만약 서버에 request 응답 시간이 지연되면 마찬가지로 되지 않는다.

그럴 경우 promise를 통해 진행하는 것을 추천한다.


참고
https://okky.kr/article/342146

 [ 1 ]  [ 2 ]  [ 3 ] 

푸터바

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

  • Today : 22
  • Yesterday : 503
  • Total : 68,724