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管理页面。

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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值