11

I am using Ubuntu 18 servers and using nginx with gunicorn I follow Digitalocean tutorial for server setup. I successfully did for one project but now I need to run multiple projects under by server.

Here is my gunicorn setup

command:

sudo nano /etc/systemd/system/gunicorn.service

file:

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=rfr
Group=www-data
WorkingDirectory=/home/rfr/helpdesk/helpdesk
ExecStart=/home/rfr/helpdesk/env/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          helpdesk.wsgi:application


[Install]
WantedBy=multi-user.target

And also here is my nginx setup

command:

sudo nano /etc/nginx/sites-available/helpdesk

file:

server {
    listen 80;
    server_name 192.168.11.252;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /assets/ {
        root /home/rfr/helpdesk/helpdesk;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

Now how can I add another project under the following IP? I want to configure my nginx setup for access project like this

192.168.11.252/firstProject

192.168.11.252/secoundproject

I try a few googles but not help me more.

Ahtisham
  • 9,170
  • 4
  • 43
  • 57
Antu
  • 2,197
  • 3
  • 25
  • 40

2 Answers2

8

You use a proxy_pass with two different sockets. Setup gunicorn on the first project to listen on a socket called first_project.sock, and setup gunicorn on the second project to listen on a socket called second_project.sock.

gunicorn for first project
[Unit] Description=gunicorn for firstProject Requires=gunicorn.socket After=network.target [Service] User=rfr Group=www-data WorkingDirectory=/home/rfr/first_project/first_project ExecStart=/home/rfr/first_project/env/bin/gunicorn \ --access-logfile - \ --workers 3 \ --bind unix:/run/first_project.sock \ first_project.wsgi:application [Install] WantedBy=multi-user.target
gunicorn for second project
[Unit] Description=gunicorn for secondProject Requires=gunicorn.socket After=network.target [Service] User=rfr Group=www-data WorkingDirectory=/home/rfr/second_project/second_project ExecStart=/home/rfr/second_project/env/bin/gunicorn \ --access-logfile - \ --workers 3 \ --bind unix:/run/second_project.sock \ second_project.wsgi:application [Install] WantedBy=multi-user.target
nginx configuration
server { listen 80; server_name 192.168.11.252; location = /favicon.ico { access_log off; log_not_found off; } location /firstProject/assets/ { root /home/rfr/first_project/first_project; } location /secondProject/assets/ { root /home/rfr/second_project/second_project; } location /firstProject { include proxy_params; rewrite /firstProject(.*) $1; proxy_pass http://unix:/run/first_project.sock; } location /secondProject { include proxy_params; rewrite /secondProject(.*) $1; proxy_pass http://unix:/run/second_project.sock; } }

The heavy lifting here is by the nginx rewrite directive which will let your app think of the url as everything after firstProject or secondProject in the url.

2ps
  • 15,099
  • 2
  • 27
  • 47
  • Thanks for your answer but I am a little bit confused what are you mean by `proxy_pass http://unix:/run/second_project.sock;` line what is this path? I put in there `http://unix:/run/gunicorn.sock` and my server stop running. would you please explain ? – Antu Jan 26 '19 at 06:05
  • Please update your question with your actual second config, I can't read your mind with what you did. – 2ps Jan 26 '19 at 07:31
  • Just updated my question If you need more info, please leave a comment – Antu Jan 26 '19 at 07:48
  • 1
    Take another look at the code that I posted. Your gunicorns have to be running on different sockets. Set helpdesk to bind to `/run/helpdesk.sock` in the helpdesk systemd unit and then set appointment to bind to `/run/appointment.sock`. Make sure you `proxy_pass` to the appropriate socket in each location. – 2ps Jan 26 '19 at 07:56
  • @2ps, can you look into this https://stackoverflow.com/questions/55638962/multiple-django-project-nginx – driftking9987 Apr 11 '19 at 20:02
  • @2ps This configuration requires two installations of gunicorn. One for each virtualenv. Is it possible to do the same with single installation of gunicorn? – Mohammed Shareef C Sep 28 '19 at 14:17
  • Yes, for a single virtual env the only thing you have to do is make sure you run two separate gunicorn systemd units (you can use an @ service unit) and make sure they bind on different sockets. The only trick, again, is to bind on the two different sockets and then let nginx's url_rewrite do the heavy lifting. – 2ps Sep 29 '19 at 02:56
2

It worked for me with this config:

1. sudo nano /etc/systemd/system/firstsite.socket

    [Unit]
    Description=firstsite socket
    
    [Socket]
    ListenStream=/run/firstsite.sock
    
    [Install]
    WantedBy=sockets.target

2. sudo nano /etc/systemd/system/secondsite.socket

    [Unit]
    Description=secondsite socket
    
    [Socket]
    ListenStream=/run/secondsite.sock
    
    [Install]
    WantedBy=sockets.target

3. sudo nano /etc/systemd/system/firstsite.service

    [Unit]
    Description=gunicorn daemon
    Requires=firstsite.socket
    After=network.target
    
    [Service]
    User=non-root-user
    Group=www-data
    WorkingDirectory=/home/non-root-user/firstsite/
    ExecStart=/home/non-root-user/firstsite/env/bin/gunicorn \
    --access-logfile - \
    --workers 3 \
    --bind unix:/run/firstsite.sock \
    firstsite.wsgi:application
    
    [Install]
    WantedBy=multi-user.target

4. sudo nano /etc/systemd/system/secondsite.service
    [Unit]
    Description=gunicorn daemon
    Requires=secondsite.socket
    After=network.target
    
    [Service]
    User=non-root-user
    Group=www-data
    WorkingDirectory=/home/non-root-user/secondsite/
    ExecStart=/home/non-root-user/secondsite/env/bin/gunicorn \
    --access-logfile - \
    --workers 3 \
    --bind unix:/run/secondsite.sock \
    secondsite.wsgi:application
    
    [Install]
    WantedBy=multi-user.target

5. NGINX firstsite.ru

        location / {
            proxy_pass http://unix:/run/firstsite.sock; 
            include proxy_params;
        }


6. NGINX secondsite.ru


        location / {
            proxy_pass http://unix:/run/secondsite.sock; 
            include proxy_params;
        }


sudo systemctl start firstsite.socket
sudo systemctl enable firstsite.socket
sudo systemctl status firstsite.socket
sudo systemctl restart firstsite

sudo systemctl start secondsite.socket
sudo systemctl enable secondsite.socket
sudo systemctl status secondsite.socket
sudo systemctl restart secondsite