Py008-11-03部署实例之发布网站

部署web发布环境

我们先前已经安装了 nginx/mysql/python/django

但是仍然不能算完成

  • 因为nginx只能处理 静态文件

处理python的数据要使用其他模块

  • wsgi
  • uwsgi

安装 UWSGI

  • UWSGI是服务器和服务器端应用程序通信协议,规定了如何把请求转发给应用程序和返回
  • uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进⾏交换。
  • nginx 和 uWSGI交互就必须使⽤同一个协议,而上⾯说了uwsgi支持fastcgi,uwsgi,http协议,这些都是nginx⽀持的协议,只要大家沟通好使用哪个协议,就可以正常运行了。
1
pip3 install uwsgi

编辑uwsgi配置⽂文件!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 新建目录
mkdir /etc/uwsgi

vi /etc/uwsgi/uwsgi.ini
# 内容如下
[uwsgi]
uid = root
gid = root
socket = 127.0.0.1:9090
master = true //启动主进程
vhost = true //多站模式
no-site = true //多站模式时不设置⼊口模块和⽂文件
workers = 2 //⼦进程数
reload-mercy = 10 //平滑的重启
vacuum = true //退出、重启时清理文件
max-requests = 1000 //开启10000个进程后, ⾃动respawn下
limit-as = 512 // 将进程的总内存量控制在512M
buffer-size = 30000
pidfile = /var/run/uwsgi9090.pid //pid⽂文件,⽤于下面的脚本启动、停止该进程
daemonize = /var/log/uwsgi9090.log


# 移除注释
[uwsgi]
uid = root
gid = root
socket = 127.0.0.1:9090
master = true
vhost = true
no-site = true
workers = 2
reload-mercy = 10
vacuum = true
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /var/run/uwsgi9090.pid
daemonize = /var/log/uwsgi9090.log

# 启动uwsgi
uwsgi --ini /etc/uwsgi/uwsgi.int

# 验证是否启动
netstat -ntpl

# 如何关闭 uwsgi
# 获取进程号
cat /var/run/uwsgi9090.pid
# 进程号
10111
# 杀掉进程
kill -9 10111

管理 uwsgi服务

一个脚本

1
vi /etc/init.d/uwsgi

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/bin/sh
DESC="uwsgi daemon"
NAME=uwsgi
DAEMON=/usr/local/bin/uwsgi
CONFIGFILE=/etc/uwsgi/$NAME.ini
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
FIFOFILE=/tmp/uwsgififo
set -e
[ -x "$DAEMON" ] || exit 0
do_start() {
if [ ! -f $PIDFILE ];then
$DAEMON $CONFIGFILE || echo -n "uwsgi running"
else
echo "The PID is exist..."
fi
}
do_stop() {
if [ -f $PIDFILE ];then
$DAEMON --stop $PIDFILE || echo -n "uwsgi not running"
rm -f $PIDFILE
echo "$DAEMON STOPED."
else
echo "The $PIDFILE doesn't found"
fi
}
do_reload() {
if [ -p $FIFOFILE ];then
echo w > $FIFOFILE
else
$DAEMON --touch-workers-reload $PIDFILE || echo -n "uwsgi
can't reload"
fi
}

do_status() {
ps aux|grep $DAEMON
}

case "$1" in
status)
echo -en "Status $NAME: \n"
do_status
;;
start)
echo -en "Starting $NAME: \n"
do_start
;;
stop)
echo -en "Stopping $NAME: \n"
do_stop
;;
reload|graceful)
echo -en "Reloading $NAME: \n"
do_reload
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2
exit 3
;;
esac
exit 0

分配执行权限

1
2
3
4
5
6
7
8
9
10
11
12
13
chmod 755 /etc/init.d/uwsgi 

# 查看状态
/etc/init.d/uwsgi status
# 启动
/etc/init.d/uwsgi start
# 关闭
/etc/init.d/uwsgi stop

# 关闭的时候可能会报错
因为 PIDFILE=/var/run/$NAME.pid 里指定的文件
我们配置的时候改了 pidfile = /var/run/uwsgi9090.pid
PIDFILE=/var/run/${NAME}9090.pid

发布我们的网站

修改nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
vi /usr/local/nginx/conf/nginx.conf

# 将 server 里的内容删掉 最后如下
server {
listen 80;
server_name localhost;
}

# 将server修改如下

server {
listen 80;
server_name localhost;
#access_log logs/abc.log main;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9090;
uwsgi_param UWSGI_SCRIPT myweb.wsgi;
uwsgi_param UWSGI_CHDIR /usr/local/nginx/html/myweb;
index index.html index.htm;
client_max_body_size 35m;
#uwsgi_cache_valid 1m;
#uwsgi_temp_file_write_size 64k;
#uwsgi_busy_buffers_size 64k;
#uwsgi_buffers 8 64k;
#uwsgi_buffer_size 64k;
#uwsgi_read_timeout 300;
#uwsgi_send_timeout 300;
#uwsgi_connect_timeout 300;
}
}

# 注释部分为优化方案
# include uwsgi_params; 包含 uwsgi的参数
# 设置端口 uwsgi_pass 127.0.0.1:9090;
# 设置目录 uwsgi_param UWSGI_SCRIPT myweb.wsgi;
# 设置目录(注意不能在root下 没权限) uwsgi_param UWSGI_CHDIR /usr/local/nginx/html/myweb;

移动我们之前创建的 django项目 到 nginx下

1
2
3
4
5
6
7
8
9
mv myweb  /usr/local/nginx/html/

# 先关闭nginx
/etc/init.d/uwsgi stop
# 启动 nginx
/etc/init.d/uwsgi start

# 启动nginx
/usr/local/nginx/sbin/nginx

此时 访问 我的ip结果返回 Internal Server Error 报错了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 切换到项目文件目录里
cd /usr/local/nginx/html

# 查看日志
tailf /var/log/uwsgi9090.log

# 浏览器里刷新 地址看看日志显示什么
No module named 'django'

# 意思是 你没有指定python对应的环境
vi /etc/uwsgi/uwsgi.ini

# 查看 python包环境
ls /usr/local/lib/python3.7/site-packages
发现没有django

# 因为我们安装在虚拟环境了 就是 虚拟环境的 web
切换到web目录 我的是在 /usr/local/src/web
cd lib/python3.7

ls /usr/local/src/web/lib/python3.7/site-packages
里面有我们安装的django


#####################################
# 修改我们的uwsgi配置文件
# 添加一行
pythonpath = /usr/local/src/web/lib/python3.7/site-packages


######################################
# 关闭uwsgi
/etc/init.d/uwsgi stop
# 启动
/etc/init.d/uwsgi start

# 然后刷新网页 访问你的服务器ip
这个是假的IP
50.77.161.112

### 成功