recordingbetter's devlog

Python, Django, DRF, Postgresql, AWS, Docker....

06 Nginx와 Supervisor 설정

05 July 2017


Nginx / Supervisor

Nginx 설치, 설정 (local)

# install nginx
$ brew install nginx

# 실행
$ nginx

# 실행 상태 확인
$ ps -ax | grep nginx

# nginx 종료
$ sudo nginx -s stop
  • 설정파일 : ‘/usr/local/etc/nginx/nginx.conf’
  • 기본 html 위치 : ‘/usr/local/Cellar/nginx/1.12.0_1/html’
  • localhost:8080으로 접속했을때 처음 열리는 html : ‘/usr/local/Cellar/nginx/1.12.0_1/html/index.html’

Nginx 설치, 설정 (AWS)

Nginx 안정화 최신버전 사전세팅 및 설치

~ sudo apt-get install software-properties-common python-software-properties
~ sudo add-apt-repository ppa:nginx/stable
~ sudo apt-get update
~ sudo apt-get install nginx

# 버전 확인 
~ nginx -v

user 추가

~ sudo adduesr [username]

Nginx 동작 User 변경

~ sudo vi /etc/nginx/nginx.conf

# 아래 내용 수정
user [username];

server_names_hash_bucket_size 250;
Nginx conf 파일을 Django 프로젝트에서 만들어줘도 된다.
  • [project]/.config/nginx/nginx.conf
user root;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

# Docker로 실행할 경우 필요함
daemon off;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	# server_tokens off;

	 server_names_hash_bucket_size 250;
	# server_name_in_redirect off;

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

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;
	gzip_disable "msie6";

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}


#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#	server {
#		listen     localhost:110;
#		protocol   pop3;
#		proxy      on;
#	}
#
#	server {
#		listen     localhost:143;
#		protocol   imap;
#		proxy      on;
#	}
#}
  • [project]/.config/nginx/nginx-app.conf
server {
    listen 80;
    server_name *.compute.amazonaws.com;
    charset utf-8;
    client_max_body_size 128M;

    location / {
    # 소켓파일 위치
        uwsgi_pass    unix:///tmp/eb.sock;
        include       uwsgi_params;
    }
}

  • AWS에서 아래 명령으로 기존 config 파일에 덮어씌움
~ sudo cp -f /srv/deploy_ec2/.config_secret/nginx/nginx.conf /etc/nginx/nginx.conf
~ sudo cp -f /srv/deploy_ec2/.config_secret/nginx/ec2.conf /etc/nginx/sites-available
  • 아래 명령으로 서비스할 사이트 목록 정리 (링크 생성. 아래에도 내용 있음)
~ sudo ln -sf /etc/nginx/sites-available/ec2.conf /etc/nginx/sites-enabled/ec2.conf
~ sudo cp -f /srv/deploy_ec2/.config_secret/uwsgi/uwsgi.service /etc/systemd/system/uwsgi.service

# 기존 default 삭제 (이제 default index.html은 볼 수 없음)
~ sudo rm -rf /etc/nginx/sites-enabled/default

AWS Console에서 80 포트를 열어줌

  • Security Group에서 DeployEC2 그룹의 Inbound rule에 HTTP 추가

참고

Nginx 내부 가상 서버

  • nginx는 내부 가상버서를 돌려서 여러 도메인을 개별적으로 처리 가능
# 현재 데이터(설정파일)를 가지고 있는 사이트들
/etc/nginx/sites-available
site a
site b
site c
site d

# 현재 서비스를 하고 있는 사이트들(b, c는 서비스 중지, 파일은 보관)
/etc/nginx//sites-enable
(symbolic link)site a
(symbolic link)site d

http 요청 처리 방식

  • EC2 -> (http) -> Django
  • EC2 -> (http) -> uWSGI (WSGI) -> Django
  • EC2 -> (http) -> Nginx -> (uWSGI’s UnixSocket) -> uWSGI (WSGI) -> Django

sites-available / sites-enabled

  • 서비스할 사이트에 대해 설정 파일을 만들어준다.
  • /etc/nginx/sites-available에 ec2 파일 생성하여 아래 내용 작성
~ sudo vi /etc/nginx/sites-available/ec2

server {
			listen 80;
			server_name ec2-13-124-12-223.ap-northeast-2.compute.amazonaws.com;
			charset utf-8;
			client_max_body_size 128M;
			
			location / {
			uwsgi_pass		unix:///tmp/ec2.sock;
			include			uwsgi_params;
			}
}
  • sites-enabled에 서비스할 사이트 파일 링크
# 기본 설정을 삭제 (링크되어있는 파일)
~ sudo rm -rf /etc/nginx/sites-enable/default

# 서비스할 ec2 파일의 Symbolic link 생성
~ sudo ln -sf /etc/nginx/sites-available/nginx-app.conf /etc/nginx/sites-enabled/nginx.conf

# 서비스 사이트 목록이 변경되었으므로 nginx 재시작
~ sudo systemctl restart nginx

Supervisor

  • 설정된 프로그램 실행 상태를 모니터하고 있다가 종료되면 바로 다시 실행시킴

  • supervisor 설치

~ sudo apt-get install supervisor
  • [project]/.config/supervisor/nginx.conf
[program:nginx]
command = nginx
  • [project]/.config/supervisor/uwsgi.conf
[program:uwsgi]
command=/root/.pyenv/versions/deploy_eb_docker/bin/uwsgi --ini /srv/deploy_eb_docker/.config/uwsgi/uwsgi-app.ini
blog comments powered by Disqus