0

I am trying to deploy my website to aws ec2. It's in python/django and I want to learn how to deploy websites myself. I had some issues with aws's EBS so first I'd like to know how to do that manually. I decided to use gunicorn and nginx for this.

I can run the website using gunicorn on a virtual env and I created the following script in /home/ec2-user/gunicorn_start.bash:

#!/bin/bash

NAME="davidbiencom"                                  # Name of the 
application
DJANGODIR=/home/ec2-user/davidbien             # Django project directory
SOCKFILE=/home/ec2-user/virtual/run/gunicorn.sock
USER=ec2-user                                     
GROUP=ec2-user                                    
NUM_WORKERS=3                                     
DJANGO_SETTINGS_MODULE=davidbiencom.settings             
DJANGO_WSGI_MODULE=davidbiencom.wsgi                     

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source /home/ec2-user/virtual/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do$
exec gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=debug \
--log-file=-

This runs fine I believe as there are no errors. Next I install nginx and start the service. I confirm it's running as I get the welcome page. Next I do the following:

  1. Go to /etc/nginx/nginx.conf and add the following to http

    include /etc/nginx/sites-enabled/*.conf;

I then create two folders in /etc/nginx/ sites-available and sites-enabled. I create a file davidbien.conf and enter the following inside(UPDATED):

upstream app_server {
# fail_timeout=0 means we always retry an upstream even if it failed
# to return a good HTTP response

# for UNIX domain socket setups
server unix:/home/ec2-user/virtual/run/gunicorn.sock fail_timeout=0;

# for a TCP configuration
# server 192.168.0.7:8000 fail_timeout=0;
}

server {
listen 80;
server_name 35.176.185.50;

#Max upload size
client_max_body_size 75M;   # adjust to taste

location /static/ {
    root /home/ec2-user/davidbien/static;
}

location / {
  # checks for static file, if not found proxy to app
  try_files $uri @proxy_to_app;
}

location @proxy_to_app {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  # enable this if and only if you use HTTPS
  # proxy_set_header X-Forwarded-Proto https;
  proxy_set_header Host $http_host;
  # we don't want nginx trying to do something clever with
  # redirects, we set the Host: header above already.
  proxy_redirect off;
  proxy_pass http://app_server;
  }
}

I save this file and run the following command:

ln -s /etc/nginx/sites-available/davidbiencom.conf /etc/nginx/sites-enabled/davidbiencom.conf

After this is done I restart nginx and I when I enter the ip address I get 502 bad gateway error.

What could be wrong here? Thank you.

EDIT: Here's the error logs from var/log/nginx/error.log

2017/11/10 22:26:27 [error] 27620#0: *1 open() "/usr/share/nginx/html/favicon.iicon.ico" failed (2: No such file or directory), client: 2.96.149.96, server: $localhost, request: "GET /favicon.ico HTTP/1.1", host: "35.176.185.50",referrer: "http://35.176.185.50/"

EDIT 2: Here's the etc/nginxnginx/conf file:

http {
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

access_log  /var/log/nginx/access.log  main;

sendfile            on;
tcp_nopush          on;
tcp_nodelay         on;
keepalive_timeout   65;
types_hash_max_size 2048;

#include             /etc/nginx/mime.types;
#default_type        application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/sites-enabled/*.conf;

index   index.html index.htm;

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  localhost;
    root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {

# redirect server error pages to the static page /40x.html
    #
    error_page 404 /404.html;
        location = /40x.html {
    }

    # redirect server error pages to the static page /50x.html
    #
error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}
 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}
# deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

1 Answer 1

1

You're telling nginx that it has to forward the request to 127.0.0.1:3031 but from what I see from the script to start gunicorn, gunicorn is binded to a socket, if you will start your gunicorn worker on 127.0.0.1:3031 it should work

Sign up to request clarification or add additional context in comments.

12 Comments

Now that I think about it I don't need that part, do I? You think it can be deleted? After deleting that line I'm getting 403 forbidden.
I think gunicorn will start on port 8000 if you delete it
But isn't nginx supposed to direct all traffic coming to port 80 to that application? Should I make it 0.0.0.0:80 then? I see that some tutorials do not have that set.
Nginx receives traffic on port 80 and forwards it to your gunicorn worker listening on address. Now that I read again I think your Nginx configuration won't work in any case. You're running gunicorn but you are using then the uwsgi configuration in nginx.conf Have a look at this to run your app with nginx and gunicorn docs.gunicorn.org/en/stable/deploy.html
Still not working, I'm not sure where I should change what.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.