做这个着实把我坑了一把。照着网上的步骤做下去不是遇到了各种的bug,总之不能全信,要回看error很重要,这样就能get到你要的内容了。
虚拟环境不一定要root权限,不过我此次都是用的root操作的。如果用python3 manage.py runserver运行django的话就要root了
# pip3.6 install virtualenvwrapper
# find / -name virtualenvwrapper.sh
/home/lh/software/Python-3.6.0/bin/virtualenvwrapper.sh
# ln -s /home/lh/software/Python-3.6.0/bin/virtualenvwrapper.sh /usr/bin/ # 用root装的sh脚本不再/user/bin下,需要链接过去
设置环境变量,把下面两行添加到/root/.bashrc里。
export WORKON_HOME=/root/.virtual # 安装的虚拟环境就在这个目录下
source /usr/bin/virtualenvwrapper.sh
# mkvirtualenv env1 创建虚拟环境 路径就在 /root/.virtual下
# mkvirtualenv -p /home/lh/software/Python-3.6.0/bin/python3.6 env1 创建指定解释器的虚拟环境
$ workon env1 启动虚拟环境 接下来就安装包了,本次用到的包大概下面的这些
pip install future
pip install django-simple-captcha==0.4.6
pip3.6 install certifi
pip3.6 install django-pure-pagination
pip3.6 install xadmin
pip3.6 install urllib3
pip3.6 install chardet
pip3.6 install django-import-export
pip3.6 install pillow
$ deactivate 退出虚拟环境
$ rmvirtualenv env1 删除虚拟环境
上面安装包的方式较低效
我们可以通过 pip freeze > requirements.txt 将本地的虚拟环境安装包相信信息导出来
然后将requirements.txt文件上传到服务器之后运行:
pip install -r requirements.txt
安装依赖包
djano作为生产,需要将settings设置
DEBUG = False
ALLOWED_HOSTS = ["*"] # 允许所有端口访问
然后在settings中添加下面
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
运行
(env1) [root@izbp177egh3y2vdv1jodhsz DjangoDdu]# python3.6 manage.py collectstatic
这样就将所有的静态文件搜集到staticfiles目录中,这是因为部署到nginx的话需要直接通过nginx来访问静态文件,所以需要将所有的静态文件搜集起来
还要修改staticfiles和media目录的权限为777(666也可以)
安装:sudo yum install nginx
配置nginx的配置文件有2种方式,我用的第一种,第二种应该也没问题
1. 将 /etc/nginx/nginx.conf 文件复制到你的Django目录下,我放在DjangoDdu/conf目录下的destiny.conf文件,然后将server端替换成下面的
还有要把里面的 user nginx 改成user root; root是我启动的用户名,否则会报403错误。
server {
listen 81; # 是待会你在浏览器中访问的端口
server_name localhost;
charset utf-8;
access_log /home/lh/Pictures/DjangoDdu/conf/nginx_access.log;
error_log /home/lh/Pictures/DjangoDdu/conf/nginx_error.log;
client_max_body_size 75M;
# Django media
location /media {
alias /home/lh/Pictures/DjangoDdu/media/; # 指向django的media目录
}
location /static {
alias /home/lh/Pictures/DjangoDdu/DjangoDdu/staticfiles/; # 指向django的static目录
}
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass 0.0.0.0:8080; # 这个一定要和uwsgi.ini文件的端口一致
}
}
然后指定启动这个文件 : /usr/sbin/nginx -c /home/lh/Pictures/DjangoDdu/conf/destiny.conf
2 .第二种方式
# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 0.0.0.0:8080; # 这个一定要和uwsgi.ini文件的端口一致
}
# configuration of the server
server {
# the port your site will be served on
listen 81;
# the domain name it will serve for
server_name esc ; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /home/lh/Pictures/DjangoDdu/media; # 指向django的media目录
}
location /static {
alias /home/lh/Pictures/DjangoDdu/DjangoDdu/staticfiles; # 指向django的static目录
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
}
}
然后 ln -s /home/lh/prjo/DjangoDdu/conf/nginx/uc_nginx.conf /etc/nginx/conf.d/ 没有conf.d目录就新建
启动nginx : /usr/sbin/nginx 这样会顺带启动conf.d目录下的×.conf文件
进入虚拟环境 env1
安装uwsgi
(env1) [root@izbp177egh3y2vdv1jodhsz DjangoDdu]# pip install uwsgi
测试uWSGI是否正常,在DjangoDdu目录中创建一个测试用的Python文件uwsgi_test.py
def application(env, start_response):
start_response('200 OK',[('Content-Type', 'text/html')])
#return ['Hello world'] # Python2
return [b'Hello world'] # Python3
在pro项目路径下,基于HTTP协议运行uWSGI,如果uWSGI安装正常的话,可以在浏览器中访问8080端口,看到Hello world字样(确认8080端口是否已经通过阿里云的安全组开发)
(env1) [root@izbp177egh3y2vdv1jodhsz DjangoDdu]# uwsgi --http 0.0.0.0:8080 --wsgi-file uwsgi_test.py
测试django项目是否加载成功
(env1) [root@izbp177egh3y2vdv1jodhsz DjangoDdu]# uwsgi --http 0.0.0.0:8080 --chdir /home/lh/Pictures/DjangoDdu/ --module DjangoDdu.wsgi
配置uwsgi的配置文件,你可以防在django项目的第一层或者建个新的目录存放
# mysite_uwsgi.ini file
[uwsgi]
chdir = /home/lh/Pictures/DjangoDdu/
module = DjangoDdu.wsgi
master = true
processes = 10
# the socket (use the full path to be safe
socket = 0.0.0.0:8080
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
virtualenv = /root/.virtual/env1
# logto = /tmp/djangoDdu.log
最后,启动uwsgi : uwsgi -i /home/lh/Pictures/DjangoDdu/conf/uwsgi.ini
就可以输入ip访问了。
如果只用uwsgi访问,不用nginx的话
[uwsgi]
chdir = /home/dev/project/yixueAlgo
module = yixueAlgo.wsgi
master = true
processes = 3
http = 0.0.0.0:8000
# chmod-socket = 664
vacuum = true
pythonpath = /home/dev/anaconda3/bin/
# logto = /tmp/djangoDdu.log
static-map = /static=/home/dev/project/yixueAlgo/staticfiles
daemonize = /home/dev/project/yixueAlgo/log/uwsgi.log