컴퓨터반

컴퓨터반 게시판입니다.

제목라즈베리파이에 웹서버 구축하기 : nginx 설치2021-10-19 23:55:12
작성자user icon Level 2
첨부파일server.zip (0.5KB)

88x31.png


1. 웹서버(Web Server)란?


웹서버(Web Server)는 HTTP에 의한 요청(request)을 받아들여 응답(Response)하는 프로그램입니다. 주로 이미지, CSS, Javascript를 포함한 정적인 HTML 문서를 처리합니다.


웹서버에는 아파치(Apache)와 엔진엑스(Nginx) 등이 있습니다. 아파치는 쓰레드/프로세서 기반의 구조이고 엔진엑스는 이벤트 기반의 구조로 아파치보다 가볍기때문에 이 글에서는 엔진엑스를 설치하겠습니다.



2. 엔진엑스(nginx)의 기능


1) 정적 페이지를 처리하는 웹서버 역할


웹페이지는 크게 정적 페이지와 동적 페이지로 나눠집니다.정적 페이지는 이미지, CSS, Javascript를 포함한 저장된 HTML 문서를 그대로 전달하는 웹페이지입니다. 반면 동적 페이지는 스크립트에 의해 가공된 데이터를 전달하는 웹페이지입니다. 물론 웹서버가 php같은 서버 사이드 스크립트를 지원하기도 하지만 기본적으로는 정적 페이지를 처리합니다.


2) 리버스 프록시(Reverse Proxy) 역할


프록시(Proxy)는 클라이언트와 서버 사이에서 데이터를 중계해주는 서버입니다. 여기에는 포워드 프록시(forward proxy)와 리버스 프록시(reverse proxy)가 있습니다. nginx는 자체적으로 리버스 프록시 기능을 제공합니다.


포워드 프록시는 클라이언트의 요청을 직접적으로 전달하지 않고 프록시 서버를 통해 간접적으로 요청합니다. 회사의 인트라넷같은 경우 인터넷상의 서버에 요청을 할때 프록시서버를 통해 요청을 하게 됩니다. 클라이언트의 요청을 감독할 수 있고 서버에서는 클라이언트의 신분을 알 수 없어 프라이버시와 보안을 강화할 수 있습니다.


mb-file.php?path=2021%2F10%2F19%2FF4055_1.png 


리버스 프록시는 그 반대입니다. 서버에서 받은 응답을 프록시 서버를 통해 전달합니다. 클라이언트의 요청을 분산하여 서버의 부담을 줄일 수 있고 클라이언트는 서버의 신분을 알 수 없어 서버 보안을 강화할 수 있습니다.


mb-file.php?path=2021%2F10%2F19%2FF4056_2.png 



3. 라즈베리파이에 nginx 설치


우선 명령프롬프트(cmd)를 통해 다음 명령어를 입력하여 라즈베리파이에 로그인합니다.

 > ssh pi@ip주소


mb-file.php?path=2021%2F10%2F19%2FF4057_3.png


sudo apt update && sudo apt upgrade를 입력하여 업데이트 해줍니다.

mb-file.php?path=2021%2F10%2F19%2FF4058_4.png

다음 명령어를 입력하여 nginx를 설치합니다.

 $ sudo apt install nginx


mb-file.php?path=2021%2F10%2F19%2FF4059_5.png 

계속 하시겠습니까? [Y/n] 메시지가 뜨면 y를 입력하고 엔터를 누릅니다.


설치를 완료후 크롬에서 라즈베리파이 ip주소를 입력하면 다음과 같이 웹페이지가 뜹니다.

mb-file.php?path=2021%2F10%2F19%2FF4060_6.png
 

4. 설정파일 수정


설정파일을 수정해보겠습니다. 다음 명령어를 입력합니다.

 $ sudo nano /etc/nginx/nginx.conf


mb-file.php?path=2021%2F10%2F19%2FF4061_7.png
 

1) 코어

user : nginx는 메인 프로세스(master)와 작업 프로세스(worker)로 구성되는데 user는 작업 프로세스의 권한을 지정합니다.

worker_processes :  워커 프로세스 실행 갯수를 지정합니다. 보통 코어 갯수만큼 설정하거나 auto로 적으면 됩니다.

pid : 마스터 프로세스의 id정보가 저장됩니다.

include : 다른 파일을 가져옵니다.


2) events 블록

worker_connections : 하나의 작업 프로세스에서 처리할 수 있는 접속자 수를 지정합니다.

multi_accept : 다중 접속의 여부를 지정합니다.


3) http 블록

sendfile: sendfile() 함수의 사용여부를 지정합니다.

tcp_nopush : TCP_CORK 사용 여부를 지정합니다. on인 경우 버퍼가 가득찼을때만 패킷을 전송합니다.

tcp_nodelay : on인경우 패킷 크기에 상관없이 버퍼에 데이터를 보냅니다.

keepalive_timeout : 연결을 유지할 수 있는 최대 시간을 지정합니다.

types_hash_max_size : 도메인 이름 최대 길이를 지정합니다.

ssl_protocols : 사용할 SSL-TLS 버전을 지정합니다.

ssl_ciphers : 사용할 알고리즘을 지정합니다.

ssl_prefer_server_ciphers : SSL-TLS 핸드쉐이크 과정에서 서버 알고리즘을 우선할지 설정합니다.

gz​ip : gzip 압축 전송을 사용할지 설정합니다.

access_log : 접근로그를 기록할 경로를 지정합니다.

error_log : 에러로그를 기록할 경로를 지정합니다.

server_tokens : nginx 버전을 나타낼지를 설정합니다.

on인경우(default)

mb-file.php?path=2021%2F10%2F19%2FF4062_8.png 

off인경우

mb-file.php?path=2021%2F10%2F19%2FF4063_9.png 


4) server 블록 : 웹서버를 설정합니다. http 블록에서 /etc/nginx/sites-enabled/* 파일을 include 하고 있기때문에 서버블록은 여기에 작성하셔도 됩니다. 기본적으로 /etc/nginx/sites-available 폴더에 작성하고 /etc/nginx/sites-enabled 폴더에는 심볼릭링크를 생성합니다.

listen : ip와 포트번호입니다. ip는 생략가능하며 default 포트는 80입니다.

server_name : 도메인 네임입니다. 서브도메인으로 와일드카드 *을 사용가능합니다.

root : 서버의 루트 경로입니다.

index : 파일명이 없을때 접근할 기본파일입니다.

try_files : URI에 일치하는 파일이 없는 경우 제공되는 파일입니다.

allow : 해당 ip로 오는 요청만 허용합니다.

deny : 해당 ip로 오는 요청은 거부하고 403 forbidden을 리턴합니다.

return : 해당 경로로 redirect합니다. URI가 변합니다.

rewrite : URI 변화없이 내부적으로 해당 경로로 응답합니다.

proxy_pass : 프록시 서버로 작동합니다.

location : request URI에 따른 설정을 합니다. URI와 비교할 패턴지정은 다음과 같습니다.

 우선순위

변경자 설명
1=

URI와 정확하게 일치합니다.

예) location =/test { }

http://localhost/test (일치)

http://localhost/test/ (불일치)

2

^~

URI의 앞부분이 일치합니다.

예) location ^~/t {}

http://localhost/test (일치)

http://localhost/Test(불일치)

3

~

정규표현식과 일치합니다.

예) location ~/Test[0-9]+ { }

http://localhost/Test1 (일치)

http://localhost/test1 (불일치)

3

~*

대소문자 구분없이 정규표현식과 일치합니다.

예) location ~*/Test[0-9]+ { }

http://localhost/test2 (일치)

http://localhost/test (불일치)

4


아무것도 없으면 prefix로 작용합니다. ^~와 같지만 우선순위가 다릅니다.

예) location /test { }

http://localhost/test (일치)

http://localhost/Test(불일치)


4) upstream 블록 : upstream 서버를 설정합니다. 클라이언트의 요청을 각 서버에 분배해줍니다. 프록시 서버가 upstream으로 작용합니다.

upstream <이름> {

    <밸런스타입>;

    server <host1>:<port1> [파라미터];

    ...

    server <host2>:<port2> [파라미터];

}


 밸런스 타입

 설명

 round-robin

 번갈아가며 분배합니다.

 hash <키값>

 해쉬값으로 분배합니다.

 ip_hash

 ip를 해싱하여 분배합니다. (같은 ip는 같은 서버에 접속)

 random

 랜덤으로 분배합니다.

 least_conn

 가중치를 고려하여 연결수가 적은 서버로 분배합니다.

 least_time

 응답시간이 가장 짧은 서버로 분배합니다.


 파라미터

 설명

 weight

 가중치를 두어 분배합니다.

 max_conns

 최대 연결 한계를 설정합니다.

 max_fails

 최대 실패 한계를 설정합니다.

 fail_timeout

 타임아웃 시간을 설정합니다.

 backup

 백업서버로 간주하여 다른 서버가 죽었을때 동작합니다.

 down

 사용하지 않는 서버입니다.


upstream 서버를 생성하보겠습니다.

다음 명령어를 입력합니다. nginx 설치시 기본설정되어있는 서버입니다.

 $sudo nano /etc/nginx/sites-available/default


내용을 모두 지우고 다음과 같이 작성합시다.

upstream upstream_server {

    server 192.168.219.107:8080;

    server 192.168.219.107:8081;

}


server {

    listen 80;

    listen [::]:80;


    location / {

        proxy_pass http://upstream_server;

    }

}


포트번호 8080과 80801에 대한 웹서버는 도커로 만들겠습니다.

도커가 설치되어있지 않다면 https://www.robotstory.co.kr/raspberry/?board_name=raspberry_bbs&order_by=fn_pid&order_type=desc&vid=32를 참고하세요.


우선 다음 명령어를 입력하여 서버폴더를 생성합니다.

 $ sudo mkdir -p /home/pi/server


다음을 입력하여 html파일을 만듭니다.

 $ sudo nano /home/pi/server/index.html


다음을 입력하고 Ctrl + O를 눌러 저장하고 Ctrl + X로 빠져나옵니다.

<!doctype html>

<html lang="kr">

    <head>

    <meta charset="UTF-8">

        <title>서버 테스트</title>

    </head>

    <body>

        <p> 서버를 테스트합니다.</p>

    </body>

</html>


다음 명령어를 입력하여 웹서버 설정파일을 만듭니다.

 $ sudo nano /home/pi/server/default.conf


다음을 입력하고 Ctrl + O를 눌러 저장하고 Ctrl + X로 빠져나옵니다.

server {

    listen 8080;

    listen [::]:8080;


    root /usr/share/nginx/html;

    index index.html;


    access_log /usr/share/nginx/html/server1.log;


    location / {

        try_files $uri $uri/ =404;

    }

}


server {

    listen 8081;

    listen [::]:8081;


    root /usr/share/nginx/html;

    index index.html;


    access_log /usr/share/nginx/html/server2.log;


    location / {

        try_files $uri $uri/ =404;

    }

}

8080 포트로 들어오면 server1.log에 접속기록이 남고 8081 포트로 들어오면 server2.log에 기록이 남습니다.


http://ip주소:9000 으로 이동합니다.

계정을 입력하고 로그인합시다.


App Templates > NginX를 선택하세요.

mb-file.php?path=2021%2F10%2F19%2FF4064_11.png


namewebserver1을 입력하고 Show advanced options를 누르세요.

mb-file.php?path=2021%2F10%2F19%2FF4065_12.png

port는 호스트와 컨테이너 모두 8080을 적어주고 아래쪽 443은 휴지통을 눌러 삭제합니다.
mb-file.php?path=2021%2F10%2F19%2FF4066_13.png

volume은 Bind를 눌러 다음과 같이 적습니다.

container  /etc/nginx/conf.d/default.conf

host  /home/pi/server/default.conf


container  /usr/share/nginx/html

host  /home/pi/server


mb-file.php?path=2021%2F10%2F19%2FF4067_14.png
Deploy the container를 눌러 웹서버를 만듭니다.


Container를 누르고 webserver1을 누릅니다.

mb-file.php?path=2021%2F10%2F19%2FF4068_15.png

상단 오른쪽에 Duplicate/Edit를 누릅니다.

mb-file.php?path=2021%2F10%2F19%2FF4069_16.png


namewebserver2, port에서 hostcontainer8081을 입력한 후 Deploy the container를 눌러 2번째 웹서버를 만듭니다.
mb-file.php?path=2021%2F10%2F19%2FF4071_17.png
 


mb-file.php?path=2021%2F10%2F19%2FF4072_18.png

이제 http://ip주소 로 들어가세요.

mb-file.php?path=2021%2F10%2F19%2FF4073_19.png
다음 화면이 뜨면 F5를 눌러 계속 새로고침 해봅시다.

그 후 라즈베리파이에 /home/pi/server 폴더에 있는 server1.log 파일과 server2.log 파일을 열어봅시다. upstream 설정에 의해 webserver1과 webserver2에 번갈아가며 접속된 것을 확인할 수 있습니다.

mb-file.php?path=2021%2F10%2F19%2FF4074_20.png
 


/etc/nginx/sites-available/default 파일에 upstream을 조금 변경해봅시다.

다음과 같이 가중치를 두고 sudo service nginx restart를 입력하여 nginx를 재시작후 서버에 접속해봅시다.

upstream upstream_server {

    server 192.168.219.107:8080 weight=2;

    server 192.168.219.107:8081;

}


2:1의 비율로 번갈아가며 접속된 것을 확인할 수 있습니다.

mb-file.php?path=2021%2F10%2F19%2FF4075_21.png
 



#웹서버# HTTP 서버# nginx
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)