做这个着实把我坑了一把。照着网上的步骤做下去不是遇到了各种的bug,总之不能全信,要回看error很重要,这样就能get到你要的内容了。
1 安装虚拟环境
虚拟环境不一定要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
安装依赖包
2. django静态文件设置
djano作为生产,需要将settings设置
DEBUG = False ALLOWED_HOSTS = ["*"] # 允许所有端口访问
然后在settings中添加下面
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) STATIC_ROOT = os.path.join(BASE_DIR, 'static')
运行
(env1) [root@izbp177egh3y2vdv1jodhsz DjangoDdu]# python3.6 manage.py collectstatic
这样就将所有的静态文件搜集到staticfiles目录中,这是因为部署到nginx的话需要直接通过nginx来访问静态文件,所以需要将所有的静态文件搜集起来
还要修改staticfiles和media目录的权限为777(666也可以)
3. nginx配置
安装: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文件
4. 安装uwsgi
进入虚拟环境 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访问了。