延续前面帖子,在云服务器上搭建Web服务。
以前用Bottle写的Python脚本,虽然也能提供web服务,但很简陋,不能持久运行。下面是比较简单的一种部署方案。内容整理自网络。
1. 环境说明
1.1 服务器环境
TX云服务器最便宜款,该服务器默认只打开常用的端口,所以要手动把端口全开,用于测试。
步骤:【实例】【更多】【安全组】【配置安全组】【删掉当前默认的,勾选下面端口全开的】。
为了安全,测试完要改回去,在公网上端口全开很危险。
1.2 软件环境
CentOS7,Python3,pip3。
下文中的 python3 和 pip3 命令由服务器的软件环境决定,也可能是 python 和 pip。
2. 安装Bottle
2.1 安装:
pip3 install bottle
2.2 测试:
在某个目录下,新建 web.py,内容如下:
from bottle import get,run
@get("/")
def hello():
return "hello"
run(host="0.0.0.0", port=7000)
然后使用 python3 web.py 或者 python web.py 运行该脚本。
在浏览器中输入 http://127.0.0.1:7000 ,如果出现 hello,说明安装成功。
使用 Ctrl+C 退出命令。
3. 安装 uwsgi
这东西有点类似 Tomcat 的作用,Python Web的容器(中间件)。(一个Java Web程序员的心声)
3.1 安装:
pip3 install uwsgi
3.2 测试:
在某个目录下新建脚本 index.py ,如 /home/apple/myapp/index.py,内容如下:
def application(env,start_response):
start_response('200 OK',[('Content-Type','text/html')])
return [b"Hello uwsgi!"]
然后,使用如下命令:
uwsgi --http 0.0.0.0:8000 --wsgi-file /hom/apple/myapp/index.py
在浏览器中输入 http://127.0.0.1:8000,如果出现 Hello uwsgi,说明成功。
使用 Ctrl + C 关闭 uwsgi 进程。
3.3 配置
为方便,将 uwsgi 命令的参数存为文件。
创建 /etc/uwsgi/uwsgi.ini 文件,内容如下:
[uwsgi]
socket = 127.0.0.1:9000
master = true
workers = 4
chdir = /home/apple/myapp
wsgi-file = index.py
daemonize = /home/apple/myapp/uwsgi.log
enable-threads = true
daemonize 可注释。若启用则uwsgi以后台进程方式运行,推荐。若关闭或重启uwsgi用【kill -9 pid】 即可。
socket 里的端口号是供nginx使用的,承接nginx转发过来的数据,不是暴露给用户使用的,所以要和 nginx 的某个参数保持一致。
使用如下命令启动:
uwsgi --ini /etc/uwsgi/uwsgi.ini
需要关闭uwsgi时,先使用 ps -ef | grep uwsgi ,找到进程号 123 后,使用命令 kill -9 123 杀掉所有相关进程。
4. 安装Nginx
4.1 安装
yum install nginx
4.2 配置
在 /etc/nginx/conf.d 目录下,创建文件 uwsgi.conf,内容如下:
server{
listen 80;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9000;
}
}
nginx的监听端口80,是暴露给用户使用的;而 uwsgi_pass里面的端口是给 uwsig 转发数据用的内部端口,这里的9000要和uwsgi配置的端口保持一致。
整个流程:用户请求——nginx:80——uwsgi:9000——/home/apple/myapp/index.py——调用Bottle——输出Hello uwsgi。
4.3 启动
首先启动 uwsgi :
uwsgi --ini /etc/uwsgi/uwsgi.ini
再启动 nginx:
service nginx start
在浏览器中输入 http://127.0.0.1:80 ,如果出现 Hello uwsgi ,说明全部安装成功,配置成功。
注意:
1. 用腾讯云服务器时,需将2个配置文件中的127.0.0.1 改为你的 腾讯云服务器的内网IP地址,而不是公网IP。否则会出现Nging内部错误,查看 uwsgi.log 会出现bind()错误,具体参考此文。
2. 如果都没有问题,结果没有出现 Hello uwsgi,反而出现“Welcome to CentOS”时(这是Nginx的默认页面),需要修改nginx的配置文件: /etc/nginx/nginx.conf,将
server {
listen 80 default_server; ## 这里默认欢迎页面是80端口,把这个端口改成一个不用的端口号
listen [::]:80 default_server; ## 这里默认欢迎页面是80端口,改成一个不用的端口号中的80,改成不常用的9123等。具体参考此文。
这种情况一般是将nginx的端口改成了80,进入到了nginx的默认页面去了。
5.其它命令
ps -ef | grep nginx 查找nginx进程
kill -9 123 发送SIGKILL信号给进程,告诉进程,你被终结了,请立刻退出
kill 123 发送SIGTERM(15)信号给进程,告诉进程,你需要被关闭,请自行停止运行并退出。
systemctl status nginx.service可以看到具体的错误是什么
pkill -9 uwsgi 关掉服务器
nginx -s reload 重启
最后,调试完后,别忘了把云服务器的安全组设置一下,关闭不必要的端口。
<完>