본문 바로가기
Django

centos7+django+nginx+uwsgi

by 이농이능 2018. 5. 24.

장고에서 자체적인 웹서버 실행 : python manage.py runserver 를 하며 테스트를 진행해왔으나,

이제 배포를 하기 위해서 uWSGI와 Nginx 서버를 이용하고자 함.


OS 는 centos7을 사용하고 있기 때문에 검색할 때 centos7 관련한 자료를 토대로 수행하였음.


출처

https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-uwsgi-and-nginx-on-centos-7

http://jaha01.tistory.com/12



프로젝트가 이미 설치된 상태에서 진행하였기 때문에 virtualenv, django 설치는 다루지 않음.


1. 

프로젝트 루트를 어떻게 하느냐에 따라서 작성해야하는 부분이 달라져야하기 때문에 

가상환경과 프로젝트 파일 루트를 잘 확인해야함. 본인 경로 확인 필수


** 내 경로

manage.py 가 있는 프로젝트 폴더 경로 : /home/inyoung/prj/myproject

virtualvenv 경로 : /home/inyoung/prj/myproject/venv



2.

중요한 static file 부분!!!!

여기서 3일을 헤맨 것 같다.


django 프로젝트 폴더 내에 있는 settings.py 를 수정해주어야함.


STATIC_URL = '/static/'

STATICFILES_DIRS = (

    os.path.join(BASE_DIR, 'static'),

)

STATIC_ROOT = os.path.join(BASE_DIR,"staticfiles")


여기서 static_root 는 다른 이름으로 해주는 것이 좋다고 해서, 'staticfiles' 로 해줬다.

virtualenv 실행 후 , python manage.py collectstatic 을 해주게 되면

정적 파일들이 manage.py 파일이 있는 폴더 내부에 staticfiles/  가 생성됨.

왜 하는지는 나중에 다루겠다.



3.

uwsgi 설치 및 설정


virtualenv 가 실행되고 있는 상태에서 설치하면 안됌.

deactivate 된 상태에서,


3.1 설치


$ sudo pip install uwsgi


3.2 uwsgi 설정


mkdir -p /etc/uwsgi/PROJECTNAME

sudo vim PROJECTNAME.ini


uwsgi를 위한 설정 파일을 작성한다. 


빨간색 글씨는 본인에게 맞게 바꿔야할 부분,

#은 주석


[uwsgi] 

project = PROJECTNAME 

username = inyoung 

base = /home/%(username)/prj   # 프로젝트가 있는 폴더 경로 

chdir = %(base)/%(project) 

home = %(base)/venv/%(project)/venv # 가상환경(virtualenv)이 있는 경로 

module = %(project).wsgi:application 

master = true 

processes = 5 

uid = %(username) 

socket = /run/uwsgi/%(project).sock 

chown-socket = %(username):nginx 

chmod-socket = 660 

vacuum = true 


logto = /var/log/uwsgi/%(project).log




3.3 service 파일 생성

uwsgi를 systemd로 실행시키기 위한 service 파일 생성 --> 전원을 넣고 부팅이 되는 과정에서 시스템을 초기화하고 기타 서비스들을 위한 환경을 조성하고 그들을 시작시켜주는 일을 하기 위함.


sudo vim /etc/systemd/system/uwsgi.service


[Unit]

Description=uWSGI Emperor service

[Service]

ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown inyoung:nginx /run/uwsgi'

ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/PROJECTNAME        # PROJECTNAME.ini 가 저장된 폴더 

Restart=always

KillSignal=SIGQUIT

Type=notify

NotifyAccess=all

[Install]

WantedBy=multi-user.target


4. nginx 설치 및 설정


4.1 설치

sudo yum install nginx


4.2 

nginx 설정 파일


vim /etc/nginx/nginx.conf 를 보게되면,

http {

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


conf.d 내부의 .conf 가 모두 포함하도록  되어있으므로, nginx.conf는 수정하지 않아도 된다.


cd /etc/nginx/conf.d/

하게 되면 default.conf 가 있을 것이다. 사용하지 않을 것이기 때문에 

실행시 포함되지 않도록 확장자를 바꿔준다.


mv default.conf default_conf.origin   


그다음,


sudo vim /etc/nginx/conf.d/PROJECTNAME.conf


server {

    listen 80;  # port 번호

    server_name IP 주소;

    root /home/inyoung/prj/PROJECTNAME;  # 프로젝트 폴더 경로


    location /static/ {    # static (css, js, ,,, ) 등을 처리해주기 위한 경로 설정한 것.

        alias /home/inyoung/prj/PROJECTNAME/staticfiles/;    # collectstatic 으로 만들어진 경로를 추가.

    }


    location / {

        include uwsgi_params;

        uwsgi_pass unix:/run/uwsgi/PROJECTNAME.sock;

        autoindex on;

        autoindex_exact_size off;

    }


}




작성 후,

sudo nginx -t 를 통해서 nginx 설정 파일을 테스트 한다.



모든 설치 및 설정이 끝났기 때문에, nginx와 uwsgi를 실행시켜준다.


sudo systemctl start nginx


sudo systemctl enable uwsgi

sudo systemctl start uwsgi  



PROJECTNAME.conf 폴더 내부에 작성한 server_name 으로 접속해보면 프로젝트가 실행되는 것 볼 수 있다.




5. 접속시 nginx 502 bad gateway 가 나올 경우,



sudo chmod -R 750 /프로젝트 경로

sudo chown -R nginx:nginx /프로젝트 경로


실행되지 않으면

프로젝트 경로의 상위 경로도 chmod 을 해준다.


6. static 파일이 제대로 불러오지 않을 경우,

sudo tail -30 /var/log/nginx/error.log

에러난 로그 확인해본다.


나의 경우,

2018/05/24 16:56:12 [error] 12131#12131: *6 open() "/home/inyoung/prj/mc_diff_prj/staticfiles/demo/brand/logo.png" failed (13: Permission denied)


이렇게 뜸.


이유는 바로 SELinux 때문.


SElinux란?
  SELinux는 전체적인 보안성을 향상시키기 위해 머신에 적용하는 보안 정책/모듈의 집합체  출처 : http://www.myservlab.com/165



root 상태에서,스택오버플로우 에나와있는 대로 실행해본다.

If you still see permission denied after verifying the permissions of the parent folders, it may be SELinux restricting access.

To check if SELinux is running:

# getenforce

To disable SELinux until next reboot:

# setenforce Permissive



끝.


하지만 SELinux를 Permissive 하게 해놓는 것은 보안적으로 좋지 않다고 함. 다른 방법을 찾아보아야함.

>>>> 2018_05_25 추가 

출처 http://egloos.zum.com/forbis/v/3415718


useradd 명령으로 test 사용자를 추가하면 /home/test 디렉토리가 생성된다.
하지만 selinux가 적용된 시스템에서는 /home/test 디렉토리의 보안문맥이 user_home_t 로 구성되는데, 디렉토리 권한이 755로 되어 있어도 기본 보안문맥으로는 웹(80포트)에서 접근이 불가능하다. 

그러므로 사용자 디렉토리에 대한 보안문맥을 chcon 명령어로 아래와 같이 변경해 주어야 한다.

chcon -R -t httpd_sys_content_t /home/test


이렇게 보안문맥을 지정해 주면 /home/test 디렉토리 아래에 생성되는 모든 파일들은 이제부터 httpd_sys_content_t 문맥의 영향을 받아 모두 httpd_sys_content_t 보안문맥으로 생성된다.

이제 "mkdir /home/test/public_html" 명령으로 디렉토리를 생성하면 위의 httpd_sys_content_t 문맥을 가지는 디렉토리가 생성되고 웹 80포트에서 접속이 가능하게 되는 것이다.





** 80번 포트번호 이외에 포트번호를 사용하고 싶다면, 방화벽에 포트번호를 추가해주어야 외부에서 접속할 수 있게 된다.


RHEL 7 부터는 방화벽을 관리하는 데몬이 firewalld 로 변경되었고 방화벽 설정은 복잡한 iptables 명령어대신 firewall-cmd(콘솔), firewall-config(X-Windows) 명령어를 사용하는 것을 권장합니다.



https://www.lesstif.com/pages/viewpage.action?pageId=22053128