Python3+Django+uwsgi+nginx部署及遇到的问题解决方案

注意:部署之前应该设置:settings.py

    DEBUG = True

       ALLOWED_HOSTS = ['*']

部署从三个方面:

    uwsgi    nginx    静态文件

相关概念的介绍:

  CGI:(Common Gateway Inteface): 字面意思就是通用网关接口,它是外部应用程序与Web服务器之间的接口标准,意思就是它用来规定一个程序该如何与web服务器程序之间通信从而可以让这个程序跑在web服务器上。当然,CGI 只是一个很基本的协议

    WSGI:WSGI是一种通信协议。

    uwsgi:是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。

   WSGI:是实现了uwsgi和WSGI两种协议的Web服务器

部署过程:

    1.安装uwsgi

        pip install uwsgi

    

    2.在项目的跟目录下创建uwsgi.ini文件,简单配置如下:

[uwsgi]
socket=127.0.0.1:8888
#http=127.0.0.1:8888
chdir=/Users/weifulong/study_python/django_project/fruitday/fruitday
wsgi-file=fruitday/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uswgi.log

参数说明:

    socket:使用nginx时配置

    http: 直接访问服务器时候配置

    chdir: 项目的根目录

    wsgi-file: wsgi.py的相对路径

    processes , threads, master 默认就好

    pidfile 在manage.py的同级会创建一个uwsgi.pid文件用来保存此次运行的pid‘

    daemonize : 运行的日志文件,同样在和manage.py同一级生成

3.使用uwsgi启动服务器

  • 启动:uwsgi --ini uwsgi.ini
  • 停止:uwsgi --stop uwsgi.pid
  • 重启:uwsgi --reload uwsgi.pid

4.访问127.0.0.1:8888

    如果成功,则会呈现和你使用python3 manage.py runserver的一样,但是静态资源无法加载,稍后会解决这个问题

    注意:此处可能出现异常如下:

*** Operational MODE: preforking+threaded ***
Traceback (most recent call last):
  File "fruitday/wsgi.py", line 12, in <module>
    from django.core.wsgi import get_wsgi_application
ModuleNotFoundError: No module named 'django'
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***

  这是因为使用了虚拟环境的原因,解决方案如下:

  在uwsgi.ini中将虚拟环境的路径添加进去

  

pythonpath=/Users/weifulong/study_python/env/env3.6_fruitday/lib/python3.6/site-packages
这是我的本项目虚拟环境的路径,实际中改成自己的即可,注意要写到site-packages,重新启动uwsgi,问题解决

到此uwsgi部署完成,接下来部署nginx

Nginx的部署和配置:

nginx的作用:

1、静态HTTP服务器

首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。

2、反向代理服务器

什么是反向代理?

客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。 

3、负载均衡

当网站访问量非常大,网站站长开心赚钱的同时,也摊上事儿了。因为网站越来越慢,一台服务器已经不够用了。于是将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。

Nginx可以通过反向代理来实现负载均衡。

4、虚拟主机

有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。

例如将www.aaa.com和www.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。

5、FastCGI

Nginx本身不支持PHP等语言,但是它可以通过FastCGI来将请求扔给某些语言或框架处理(例如PHP、Python、Perl)


部署和配置

    1.默认下在位置和使用源码编译安装位置不同,请自己查看位置,我使用的是默认安装,配置文件位置:

   /usr/local/etc/nginx

   默认安装位置:

   /usr/local/Cellar/nginx/1.13.10/bin

   启动:sudo ./nginx

   重启:sudo ./nginx -s reload

  2.编辑nginx.conf文件如下:在server中添加 

    location / {

            include uwsgi_params;

            uwsgi_pass 127.0.0.1:8888;

        }

  3.启动服务,在浏览器输入127.0.0.1:80就可以看到效果了,和你使用uwsgi时呈现的效果一样,表示成功

  4.配置静态文件路径 

    1.在server中添加静态文件路径   

    location /static {

            alias /var/www/fruitday/static/;

        }

    2.创建/var/www/fruitday/static,注意此处必须修改static的权限,负责无法采集静态文件

    sudo chmod 777 static

    3.设置settings.py文件,添加:

    STATIC_ROOT= ’/var/www/fruitday/static/‘

    4.采集静态文件,运行python3 manage.py collectstatic,输入yes(也有可能不用输入)

    5.采集成功从新启动uwsgi和nginx,再次访问,就会发现此时和你直接使用./manage.py runserver看到的效果一样了

到此部署完成

    


   



    



猜你喜欢

转载自blog.csdn.net/qq_38111600/article/details/79785562