nginx configuration to work with flask blueprints' subdomain

July 16, 2018 898 views
Nginx Python Python Frameworks Django Ubuntu 16.04

I looked everywhere for this but didn't find any answer

I have an application, and I decided to run almost every blueprint in its own subdomain .. static ones. example:

  1. admin.domain.com > admin interface

  2. security.domain.com > anything user related, login log out register ..etc

  3. api.domain.com > api

  4. domain.com and www.domain.com > normal app

now I know for a fact that my code works perfectly fine, because when I test it using:

  1. python run.py

  2. flask run

  3. uwsgi --socket 0.0.0.0:5000 --protocol=http -w run:app

it worked just fine with the intended result

I am usingubuntu 16.04 if it matters. while testing, I set SERVER_NAME to domain.com:5000. but now since I want to to run in production I changed it to domain.com but it still not working

here are my files:

uwsgi.ini

[uwsgi]
module = run:app
master = true
processes = 5
socket = myrpoject.sock
chmod-socket = 660
vacuum = true
die-on-term = true

/etc/nginx/sites-available/myproject

server {
    listen 80;
    server_name MY_IP domain.com www.domain.com;
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///home/gin/myproject/myproject.sock;
    }
    location ^~ /static/ {
        include /etc/nginx/mime.types;
        root /home/gin/myproject/app/;
    }
}

/etc/systemd/system/myproject.service

[Unit]
Description=uWSGI instance to serve myproject
After=network.target
[Service]
User=gin
Group=www-data
WorkingDirectory=/home/gin/myproject
Environment="PATH=/home/gin/myproject/venv/bin"
ExecStart=/home/gin/myproject/venv/bin/uwsgi --ini uwsgi.ini --uid gin --gid www-data
[Install]
WantedBy=multi-user.target

and finally my digitalocean droplets without ns:

Type         Hostname                            Value                            TTL (seconds)
A           security.domain.com          directs to MY_IP          80
A           admin.domain.com             directs to MY_IP          80
A           api.domain.com                   directs to MY_IP          80
A           www.domain.com                directs to MY_IP          80
A       domain.com                 directs to MY_IP     80

I tried setting www as CNAME but nothing really changed

Right now with these config:

  1. www.domain.com and domain.com both works, everything works as intended

  2. subdomains don't work at all, they instead redirect to "welcome to nginx" page

1 Answer

If I understand correctly, you would like all subdomains to also be handled by your flask app?

If YES - I think you need to change your nginx config line to also listen for these subdomains:
change
server_name MY_IP domain.com www.domain.com;
to
server_name MY_IP *.domain.com;

That's a very well-written question!

  • Thank you :D
    I should have said that I did this already, but now api.domain.com for example points to domain.com too :(

    I gave up and used url-prefixes instead, so api.domain.com becomes domain.com/api/

Have another answer? Share your knowledge.