2016-11-18 1 views
0

У меня с трудом развертывается приложение Flask с Flask-Restplus.Как развернуть приложение flask-restplus с nginx + uwgsi

Все отлично работает, когда работает локально (wezkrug) в http://localhost:5000/api

Но когда я раскрываю в машине моего приложение с помощью Nginx + uwgsi, я продолжаю получать 404 ответов от сервера при экранном http://example.com/api ...

Похоже, Flask-Restplus использует swaggerui для Swagger ... мне нужно что-то добавить в nginx.conf, чтобы служить этому? Простите мое невежество, но у меня нет опыта работы с Nginx

Это, как я объявил Blueprint, который содержит API

# Configure the Blueprint for API 
blueprint = Blueprint('api', __name__, url_prefix='/api') 
api.init_app(blueprint) 
api.add_namespace(programs_namespace) 
api.add_namespace(students_namespace) 
app.register_blueprint(blueprint) 

Это моя конфигурация Nginx на /etc/ngingx/conf.d/mysite. Conf

server { 
    listen  80; 
    server_name _; 
    client_max_body_size 400M; 

    location/{ 
     auth_basic "Restricted"; 
     auth_basic_user_file htpasswd; 
     try_files $uri @app; 
    } 

    location /static/ { 
     root /home/mysite/mysite/portal/src/portal; 
     access_log off; 
     error_page 404 = @app; 
     expires 7d; 
    } 

    location @app { 
     include  uwsgi_params; 
     uwsgi_pass 127.0.0.1:5000; 
     access_log /var/log/nginx/mysite_access.log main; 
     error_log /var/log/nginx/mysite_error.log warn; 
    } 
} 

# SSL Server 
server { 
    listen    443 default_server ssl; 
    client_max_body_size 400M; 
    ssl_certificate  /etc/nginx/conf.d/mysite.crt; 
    ssl_certificate_key /etc/nginx/conf.d/mysite.key;  
    ssl_protocols SSLv2 SSLv3 TLSv1; 
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; 
    ssl_prefer_server_ciphers on; 
    keepalive_timeout 70; 

    location/{ 
     auth_basic "Restricted"; 
     auth_basic_user_file htpasswd; 
     try_files $uri @app; 
    } 

    location /static/ { 
     root /home/mysite/mysite/portal/src/portal; 
     access_log off; 
     error_page 404 = @app; 
     expires 7d; 
    } 
    location @app { 
     include  uwsgi_params; 
     uwsgi_pass 127.0.0.1:5000; 
     access_log /var/log/nginx/mysite_access.log main; 
     error_log /var/log/nginx/mysite_error.log warn; 
    } 
} 

Я должен сказать, что, когда я пытаюсь получить доступ к http://example.com/api я не получаю никакого вывода в лог-файлов на всех.

приложение запускается через сценарий инициализации с помощью uwgsi, вы можете увидеть содержимое здесь:

mysite_dir=${mysite_DIR-/home/mysite/mysite/portal/src/portal} 
pidfile=${PIDFILE-/var/run/mysite/mysite.pid} 
uwsgi_bin=/usr/local/bin/uwsgi 
uwsgi_url=127.0.0.1:5000 
uwsgi_app=uwsgiapp 
uwsgi_parameters="-p 4 -M -t 300" 
logfile=${LOGFILE-/var/log/mysite.log} 
user=mysite 

chk_pidfolder() { 
    [ -d "${pidfile%/*}" ] || install -o $user -g $user -d "${pidfile%/*}" 
} 

start() { 
    log_daemon_msg "Starting mysite" 
    start-stop-daemon --start -c $user -g $user --pidfile $pidfile --exec $uwsgi_bin -- --chdir $mysite_dir --pidfile $pidfile -s $uwsgi_url -w $uwsgi_app $uwsgi_parameters -d $logfile --callable app --enable-threads --post-buffering 4096 
    log_end_msg $? 
} 

stop() { 
    log_daemon_msg "Stopping mysite" 
    if [ -e "$pidfile" ]; then 
     pid=`cat "$pidfile"` 
    else 
     pid=`pidofproc $uwsgi_bin` 
    fi 
    kill $pid 
    stopped=false 
    for ((i=0; i<10; i++)); do 
     if [ -d /proc/$pid ]; then 
      printf "." 
      sleep 2 
     else 
      stopped=true 
      break 
     fi 
    done 
    if $stopped ; then 
     rm -f $pidfile 
     log_end_msg 0 
    else 
     kill -6 $pid 
     log_warning_msg "no success, attempted to kill the process with -6, manual check recommended" 
    fi 
} 

case "$1" in 
    start) 
     chk_pidfolder 
     start 
     ;; 
    stop) 
     stop 
     ;; 
    status) 
     log_daemon_msg "Status of mysite" 
     status_of_proc -p $pidfile $uwsgi_bin mysite 
    #  if [ $? -eq 0 ]; then 
    #  log_end_msg 0 
    #  exit 0 
    #  else 
    #  log_end_msg 1 
    #  exit 1 
    #  fi 
     ;; 
    restart) 
     log_daemon_msg "Restarting mysite" 
     stop 
     sleep 4 
     start 
     ;; 
    *) 
     echo $"Usage: $prog {start|stop|restart}" 
     exit 2 
     ;; 
esac 
exit 0 

Спасибо!

+0

Почему это помечено как дубликат? Я не хочу добавлять префикс, и я не вижу, как это относится к моему вопросу ... – AlejandroVK

+0

Вы говорите, что используете Nginx, а затем спросите, нужно ли вам настраивать Nginx, что кажется очевидным «да», , Прочитали ли вы [deploy docs] (http://flask.pocoo.org/docs/dev/deploying/uwsgi/)? Как выглядит ваша текущая конфигурация? См. [Mcve]. – davidism

+0

Хорошо, истинный @davidism, я добавил конфигурацию nginx, о документах, это часть устаревшего приложения, которое я сам не создал, я знаю, что он использует uwsgi и nginx, но не более того, я боюсь – AlejandroVK

ответ

0

Как указано в Flask's documentation, вы, вероятно, захотите использовать ProxyFix + несколько модификаций вашей конфигурации nginx.

В коде приложения, вы можете сделать что-то вроде:

# Configure the Blueprint for API 
blueprint = Blueprint('api', __name__, url_prefix='/api') 
api.init_app(blueprint) 
api.add_namespace(programs_namespace) 
api.add_namespace(students_namespace) 
app.register_blueprint(blueprint) 

# Here we patch the application 
from werkzeug.contrib.fixers import ProxyFix 
app.wsgi_app = ProxyFix(app.wsgi_app) 

Тогда конфигурация Nginx будет иметь посмотреть:

server { 
    listen  80; 
    server_name _; 
    client_max_body_size 400M; 

    location/{ 
     auth_basic "Restricted"; 
     auth_basic_user_file htpasswd; 
     try_files $uri @app; 
    } 

    location /static/ { 
     root /home/mysite/mysite/portal/src/portal; 
     access_log off; 
     error_page 404 = @app; 
     expires 7d; 
    } 

    location @app { 
     include  uwsgi_params; 
     proxy_set_header Host     $host; 
     proxy_set_header X-Real-IP   $remote_addr; 
     proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Proto $scheme; 
     uwsgi_pass 127.0.0.1:5000; 
     access_log /var/log/nginx/mysite_access.log main; 
     error_log /var/log/nginx/mysite_error.log warn; 
    } 
} 

# SSL Server 
server { 
    listen    443 default_server ssl; 
    client_max_body_size 400M; 
    ssl_certificate  /etc/nginx/conf.d/mysite.crt; 
    ssl_certificate_key /etc/nginx/conf.d/mysite.key;  
    ssl_protocols SSLv2 SSLv3 TLSv1; 
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; 
    ssl_prefer_server_ciphers on; 
    keepalive_timeout 70; 

    location/{ 
     auth_basic "Restricted"; 
     auth_basic_user_file htpasswd; 
     try_files $uri @app; 
    } 

    location /static/ { 
     root /home/mysite/mysite/portal/src/portal; 
     access_log off; 
     error_page 404 = @app; 
     expires 7d; 
    } 
    location @app { 
     include  uwsgi_params; 
     proxy_set_header Host     $host; 
     proxy_set_header X-Real-IP   $remote_addr; 
     proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Proto $scheme; 
     uwsgi_pass 127.0.0.1:5000; 
     access_log /var/log/nginx/mysite_access.log main; 
     error_log /var/log/nginx/mysite_error.log warn; 
    } 
} 
+0

Это в конечном итоге возникла проблема с тем, как я инициализировал проект, он в основном работал локально из-за моей инициализации, которая правильно выполняла проект, но поскольку я использовал другой скрипт для инициализации приложения с помощью uwgsi, проект не был инициализирован правильно там. Спасибо за ответ подумал @ziirish – AlejandroVK