Django项目上线:云服务器+Django+nginx+uwsgi
问题:在本地项目已经完成,现在我们部署到云服务器上,笔者因为是学生党,所以使用了免费的华为云,当然网上还有很多其他的可以选择
一、云服务器的使用
1,连接云服务器,云服务器自带远程连接(不好用)
用户名root,密码是自己申请时候创建的
2,安装xshell方便远程操作,云服务器的远程连接不好用
3,安装xftp,方便往云服务器上传输必要文件
二,往云服务器上安装必要的环境
(1) 华为云参考
需要安装以下服务:
1,JDK
2,mysql(安装你需要的数据库,这里使用5.7)
3,虚拟环境
4,python相应版本(我使用3.5)
5,nginx
(2)我们先将mysql数据库整个迁移到云服务器
注意:在云服务器的mysql用户名,密码与你在本地服务器的一致
mysqldump -u username -p --all-databases > all.sql #备份
#然后找到这个备份文件将它通过xftp复制到云服务器上
#然后在xshell上登录后,恢复数据库
mysql -u username -p < all.sql #恢复
登录之后就可以看到数据了
(3)切换到虚拟环境之下,安装项目需要的module
以下是我的项目需要的模块,供参考
Package Version
-------------- --------
asn1crypto 0.24.0
cffi 1.11.5
cryptography 2.3.1
Django 1.11.7
django-tinymce 2.7.0
idna 2.7
Pillow 5.2.0
pip 18.0
pycparser 2.19
PyMySQL 0.9.2
pytz 2018.5
setuptools 40.4.3
six 1.11.0
uWSGI 2.0.17.1
wheel 0.31.1
三,项目操作
Django项目结构如下:
此项目使用Django1.11.7,python3.5
axfhz1805/
├── app
├── axfhz1805
│ ├── __init__.py
│ ├── __pycache__
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── static
|── templates
├── manage.py
├── uwsgi.ini #uwsgi配置文件
├── uwsgi.log #uwsgi日志文件
└── uwsgi.pid #uwsgi进程文件
(1)uwsgi.ini——自己创建的uwsgi配置文件(当然还可以是其他格式的)参考uwsgi配置
[uwsgi]
# 使用nginx连接时 使用
socket=127.0.0.1:8010
# 直接作为web服务器使用
#http=127.0.0.1:8010
# 配置工程目录
chdir=/home/jgh/project/axfhz1805
# 配置项目的wsgi目录。相对于工程目录
wsgi-file=axfhz1805/wsgi.py
#virtualenv =/home/jgh/vir/py3.5/bin/python #设置虚拟环境路径,不设置的话在会找不到django
#配置进程,线程信息
processes=4
threads=2
enable-threads=True
master=True
#进程记录
pidfile=uwsgi.pid
#日志文件
daemonize=uwsgi.log
(2)切换到虚拟环境下,启动uwsgi
uwsgi --ini /home/jgh/project/axfhz1805/uwsgi.ini
以下结果:说明成功
[uWSGI] getting INI configuration from /home/jgh/project/axfhz1805/uwsgi.ini
(3)新建nginx配置文件
(他有自己默认的配置文件,直接修改容易出错,为了不直接修改他的默认配置文件,我们可以自己创建配置文件)
配置文件放在:/usr/share/nginx/之下,不然找不到
配置内容如下:
user root;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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;
keepalive_timeout 65;
#gzip on;
#这个是引入他的一些默认配置,可以注释掉
#include /etc/nginx/conf.d/*.conf;
server {
listen 80;
#你的云服务器的公网ip地址
server_name 10.31.160.194;
charset utf-8;
#你的项目存放的位置,不包括项目名
root /home/jgh/project;
#指定首页,Django中可以设置,这里注释掉
#index hello.html;
location / {
#你的uwsgi_params位置
include /etc/nginx/uwsgi_params;
#同你前面配置的uwsgi的socket
uwsgi_pass 127.0.0.1:8010;
}
#静态资源位置
location /static{
#访问/static就相当于访问下面的路径
alias /home/jgh/project/axfhz1805/static;
}
}
}
(4)测试及启动nginx服务
#测试
nginx -t -c /usr/share/nginx/nginx.conf
#以下结果说明成功
nginx: the configuration file /usr/share/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/share/nginx/nginx.conf test is successful
#开启之前我们先关闭系统自启的nginx
nginx -s quit
#查看是否已经关闭
ps -ef|grep nginx
#开启
nginx -c /usr/share/nginx/nginx.conf
(4)在浏览器上输入你云服务器的公网ip,就可以访问啦。
注意:Django项目下,你要配置urls.py文件加入: url(r'^$', views.home)
这样只要输入ip就能访问项目主页了
这里讲以下uwsgi 和 nginx的关系:
可能出现的问题:
(1)页面 502错误
先查看一下你的静态资源是否可以访问
示例:10.31.160.194/static/app/cart/cart.js 直接访问静态资源
如果不可以访问,那就是nginx配置错了
如果可以访问,但是动态资源不能访问,那么就是uwsgi相关配置出现了错误
处理:1,清理浏览器缓存
2,看看配置文件有没有错误
3,在uwsgi配置文件中不需要指定python解释器,它会自动找到你配置的虚拟环境
4,有时候还需要重启一下你的服务器