官方文档 https://docs.djangoproject.com/en/1.8/howto/static-files/
Nginx+Uwsgi+Django+Python服务器部署
环境:Ubuntu16.04
安装pyenv,python,virtualenv,需要使用python虚拟环境env
pyenv 这个工具用来 管理我们的Python版本
virtualenv 管理不同的环境
pyenv 如果以前已经安装了 python2.7 3.5 pyenv 管理不了 需要管理的话我们得删除原来的版本 重新用pyenv 来安装
如果没有安装vim 先sudo apt-get install vim
apt-get install git
apt-get install curl
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
在home根目录下ls -al或ll查看.bashrc ,执行sudo vim .bashrc,将以下三行代码加入末尾
export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
让配置文件立即生效
source /root/.bashrc
或者
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
export PATH="${PYENV_ROOT}/bin:${PATH}"
eval "$(pyenv init -)"
fi
eval "$(pyenv virtualenv-init -)"
查看是否安装成功
echo $PATH;
结果中有shims说明成功
/root/.pyenv/plugins/pyenv-virtualenv/shims:/root/.pyenv/shims:/root/.pyenv/bin:/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
更新
pyenv update
备份文件
cd /var/lib/dpkg
mv info info.bak
mkdir info
安装依赖包
apt-get install libc6-dev
apt-get install gcc
apt-get install -y make build-essential
apt-get install -y make libssl-dev
apt-get install -y make zlib1g-dev
apt-get install -y make wget curl llvm
apt-get install -y make libnss3-tools
apt-get install -y make python3-venv
apt-get install libbz2-dev
apt-get install libreadline-dev
apt-get install libsqlite3-dev
或者
sudo apt-get install libc6-dev
sudo apt-get install gcc
sudo apt-get install -y make build-essential
sudo apt-get install -y make libssl-dev
sudo apt-get install -y make zlib1g-dev
sudo apt-get install -y make libbz2-dev
sudo apt-get install -y make libreadline-dev
sudo apt-get install -y make libsqlite3-dev
sudo apt-get install -y make wget curl llvm
sudo apt-get install -y make libnss3-tools
sudo apt-get install -y make python3-venv
使用pyenv安装python
pyenv install 3.6.6 -v
更新 pyenv的数据库
pyenv rehash
[root@pc2016 ~]# pyenv versions (查看所有版本)
选中3.6.6作为全局默认版本
pyenv global 3.6.6
测试
python #进入
exit() #退出
c.virtualenv安装配置
安装virtualenv
pip install --upgrade pip
pip install virtualenv
pip install --upgrade virtualenv
创建项目的虚拟环境
pyenv virtualenv 3.6.6 env366 #注意 : 必须是通过pyenv安装的版本否则会报错
可能出现报错:pyenv: no such command `virtualenv’
解决方法:官方安装pyenv-virtulenv
Ubuntu解决方法:
$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
$ exec "$SHELL"
切换虚拟环境
pyenv activate env366
pyenv deactivate env366
当显示(env365) 表示你现在处在 env36 环境中
pyenv virtualenv-delete myenv
PATH 去掉重复的内容!
export PATH=$(echo $PATH | sed 's/:/\n/g' | sort | uniq | tr -s '\n' ':' | sed 's/:$//g')
安装
sudo apt-get install nginx
配置
cd /etc/nginx/sites-available
cp default 自己的域名
vim 自己的域名
修改自己的域名那个文件的代码:
server {
listen 80;
server_name 自己的域名;
location / {
uwsgi_pass 127.0.0.1:8000;
include uwsgi_params;
}
location /static{
alias /var/www/自己的项目名/static(自己的静态文件);
}
}
server {
listen 443; # 服务器要放开443接口
server_name www.wutonghuang.top; #公网地
charset utf-8;
ssl on;
ssl_certificate /etc/nginx/cert/1761425_www.wutonghuang.top.pem;
ssl_certificate_key /etc/nginx/cert/1761425_www.wutonghuang.top.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8006; # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理
uwsgi_param UWSGI_PYHOME /var/www/shi/flask; # 指向虚拟环境目录
uwsgi_param UWSGI_CHDIR /var/www/shi; # 指向网站根目录
uwsgi_param UWSGI_SCRIPT app:app; # 指定启动程序
uwsgi_read_timeout 100;
}
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
root /var/www/shi;
index index.html base.html;
cd /etc/nginx/sites-enabled
创建软链接
ln -s ../sites-available/www.wutonghuang.top
service nginx restart
如果有不用的软链接可以用rm -rf 软链接名 来删除
进入到python创建的env365虚拟环境
安装
pip install uwsgi
配置
进入到django项目根目录内
vim uwsgi.ini
加入以下代码:
[uwsgi]
#使用nginx连接时使用
socket = 0.0.0.0:8000
#项目目录
chdir = /var/www/项目名
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file = (与项目名同名的文件名)/wsgi.py
module = (与项目名同名的文件名).wsgi
# 配置虚拟环境
virtualenv = /root/.pyenv/versions/env365
#主进程
master = true
#处理器核心
processes = 1
#线程
threads = 2
在python虚拟环境env365下导入开发所需要的包
django项目一般放在以下目录内
cd /var/www/
service nginx restart
在项目根目录内 uwsgi uwsgi.ini
(1)第一个参数
STATIC_URL = ‘/static/’
配置了该参数,那么在app路径下的static/my_app/img/myexample.jpg这个路径的 文件可以这样在模板中使用。
{% load staticfiles %}
这个路径既然是在app路径下的,那么app自包含的静态文件应该放在这里。形成了 自包含的一个app,这样可以随时把这个app复制到别的项目 中使用。
(2)那么如果有些静态文件不属于app,而是属于项目的,或者操作系统其他绝对路径 的怎么办。
看第二个参数
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
'/var/www/static/',
)
这样在模板中是不用变更的,仍然是上面那样的写法,只不过查找路径增加了两 个,可以查找项目下的static路径。
(3)接下来那么如果我要把项目上线了,部署在http服务器中,但是每个app中都有静态文 件,每个project中都有静态文件,路径太多,怎么办?
看第三个参数
STATIC_ROOT = "/var/www/example.com/static/"
在定义完该参数后,我们可以运行
python manage.py collectstatic命令,它将会自动把上面配置的静态路径下的所有文件复制到STATIC_ROOT 路径中。这样就可以统一在http服务器中配置静态文件。
(4)注意:
(a)如果我们在多个app下使用这样的路径static/imgs/xxx.png,那 么我们在collectstatic后,相同 名字的会覆盖,导致问题。所以我们一般在app下的static下加上app的namespace,形成static/myapp_name /imgs/xxx.png这 样的结构,即使多个app的静态文件复制到同一个文件夹下,也 没有问题。
(b)配置完static后,配置contrib.staticfiles
在settings.py文件中找到INSTALLED_APPS,确保其中包含有’django.contrib.staticfiles’,一般该配置以默认加入了,如果你开发的时候使用的是runserver方式启动服务器,那么你就完成了所有配置,如果你使用其他服务器来开发,则还需要在项目的urls.py中加上如下配置:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# ... the rest of your URLconf goes here ...
urlpatterns += staticfiles_urlpatterns()
需要注意的是,上面代码的第一行必须放在整个urls文件的第一行,上面代码的最后一行必须放在urls文件的最后一行。
nginx和uwsgi服务不能终止,否则服务器停止服务