[macOS] nginx로 웹서버 띄우기

lUA·2021년 4월 1일
6

server

목록 보기
1/1
post-custom-banner

개요



오랜만의 포스팅이다.
3달동안 프로젝트 하느라 매일을 야근하고 서비스 오픈 직전엔 밤도 샜다ㅠㅠ
육체적으론 많이 힘들었지만, 그만큼 많은 걸 배운 느낌이다.

오늘은 nginx를 설치하여 웹서버를 띄워볼 것이다.
얼마 전에 nginx로 서버를 띄워야 하는 일이 생겼는데,
이리저리 경험해보니 내가 직접 설치해서 설정해볼 수 있겠다 싶었음

스펙은 다음과 같다.

  • 운영체제 : macOS
  • 사용 프로그램 : Homebrew
  • nginx 버전 : 1.19.8

Apache와 Nginx



본론으로 넘어가기 전에 nginx에 대한 역사를 알아보자.
apache와 nginx는 전 세계적으로 가장 큰 오픈소스 웹서버들이다.
두 프로그램의 동작 원리는 다르지만 apache의 단점을 보완하고자 만들어진 게 nginx이다보니 nginx 출시 후 둘은 늘 비교 대상이 되어왔다.

1.1 Apache

Apache는 1995년도에 처음 출시된 후에 대표적인 웹서버로 자리매김하였으며,
요청 당 쓰레드 또는 프로세스가 처리하는 구조이다. nginx보다 모듈이 다양하며 안정성, 호환성 등에 우세하다.

1.2 Nginx

Apache보다 기능은 적은 대신 성능 면에서 우세하다. 더 적은 자원으로 더 빠른 서비스를 제공할 수 있는 '경량화'된 웹서버로 핵심은 '빠름'이다.
프로그램의 흐름이 이벤트에 의해 결정(event-based)이 되며 여러 개의 커넥션을 이벤트 핸들러를 통해 비동기 방식으로 처리한다.
Apache에 비하여 스레드를 많이 사용하지 않기 때문에 CPU 소모도가 상대적으로 낮다.
적은 수의 스레드로 효율적인 일처리가 가능하기에 많은 접속자들이 와도 대응을 할 수 있다.

예전엔 nginx를 차세대 웹서버라고 불렀는데, 이제는 사용자가 가장 많이 사용하는 웹서버가 되었다.
출시 이후 늘 사용자 사용 1위를 차지했던 아파치는 2019년, nginx에게 1위 자리를 넘겨주게 되었다.

1.3 무엇이 더 좋은가?

이건 상황에 따라 달라지기 때문에 어떤 것이 더 좋다고 결론을 내릴 순 없다.
서버의 부담을 줄이고 싶다면 nginx를 추천한다.

Nginx 프로세스


nginx는 하나의 master 프로세스와 여러 개의 worker 프로세스를 가진다.
master 프로세스는 nginx의 성능을 측정하고 worker 프로세스를 관리한다.
worker 프로세스는 요청을 처리하며, worker 프로세스 사이에 요청을 효율적으로 분배하기 위해 운영체제에 의존한다.
worker 프로세스의 개수는 설정 파일에서 알 수 있는데 정의된 프로세스 개수와 사용 가능한 cpu 코어 숫자에 맞게 자동으로 조정된다.

본론


이제 nginx로 웹서버를 띄워보자.

2.1 다운로드

nginx를 사용하기 위해선 먼저 다운로드 해야 한다.

brew install nginx

다운로드가 잘 되었는지 확인하려면 버전을 검색해본다.
버전이 뜬다면 다운로드에 성공한 것이다.

nginx -v
// nginx version: nginx/1.19.8

homebrew를 이용한 nginx는 다음과 같은 경로에 설치된다.
(설치방법 혹은 운영체제에 따라 /usr/local/nginx/conf, /etc/nginx 등에 설치되기도 함)

usr/local/etc/nginx

nginx를 설치하면 기본적으로 포트가 8080으로 잡혀있다.

homebrew로 설치하면 현재 로그인된 사용자(mac의 user)의 권한으로 진행되는데,
nginx는 root가 아닌 사용자가 nginx를 설치할 경우 1024 포트보다 작은 포트를 사용할 수 없도록 되어있다.

80 포트를 사용하고 싶다면 설정 파일의 포트를 변경한 후에 설정 적용 시 'sudo'를 붙여야 한다.

설정파일 경로는 다음과 같다.

sudo vi /usr/local/etc/nginx/nginx.conf

포트를 8080에서 80으로 변경하면 된다.

server {
 listen       80;
 server_name  localhost;

포트가 80이 아닐 때 일부 서비스에서 인코딩 혹은 서버와의 통신 오류가 발생할 수 있으므로 80번 포트로 지정해 놓는 게 좋다.

2.2 사이트 설정

nginx를 사용하는 방법은 여러가지가 있는데,
나는 하나의 서버에서 여러 개의 사이트를 띄우는 방법으로 사용했다.
이걸 가상 호스트(Virtual Hosts) 기능이라고 하는데, nginx를 포함한 거의 모든 웹서버에서 해당 기능을 가지고 있다.

1) 띄우려는 사이트들을 설정하고
2) 그 사이트들을 nginx 서버와 연결하면 된다.

sites-available, sites-enable 폴더에서 설정 및 연결할 수 있다.
sites-available 폴더에는 연결하려는 서비스에 대한 사이트 정보를 정의하면 되고,
sites-enabled 폴더에는 available의 파일의 심볼링크를 걸면 된다.
만약 폴더가 없다면 만들어주자.

mkdir sites-available
mkdir sites-enabled

sites-avaliable 폴더에서 정보를 입력하자.

server {
 listen 80;
 server_name 도메인명;
 server_name ip주소;
 root 루트경로;
 index index.html;

 access_log /var/log/nginx/파일명.access.log;
 error_log /var/log/nginx/파일명.error.log;
 location / {
     try_files $uri /index.html =404;
  }
}

sites-enabled 폴더에서 심볼링크를 건다. ln = link다.

sudo ln -s ../sites-available/파일명 .

설정을 적용하기 전에 작성한 파일에 이상이 없는지 확인해보자.
-t는 nginx에 설정된 파일들을 테스트로 실행시켜본다.

sudo nginx -t

successful 이라는 답을 얻으면 성공이다.
에러가 있다면 nginx는 failed 답과 함께 원인을 알려준다.

2.3 설정 적용

설정을 해준 후에는 적용을 해줘야 한다.
nginx를 restart하거나 reload 해주면 된다.

sudo brew service reload nginx
sudo systemctl reload nginx

reload와 restart의 차이점은 '서버 중단 여부'이다.

reload는 서버를 중단시키지 않고 명령어를 입력한 시점부터 설정 파일에서 변경된 사항만 적용한다.
restart는 이름 그대로 서버를 껐다가 켠다.
설정 파일 적용 시 restart를 해도 되지만 무중단 서버를 위해선 reload를 추천한다.

그 외 명령어들은 다음과 같다. (Homebrew로 설치했을 때의 명령어와 일반 nginx 명령어)

시작 명령어

sudo brew services start nginx
sudo systemctl start nginx

중지 명령어

sudo brew services stop nginx
sudo systemctl stop nginx

재시작 명령어

sudo brew services restart nginx
sudo systemctl restart nginx

상태확인 명령어

sudo brew services status nginx
sudo systemctl status nginx

2.4 디렉토리 설정

만든 디렉토리의 소유권을 nginx 기본 사용자인 www-data에게 넘기자.
chown은 change own의 약자로, 파일의 소유자나 그룹을 변경할 때 사용한다.

sudo chown -R $USER:www-data /디렉토리경로

디렉토리 권한이 755가 아니라면 변경하자.

chmod는 change mode로 파일의 사용권한을 변경할 때 사용한다.

755로 설정하면 사용자와 그룹은 파일 읽기, 쓰기, 실행 모두 가능하고 그 외는 읽기와 실행만 가능하다.

sudo chmod -R 755 /디렉토리경로

2.5 확인

서버가 잘 띄워졌는지 확인해보자.

netstat -anv | grep LISTEN


마지막으로 nginx 웹서버를 접속해보자.

설정된 페이지나 위 페이지가 뜨면 성공! 😎

마치며


macOS에서 nginx를 설치해보았다.
이 외에도 proxy 서버를 띄워서 보안을 강화하거나 로드 밸런스와 붙여서 트래픽 부하를 줄일 수 있다.

문의, 지적 언제나 환영합니다.

profile
기록을 생활화하려는 개발자
post-custom-banner

0개의 댓글