Prj PJ

[리눅스] Nginx 설치 및 포트포워딩

솔헬레나 2023. 5. 23. 23:13

 

[ 사전설정 ]

- 공유기에서 기본포트 설정

ㄴ 리눅스 설치 후 Nginx를 설치할 OS의 IP를 공유기 설정에서 포트번호를 지정해준다.

1) Nginx를 설치할 리눅스의 IP주소를 복사한다 (리눅스 쉘에서 hostname -I 입력 후 엔터)
2) 공유기 설정 > port Forwarding에서 설정 가능하다.
기본적으로 https는 443, http는 80 으로 설정한다. 


# 직접설치

1. Nginx를 설치한다

$ sudo apt-get install nginx

 

2. Nginx를 실행한다

$ sudo service nginx start

 

3. 브라우저에서 Nginx가 설치된 IP로 접근하여 아래 화면이 나오면 성공

Nginx가 실행되면 디폴트 포트인 80번으로 접근하면 아래 화면이 나타난다.

 

포트포워딩 설정

4. default.conf 파일을 열기한다

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

5. .yml파일에 원하는 포트번호 또는 포워딩할 URL을 기입한다.

 location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;
                proxy_set_header    HOST $http_host;
                proxy_set_header    X-Real-IP $remote_addr;
                proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header    X-Forwarded-Proto $scheme;
                proxy_set_header    X-NginX-Proxy true;
                proxy_pass http://localhost:"원하는 포트 번호";
                proxy_redirect  off;
                charset utf-8;
        }

6. 적용 및 재시작

$ sudo nginx -t
$ sudo service nginx reload

 

 

 


# docker 로 설치하기

1. docker을 설치한다

https://helena90-study.tistory.com/23

 

[리눅스] docker 설치하기

보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.

helena90-study.tistory.com

 

2. 무료 인증서 생성 및 준비한다 ( TODO )

: https 를 사용하기 위함 http만 이용 시 불필요 , 그리고 하기의 443 설정도 80 으로 설정한다. 

 

3. nginx설치를 위해 4가지의 파일을 작성한다.

ㄴ1) Dockerfile 작성

sudo vi DockerFile
FROM nginx:latest

USER root

RUN mkdir -p /var/www/www
RUN mkdir -p /var/www/blog
RUN mkdir -p /var/www/certbot
RUN mkdir -p /etc/letsencrypt

RUN chown nginx:nginx /var/www
RUN chown nginx:nginx /var/www/www
RUN chown nginx:nginx /var/www/blog
RUN chown nginx:nginx /var/www/certbot
RUN chown nginx:nginx /etc/letsencrypt

ADD ./nginx/nginx.conf /etc/nginx/nginx.conf

 

ㄴ2) docker-compose.yml을 작성

sudo vi docker-compose-nginx.yml
version: '3.3'
services:
  nginx:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: "home-nginx"
    restart: unless-stopped
    volumes:
      - ./certbot/etc:/etc/letsencrypt
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/log:/var/log/nginx
      - ./docroot/www:/var/www/www
      - ./docroot/blog:/var/www/blog
    ports:
      - 80:80
      - 443:443

ㄴ3) nginx.conf를 작성

sudo vi ./nginx/nginx.conf
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    client_max_body_size 0;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

ㄴ4) default.conf 를 작성

sudo vi ./nginx/conf.d/default.conf
upstream blog_server {
   keepalive 20;
   server 워드프레스가설치된PC의IP:포트번호 max_fails=1 fail_timeout=10s;
}

# solena.kr 설정 ( 다른 곳에서 추가했을 기본설정- 참고용)
server {
    listen 80;
    listen [::]:80;
    server_name solena.kr;
    charset utf-8;
    root /var/www/www;

    access_log /var/log/nginx/www.solena.kr_access.log;
    error_log /var/log/nginx/www.solena.kr_error.log error;
    
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        return 301 https://www.$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name solena.kr;
    server_tokens off;
    charset utf-8;
    root /var/www/www;

    access_log /var/log/nginx/www.solena.kr_access.log;
    error_log /var/log/nginx/www.solena.kr_error.log error;

    ssl_certificate 보안키 위치 정보입력 ;
    ssl_certificate_key 보안키정보 입력 ;

    location / {
        return 301 https://www.$host$request_uri;
    }
}

# 블로그주소 설정
server {
    listen 80;
    listen [::]:80;
    server_name 블로그주소;
    charset utf-8;
    root /var/www/blog;

    access_log /var/log/nginx/blog.solena.kr_access.log;
    error_log /var/log/nginx/blog.solena.kr_error.log error;

    location / {
        return 301 https://$host$request_uri;
    }
}

#https설정
server {
    listen 443 ssl;
    server_name 블로그주소;
    server_tokens off;
    charset utf-8;
    root /var/www/blog;

    access_log /var/log/nginx/blog.solena.kr_access.log;
    error_log /var/log/nginx/blog.solena.kr_error.log error;

    ssl_certificate 보안키 정보;
    ssl_certificate_key 보안키 정보;

    client_max_body_size 0;
    chunked_transfer_encoding on;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Connection "upgrade";
    proxy_http_version 1.1;
    add_header Pragma "no-cache";
    add_header X-Frame-Options sameorigin;

    client_body_buffer_size 1m;
    proxy_redirect off;
    proxy_next_upstream error timeout invalid_header http_502 http_503;
    proxy_connect_timeout 2;
    proxy_intercept_errors on;
    proxy_buffering on;
    proxy_buffer_size 128k;
    proxy_buffers 256 16k;
    proxy_busy_buffers_size 256k;
    proxy_temp_file_write_size 256k;
    proxy_max_temp_file_size 0;
    proxy_read_timeout 300;

	# /api 경로로 오는 요청을 백엔드 upstream 의 /api 경로로 포워딩
    # location /api {
    #     proxy_pass         http://myweb-api/api;
    # }

	# / 경로로 오는 요청을 백엔드 upstream 의 / 경로로 포워딩
    location / {
        proxy_pass http://blog_server;
    }
}

 

ㄴ4) docker 실행

docker-compose -f docker-compose-nginx.yml up -d

 

# docker log 보기

docker logs -f --tail 10 home-nginx

docker logs -f --tail 10 home-nginx

 

# home certbot

DOMAIN={domainURL} docker-compose -f docker-compose-certbot.yml up

 

#clean

docker rm -f ${docker ps -a -q}