Virtualenvwrapper+Django + Nginx + uwsgi
写在开始前
这边主要是团队合作一个小程序的项目,不擅长前端的我需要独自一人承担起后台的搭建,在此初步进入Linux的世界。
不过本人忘东西很快,还是要记一记。
资源:
Linux :Ubuntu (内核:Linux ubuntu 4.15.0-50-generic 系统:Ubuntu 18.04.2 LTS)
Python 3.6
virtualenv 16.4.3
virtualenvwrapper 4.8.4
Django 2.2
Nginx 1.14.3 + 1.11.6
uwsgi 2.0.18
python和pip的安装都很基础,教程可以搜,都挺好找也好用,这里就不啰嗦了
Virtualenvwrapper
virtualenv是你在当前路径下创建出来你给取名字的虚拟环境,每次开启虚拟环境之前要去虚拟环境所在目录下的 bin 目录下 source 一下 activate,这就需要我们记住每个虚拟环境所在的目录,而Virtualenvwrapper则将所有环境统一放置到指定目录,方便管理,而不是一层一层的的activate。安装wrapper是不必先安装virtualenv的。
pip安装Virtualenvwrapper
pip install virtualenvwrapper
创建虚拟环境文件夹
mkdir ~/.VENVS
进入bashrc文件
sudo vim ~/.bashrc
在文末插入下面这两句
export WORKON_HOME=$HOME/.VENVS
source /usr/local/bin/virtualenvwrapper.sh
使脚本刷新
source ~/.bashrc
命令工具
workon:列出虚拟环境列表
lsvirtualenv:列出虚拟环境列表
mkvirtualenv [envname]:新建虚拟环境
workon [envname]:切换虚拟环境
rmvirtualenv [envname]:删除虚拟环境
deactivate: 离开虚拟环境
cpvirtualenv [sorce] [dest] #复制虚拟环境
pip freeze > requirements.txt 导出该环境下所有依赖到requirements.txt文件
下面要创建一个虚拟环境 vendev
mkvirtualenv vendev
workon vendev
Django
进入虚拟环境
workon vendev
安装django
pip install Django
创建django项目WEB
django-admin startproject WEB
WEB目录结构
hxy@ubuntu:~/WEB$ tree
├── db.sqlite3
├── manage.py
├── WEB
│ ├── init.py
│ ├── pycache
│ │ ├── init.cpython-36.pyc
│ │ ├── settings.cpython-36.pyc
│ │ ├── urls.cpython-36.pyc
│ │ └── wsgi.cpython-36.pyc
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
创建django功能 myapp (这个是网页中功能相近的模块,我们忙的是后台搭建,暂时不考虑业务逻辑的事情)
cd WEB #(项目根目录,不是子目录)
python manage.py startapp myapp
实现uWSGI
workon vendev
pip install uwsgi
cd WEB #(项目根目录,不是子目录)
vim myuwsgi.ini
插入以下内容
[uwsgi]
http = 127.0.0.1:8080
#socket=127.0.0.1:8080
chdir = . #也可以用绝对路径chdir = /home/hxy/WEB
wsgi-file = ./WEB/wsgi.py #model = WEB.wsgi
master = true
processes = 2
threads = 4
vacuum = true
touch-reload = ./reload
daemonize = ./WEB.log
用uwsgi启动django
uwsgi --ini myuwsgi.ini
或者
uwsgi myuwsgi.ini
这里说下http 和socket
http=127.0.0.1:8080 是uwsgi启动且管理时使用,
如果在没用反向代理(nginx)时用socket=127.0.0.1:8080则会在访问127.0.0.1:8080时,
uwsgi_error.log 报错:invalid request block size: 21573 (max 4096)…skip 的情况。
socket=127.0.0.1:8080 用于uwsgi启动由nginx反向代理,
当启用nginx代管uwsgi时,若仍使用http=127.0.0.1,则在访问nginx代理端口时,
nginx_error.log 报错[error] #0: *3 upstream timed out (110: Connection timed out) while reading response header from upstream,
如果只是测试uwsgi,就先用http=127.0.0.1:8080
打开网页 转到127.0.0.1:8080/admin
这是django 自带的admin管理页面。
如果不成功,打开WEB.log查看错误
如果是Address already in use [core/socket.c line 769] 说明有服务占用了8080端口
用 fuser -k 8080/tcp 解绑端口再uwsgi uwsgi.ini重启就好了
nginx
nginx是我踩得最深的坑
ubuntu 安装nginx有两种方式,编译安装和库安装,编译安装可以帮你理解nginx运行的流程,但步步是坑。
库安装简单很多,且自动添加service。
不过二者都需要先安装gcc/g++ prec zlib ssl等依赖库
apt-get install build-essential libtool
apt-get install libpcre3 libpcre3-dev
apt-get install zlib1g-dev
apt-get install openssl
不够权限就加sudo
编译安装nginx
1初步安装
下载,版本可以指定,最新的是14 但不太稳定,所以用了以前的:
wget http://nginx.org/download/nginx-1.11.3.tar.gz
解压:
tar -zxvf nginx-1.11.3.tar.gz
进入解压目录:
cd nginx-1.11.3
配置:
./configure --prefix=/usr/local/nginx
编辑nginx:
make
安装nginx:
sudo make install
启动nginx:
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf这里坑挺多的,大部分是依赖库安装不完整,重新安装还可以解决。我碰上的泪是我的gcc 7编译器格式严格,而11.3的nginx里面的c文件有很多是新的c标准,比如switch case 里缺break.学过c的知道缺break没有语法错误,会导致下一个case的执行,而这个被gcc7禁止了。不想换gcc的我vim了十几行补完。奉劝gcc7的用户换一个6或者8
配置文件目录 /usr/local/nginx/
程序启动文件 /usr/local/nginx/sbin/nginx
日志目录 /usr/local/nginx/logs/
2添加service
cd etc/ini.d
sudo vim nginx11
插入以下内容
#!/bin/bash
#Startup script for the nginx Web Server
#chkconfig: 2345 85 15
nginx=/usr/local/nginx/sbin/nginx
conf=/usr/local/nginx/conf/nginx.conf
case $1 in
start)
echo -n “Starting Nginx11”
$nginx -c $conf
echo " done."
;;
stop)
echo -n “Stopping Nginx11”
killall -9 nginx
echo " done."
;;
test)
$nginx11 -t -c $conf
echo “Success.”
;;
reload)
echo -n “Reloading Nginx11”
ps auxww | grep nginx | grep master | awk ‘{print $2}’ | xargs kill -HUP
echo " done."
;;
restart)
$nginx -s reload
echo “reload done.”
;;
*)
echo “Usage: $0 {start|restart|reload|stop|test|show}”
;;
esac
添加管理
service 工具管理()
service nginx start/stop/restart/status
系统重载服务命令工具
systemctl daemon-reload
命令
启动 srvice nginx11 start
重启 srvice nginx11 restart
停止 srvice nginx11 stop
库安装
sudo apt-get install nginx-1.11.3
生成的配置如下
配置文件目录 /etc/nginx
程序文件 /usr/sbin/nginx
日志 /var/log/nginx
服务脚本 /etc/init.d/nginx
因为自动添加了脚本,就可以直接srevice nginx start
而不用 usr/sbin/nginx -c /etc/nginx/nginx.conf
配置nginx 连接uwsgi
sudo vim usr/local/nginx/conf/nginx.conf
将
location /{
root html;
index index.html index.htm;
}
替换为
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8080; #uwsgi接管django的内部端口
uwsgi_param UWSGI_SCRIPT WEB.wsgi; #用.代替的路径,表示django自动生成的uwsgi.py文件
uwsgi_param UWSGI_CHDIR /home/hxy/WEB;#django项目的绝对路径
client_max_body_size 35m;
}
然后
cd /WEB
vim uwsgi.ini
把里面的http=127.0.0.1:8080 换成socket=127.0.0.1:8080
测试
终端执行命令, 开启uwsgi 和nginx
uwsgi --ini uwsgi.ini
service nginx11 start
打开浏览器,访问 127:0.0.0.1:80/admin访问 127:0.0.0.1:8080/admin
这是因为80是nginx外显的端口,内部的8080端口被他隐藏了,这就是nginx的反向代理,对请求者隐藏资源具体信息。
静态加载
相信大家看得出来,这个页面没有加载css,和平时用python manage.py runserver 的admin页面不一样
这里就让页面可以访问css等静态文件
vim WEB/WEB/settings.py
更改
DEBUG=False
STATIC_URL = ‘/static/’
STATIC_ROOT = os.path.join(BASE_DIR, “static”)
执行 python manage.py collectstatic
这个时候,django会在WEB项目根目录下创建static 文件夹,也就是 /home/hxy/WEB/static,
然后将散落的静态文件收集归纳进去
这个时候还是不能获取静态文件,是因为静态的代理也交由nginx处理
sudo vim usr/local.nginx/conf/nginx.conf
插入这么一段
location /static {
alias /home/hxy/WEB/static; #添加的static静态文件转移目录一致
}
保存退出
测试一下
uwsgi uwsgi.ini
srevice nginx11 start
访问127.0.0.1:80/adimn
ok 吃饭了
好习惯
对于有stop restart 指令的服务,千万别随随便便用killall pkill等指令杀死,否则一些退出后的活动(保存日志,关闭pid,)无法正常进行。就会导致你下次start 时无法启用(nginx 就是这样),就得调用stop再把一些退出活动补上,才能再次start。