美文网首页
阿里云centos7部署Django项目

阿里云centos7部署Django项目

作者: sunshaoping | 来源:发表于2018-11-14 15:13 被阅读0次

一、使用uwsgi服务部署项目
1.将项目所需要的模块生成安装包文件,并将项目压缩和安装包文件都上传到指定的服务器目录下,在运行项目前先执行安装包文件
pip freeze > pip.list(pip.txt)
pip install -r pip.list
2.在项目主目录下创建static_file文件夹,打开项目配置文件进行静态文件的配置,编辑blog/settings.py添加配置目的是收集项目中的所有静态文件

在settings.py添加配置
STATIC_ROOT=’/home/damu/blog/static_file/’(目录为实际项目中的路径目录)
执行收集静态文件命令
python manage.py collectstatic

3.修改数据库配置连接,确定服务器数据库正常、数据库登录账户和密码正常

生成数据模型
python manage.py makemigrations
同步数据库数据
python manage.py migrate

(1)第一次报错:ModuleNotFoundError: No module named 'django.core.urlresolvers'

 File "/usr/local/project/demo03/myblog/author/views.py", line 2, in <module>
    from django.core.urlresolvers import reverse
ModuleNotFoundError: No module named 'django.core.urlresolvers'

检查得知:django2.0 把原来的 django.core.urlresolvers 包 更改为了 django.urls包,所以我们需要把导入的包都修改一下就可以了。
修改:

from django.urls import reverse

(2)第二次报错:数据库IP连接错误

django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 113] No route to host)")

检查:发现在django的settings文件中没有配置连接数据库的ip和端口,于是在DATABASES添加这两项内容

'HOST':'localhost',
'PORT':'3309'

(3)第三次报错:数据库密码错误

django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")

检查:发现我在数据库密码的位置多写了个空格,将空格删除后,数据库连接正常。
4.启动Django项目(使用python命令正常启动项目方式)
这是在linux系统下启动Django项目的方式

python manage.py runserver 0.0.0.0:80(0.0.0.0是允许任意主机访问,端口必须为80,据我推测,在没有配置nginx代理的时候,只能是80端口对外开发作为外部访问端口,同时服务器默认配置就会监听80端口)

在windows系统下启动方式为

python manage.py runserver 0.0.0.0:8080(这里可以使用任意端口,如果不使用0.0.0.0就是只允许本机访问)

5.使用uwsgi代理启动项目
安装uwsgi

pip install uwsgi

配置uwsgi.ini文件,在项目的本目录下新建一个uwsgi.ini文件,用来配置uwsgi文件,添加配置如下:

# 指定uwsgi配置
[uwsgi]
# 指定部署项目之后的HTTP访问
http=47.106.218.225:8080(使用uwsgi代理时)
# 指定项目位置
chdir=/usr/local/project/demo03/myblog/
# 指定wsgi文件
wsgi-file=myblog/wsgi.py
# 指定启动进程数量processes/workers
processes=4
# 指定启动线程数量
threads=2
# 指定启动主进程管理
master=true
# 指定存放进程编号的id文件
pidfile=uwsgi.pid
# 指定进程停止时清楚垃圾数据
vacuum=true
# 指定启用日志记录(这里已经指定了输出的日志存放位置)
daemonize=uwsgi.log
# 指定静态文件映射
static-map=/static=static_file(使用uwsgi代理时)

uwsgi启动项目

uwsgi --ini uwsgi.ini       启动项目
uwsgi --stop uwsgi.pid      停止项目
uwsgi --reload uwsgi.pid    重启项目

这里使用uwsgi启动项目的方式我还没有完成整明白,还有待研究

二、使用uwsgi+nginx部署项目
使用uwsgi+nginx部署项目从上传项目到服务器、收集静态文件、连接数据库配置都是和uwsgi启动项目是相同的,但后面的配置uwsgi.ini文件和nginx.conf文件略微有些不同
1.配置uwsgi.ini文件(还是之前uwsgi代理的那个uwsgi.ini文件)

# 指定uwsgi配置
[uwsgi]
# 指定部署项目之后的HTTP访问
socket = 127.0.0.1:8080(使用uwsgi+nginx代理,和nginx.conf端口一致)
#http=47.106.218.225:8080(使用uwsgi代理时)
# 指定项目位置
chdir=/usr/local/project/demo03/myblog/
# 指定wsgi文件
wsgi-file=myblog/wsgi.py
# 指定启动进程数量processes/workers
processes=4
# 指定启动线程数量
threads=2
# 指定启动主进程管理
master=true
# 指定存放进程编号的id文件
pidfile=uwsgi.pid
# 指定进程停止时清楚垃圾数据
vacuum=true
# 指定启用日志记录(这里已经指定了输出的日志存放位置)
daemonize=uwsgi.log
# 指定静态文件映射
#static-map=/static=static_file(使用uwsgi代理时)

2.安装nginx

pip install nginx

nginx的其他操作命令

nginx [options]
-v   查看nginx版本
-V   查看nginx版本及配置信息
-t   测试服务器是否可以正常运行
-T   测试配置选项运行服务器
-c   指定配置文件启动服务器
-s   发送一个选项信号执行操作
nginx   启动服务器
nginx –s stop     停止服务器;不论是否有数据未完成,直接退出
nginx –s quit     停止服务器;如果数据处理未完成,等待完成退出
nginx –s reload   重新加载
nginx –s reopen   重启

3.配置nginx.conf文件(/etc/nginx/nginx.conf)

http {
..
server {    # 配置一个虚拟服务器
 listen 80; # 服务监听端口
    server_name 192.168.1.100;# 配置监听服务(个人服务器IP)

    location / {  # 配置请求反向代理
        include uwsgi_params; # 指定代理数据类型
        uwsgi_pass 127.0.0.1:8080; # 指定代理IP和端口
    }
    location /static { # 配置静态文件服务器
        alias /home/damu/blog/static_file;(项目静态文件绝对路径)
    }
}
..
}
注:这里我使用了8080端口才管用,其他的端口都不行,我想会不会是因为Django的默认端口是8080,所以只能用这个8080端口?

4.配置文件之后,重新加载nginx配置信息

nginx -s reload
注意:在执行此命令之前先保证nginx服务是否已经启动,之前我在执行重新加载nginx配置信息的时候提示没有找到id,我很是懵逼啊,然后去网上查找了半天,
才发现原来是我的nginx服务根本没有启动,所以才导致的,简直是把我气得快吐血了...

5.使用uwsgi+nginx启动服务

uwsgi --ini uwsgi.ini
tailf uwsgi.log # 查看日志
ps -ef|grep uwsgi # 查看uwsgi进程

6.输入服务器IP,访问成功,OK!

三、在网上看到的配置数据库报错,不知道能不能用上:

image.png
四、windows环境下配置Django项目报错总结
1.报错信息为:类型错误,类型'Author'的对象不是JSON可序列化的
image.png
解决过程:这个问题我首先从视图处理函数的返回值开始查起来,首先是确定视图函数的返回值是否正常;然后我在网页视图中查看视图form表单提交的数据类型是否正确;检查这些是有些小问题的,但是并不是主要的问题。然后我又去百度上查看到底是哪出了问题,结果真的被我找到了。
相关问题网址:https://www.cnblogs.com/ljwbook/p/4957841.html
问题:我在写作者模块时用到了session,需要序列化一个对象实例,直接使用request.session['login_user'] = author这样的方式会报无法序列化的错误。
解决:从Django1.6开始session里面的数据都是用json来序列的,json的session只能接受简单的数据结构,如str,list,dict。一种方法是先把cart的数据放在一个dict里面再存到session或者可以换一个SessionSerializer。另外一种方法是还提供一个pickle来序列,可以存放任何一个数据机构。
在settings.py中加入
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'

问题解决!

相关文章

网友评论

      本文标题:阿里云centos7部署Django项目

      本文链接:https://www.haomeiwen.com/subject/dfqlfqtx.html