完整版 Nginx+Uwsgi+Django+Python服务器部署及调试

官方文档 https://docs.djangoproject.com/en/1.8/howto/static-files/
Nginx+Uwsgi+Django+Python服务器部署
环境:Ubuntu16.04

1.python开发环境

安装pyenv,python,virtualenv,需要使用python虚拟环境env
pyenv 这个工具用来 管理我们的Python版本
virtualenv 管理不同的环境
pyenv 如果以前已经安装了 python2.7 3.5 pyenv 管理不了 需要管理的话我们得删除原来的版本 重新用pyenv 来安装
如果没有安装vim 先sudo apt-get install vim

a.pyenv安装配置

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

b.python安装配置

备份文件

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 环境中

删除当前需要使用的 virtualenv

pyenv virtualenv-delete myenv

清除重复配置

PATH 去掉重复的内容!

export PATH=$(echo $PATH | sed 's/:/\n/g' | sort | uniq | tr -s '\n' ':' | sed 's/:$//g')

2.安装配置nginx

安装
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 软链接名  来删除			

3.安装配置uwsgi

进入到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

4.安装基本包

在python虚拟环境env365下导入开发所需要的包

5.上传项目

django项目一般放在以下目录内
cd /var/www/

6.运行

service nginx restart
在项目根目录内  uwsgi uwsgi.ini

7.说明

(1)第一个参数
STATIC_URL = ‘/static/’
配置了该参数,那么在app路径下的static/my_app/img/myexample.jpg这个路径的 文件可以这样在模板中使用。

{% load staticfiles %}
My image

这个路径既然是在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服务不能终止,否则服务器停止服务

你可能感兴趣的:(测试)