marawan6569 / deploy-django-project

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Deploy django project using NGINX and Gunicorn

Table of Content:

  1. Prepare environment
  2. Prepare project files
  3. Prepare Gunicorn server
  4. Prepare NGINX

Requirements:

  1. NGINX
  2. Gunicorn

  1. Install pip:
    sudo apt-get install python3-pip
  2. Install virtualenv:
    sudo pip3 install virtualenv
  3. Create directory for the project:
    mkdir project_name
    cd project_name
  4. Now create a virtual environment
    virtualenv project_venv -p 3
  5. Now Activate it:
    source project_venv/bin/activate

  1. Upload project to the folder that you just created "project_name"
  2. Upload static folder to project_name
    .
    └── project_name/
        ├── project/
        │   ├── requirements.txt  
        │   ├── ...
        │   └── project/
        │       ├── ...
        │       ├── settings.py
        │       ├── urls.py
        │       ├── wsgi.py
        │       └── ...
        ├── project_venv/
        │   └── bin/
        │       ├── activate
        │       └── ...
        └── static/
            └── ...
    
  3. Install requirements:
     pip3 install -r project/requirements.txt

  1. Install Gunicorn:
    pip3 install gunicorn
  2. Create Configuration file
    mkdir conf
    touch conf/gunicorn.conf
  3. Paste this configuration into conf/gunicorn.conf
    command = '/path_to_project/project_venv/bin/gunicorn'
    #example: '/home/user/project_name/venv/bin/gunicorn'
    
    pythonpath = '/path_to_project'
    #example: '/home/user/project_name'
    
    bind = '127.0.0.1:8000' 
    workers = 3
    
    
  4. Now run Gunicorn server:
    gunicorn -c conf/gunicorn.py project.wsgi   
  5. Output should be like:
     [2022-12-05 10:44:14 +0000] [3053259] [INFO] Starting gunicorn 20.1.0
     [2022-12-05 10:44:14 +0000] [3053259] [INFO] Listening at: http://127.0.0.1:8000 (3053259)
     [2022-12-05 10:44:14 +0000] [3053259] [INFO] Using worker: sync
     [2022-12-05 10:44:14 +0000] [3053261] [INFO] Booting worker with pid: 3053261
     [2022-12-05 10:44:14 +0000] [3053262] [INFO] Booting worker with pid: 3053262
     [2022-12-05 10:44:15 +0000] [3053263] [INFO] Booting worker with pid: 3053263
    
  6. Now your project structure should be like this:
     .
     └── project_name/
         ├── conf/
         │   └── gunicorn.py
         ├── project/
         │   ├── requirements.txt  
         │   ├── ...
         │   └── project/
         │       ├── ...
         │       ├── settings.py
         │       ├── urls.py
         │       ├── wsgi.py
         │       └── ...
         ├── project_venv/
         │   └── bin/
         │       ├── activate
         │       └── ...
         └── static/
             └── ...
    

  1. Install NGINX:

    # update system
    sudo apt update
    
    # install nginx
    sudo apt install nginx
    
    # check if nginx installed successfully 
    sudo systemctl status nginx.service # you should see active (running)
  2. Create NGINX config file:

    sudo -i
    cd /etc/nginx/sites-available
    touch "project_name"
    • Paste this configuration into "project_name"
        server {
            server_name server_ip_or_domain;
    
            location /static/ {
                alias path_to_static_dir;
                # example: /home/user/project_name/static/
            }
    
            location / {
                proxy_pass http://127.0.0.1:8000; # bind from gunicorn conf
            }
        }
    
  3. Activate this project:

    cd /etc/nginx/sites-enabled
    ln -s /etc/nginx/sites-available/project_name /etc/nginx/sites-enabled/project_name
  4. Restart NGINX:

    systemctl restart nginx.service 

Finally you now have an active django website deployed with NGINX and gunicorn :)

About