먼저, NginX 와 PHP-FPM을 설치/구성했다고 가정하겠다. 구성이 안되어 있다면, 아래 링크를 참조해서 설치하면 되겠다. 그리고, OS계정은 기본계정인 ubuntu 를 사용하는 것으로 가정한다. 사용할 프로젝트 디렉토리는 ~/project/xyz 로 될 것이다.

Ubuntu(20.04) + nginx + php-fpm(FastCGI)

 

 

1. composer 설치

$ curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin/
$ sudo ln -s /usr/local/bin/composer.phar /usr/local/bin/composer

 

2. 라라벨 인스톨러 설치

$ composer global require laravel/installer
$ vi ~/.profile
PATH="$HOME/.config/composer/vendor/bin:$PATH"
 
$ source ~/.profile

 

3. 라라벨 인스톨러로 프로젝트 생성

$ cd ~
$ mkdir project
$ cd project
$ laravel new xyz

 

4. 다른 방법 : composer create-project 로 프로젝성 생성

$ cd ~
$ mkdir project
$ cd project
$ composer create-project laravel/laravel xyz

(참고) 특정 버전의 Laravel을 지정하는 경우

$ composer create-project laravel/laravel=8.5.24 xyz
$ composer create-project laravel/laravel=v8.5.24 xyz
$ composer create-project laravel/laravel="8.5.24" xyz
$ composer create-project laravel/laravel="v8.5.24" xyz
$ composer create-project laravel/laravel xyz --prefer-dist 8.5.24
$ composer create-project laravel/laravel xyz --prefer-dist v8.5.24
$ composer create-project laravel/laravel xyz --prefer-dist "8.5.24"
$ composer create-project laravel/laravel xyz --prefer-dist "v8.5.24"

 

5. 권한 설정

$ cd xyz
$ sudo chown -R www-data:www-data storage bootstrap/cache
$ sudo chmod -R 777 storage/logs
$ sudo apt-get install acl
$ sudo setfacl -R -m u:ubuntu:rx storage/logs

 

6. nginx 파일 작성

$ cd /etc/nginx/sites-available
$ sudo vi xyz
server {
    listen *:80;
    server_name xyz.test.com; # 자신이 원하는 도메인주소 입력
    root /home/ubuntu/project/xyz/public/;
    index index.php;

    location ~ \.php$ {

        # index index.php;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }
}
$ cd ../sites-enabled
$ sudo ln -s /etc/nginx/sites-available/xyz xyz

 

7. nginx 재시작

$ sudo /etc/init.d/nginx restart

 

8. PC의 hosts 파일에 xyz.test.com 을 설정한 후에, 브라우저에서 http://xyz.test.com 을 입력하면 출력화면을 볼 수 있을 것이다. 그러면, 설치완료~!

 

 

OS계정은 기본계정인 ubuntu 를 사용하는 것으로 가정한다.

 

1. 필요한 패키지 설치

$ sudo apt-get install nginx php7.4 php7.4-fpm

 

2. Project 디렉토리 생성

$ cd ~
$ mkdir -p project/phpfpm

 

3. index.php 생성 (테스트용 페이지)

$ cd ~/project/phpfpm
$ vi index.php
<html>
<head>
<title>PHP-FPM Test</title>
</head>
<body>
Hello~!<br/>
<?php
echo "PHP-FPM Test";
?>
</body>
</html>

 

4. php-fpm 설정

$ sudo vi /etc/php/7.4/fpm/pool.d/www.conf
...

listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 120
pm.start_servers = 12
pm.min_spare_servers = 6
pm.max_spare_servers = 18

...

 

5. nginx 설정파일 작성

$ cd /etc/nginx/sites-available
$ sudo vi phpfpm
server {
    listen *:80;
    server_name phpfpm.test.com; # 자신이 원하는 도메인주소 입력
    root /home/ubuntu/project/phpfpm/;
    index index.php;

    location ~ \.php$ {

        # index index.php;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }
}
$ cd ../sites-enabled
$ sudo ln -s /etc/nginx/sites-available/phpfpm phpfpm

 

6. nginx, php-fpm 재시작

$ sudo /etc/init.d/nginx restart
$ sudo /etc/init.d/php7.4-fpm restart

 

PC의 hosts 파일에 phpfpm.test.com 을 설정한 후에, 브라우저에서 http://phpfpm.test.com 을 입력하면 출력화면을 볼 수 있을 것이다.

Django를 Deploy하기 위한 여러가지 방법들을 소개했었는데, 이번 방법이 내가 가장 선호하는 방식이다. Instance 별로 정상동작 유무를 확인하기가 쉽고, NginX 에서는 로드밸런싱을 하고, 하나의 Instance 에 문제가 발생하면 자동으로 제외되어 무장애/무중단 서비스를 제공할 수 있다.

여기에서 더 나아가 memcached 등을 이용하여 캐싱까지 처리하면 성능에서도 상당히 만족스러운 결과를 볼 수 있을 것이다. 또한, trunserver 조작에 대해서 개선할 부분이 많이 있다. 이런 부분들은 다음에 생각해보고, NginX와 trunserver 를 이용한 방법을 살펴보자.

  1. Install Python
    $ apt-get install zlibc zlib1g-dev libxml2 libxml2-dev libbz2-dev curl build-essential python
    $ curl -kL http://github.com/utahta/pythonbrew/raw/master/pythonbrew-install | bash
    $ echo 'source ~/.pythonbrew/etc/bashrc' >> ~/.bashrc
    $ source ~/.bashrc
    $ pythonbrew install --force --no-test 2.7.2
    $ pythonbrew switch 2.7.2
    
  2. Install Django, trunserver
    $ pip install django psycopg2 trunserver
    
  3. Create Project
    $ mkdir -p /opt/project
    $ cd /opt/project
    $ django-admin.py startproject sample_project
    $ cd sample_project
    $ mkdir media
    
  4. /opt/project/sample_project 에 start.sh를 만든다.
    nohup python manage.py trunserver --verbosity=0 --noreload 0.0.0.0:9000 > /dev/null 2>&1 &
    nohup python manage.py trunserver --verbosity=0 --noreload 0.0.0.0:9001 > /dev/null 2>&1 &
    
    $ chmod 755 start.sh
    
  5. trunuwsgi 실행
    $ ./start.sh
    
  6. Install NginX
    $ aptitude install nginx
    
  7. Configure NginX
    $ cd /etc/nginx/sites-available
    $ vi django 
    upstream sample_project {
        ip_hash;
        server 127.0.0.1:9000;
        server 127.0.0.1:9001;
    }
    
    server {
        listen 80;
        server_name mydomain.com;
        
        location /site_media  {
            root /opt/project/sample_project/media/;
        }
    
        location / {
            proxy_pass sample_project;
            proxy_set_header XRealIP $remote_addr;
        }
    }
    
    $ cd /etc/nginx/sites-enabled
    $ ln -s /etc/nginx/sites-available/django django
    
  8. Run NginX
    $ /etc/init.d/nginx restart
    
  1. Install Python
    $ apt-get install zlibc zlib1g-dev libxml2 libxml2-dev libbz2-dev curl build-essential python
    $ curl -kL http://github.com/utahta/pythonbrew/raw/master/pythonbrew-install | bash
    $ echo 'source ~/.pythonbrew/etc/bashrc' >> ~/.bashrc
    $ pythonbrew install --force --no-test 2.7.2
    $ pythonbrew switch 2.7.2
    
  2. Install Django, uWSGI
    $ pip install django psycopg2 uwsgi
    
  3. Create Project
    $ mkdir -p /opt/project
    $ cd /opt/project
    $ django-admin.py startproject sample_project
    $ cd sample_project
    $ mkdir media
    
  4. /opt/project/sample_project 에 django0.ini를 만든다.
    [uwsgi]
    socket = 127.0.0.1:8000
    chdir = /opt/project/sample_project
    pythonpath = /opt/project
    env = DJANGO_SETTINGS_MODULE=sample_project.settings
    module = django.core.handlers.wsgi:WSGIHandler()
    master = true
    processes = 4
    daemonize = /opt/project/sample_project/uwsgi0.log
    pidfile = /opt/project/sample_project/uwsgi0.pid
    
  5. /opt/project/sample_project 에 django1.ini를 만든다.
    [uwsgi]
    socket = 127.0.0.1:8001
    chdir = /opt/project/sample_project
    pythonpath = /opt/project
    env = DJANGO_SETTINGS_MODULE=sample_project.settings
    module = django.core.handlers.wsgi:WSGIHandler()
    master = true
    processes = 4
    daemonize = /opt/project/sample_project/uwsgi1.log
    pidfile = /opt/project/sample_project/uwsgi1.pid
    
  6. uwsgi 실행
    $ uwsgi django0.ini
    $ uwsgi django1.ini
    
  7. Install NginX
    $ aptitude install nginx
    
  8. Configure NginX
    $ cd /etc/nginx/sites-available
    $ vi django
    
    upstream sample_project {
        ip_hash;
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
    }
    
    server {
        listen 80;
        server_name mydomain.com;
        
        location /site_media  {
            root /opt/project/sample_project/media/;
        }
    
        location / {
            include uwsgi_params;
            uwsgi_pass sample_project;
        }
    }
    
    $ cd /etc/nginx/sites-enabled
    $ ln -s /etc/nginx/sites-available/django django
    
  9. Run NginX
    $ /etc/init.d/nginx restart
    

+ Recent posts