raspi+tornado+nginx+supervisor配置多站点的WEB服务

raspi,我想用它来做一些数据量不大的数据存储服务和即时的WEB服务.
为了做WEB服务需安装
tornado
supervisor sudo pip install supervisor
安装 nginx sudo apt-get install nginx -y

nginx 反向代理服务器,其作用是对访问客户是透明的(如对外端口为80)对内根据客户端的访问url,来分发给不同的服务。
在nginx.conf的http节配置
upstream 自定义名称{
server 服务器名称1:端口1;
server 服务器名称2:端口2;

负载均衡服务器,是为了负载服务器设置的。多个服务器提供给客户端同一服务,如下载网站中会用到这个。
upstream 自定义名称{
server 服务器名称1:端口1 weight=1;
server 服务器名称2:端口2 weight=2;

Python Tornado Nginx https搭建和使用
参见:https://blog.csdn.net/u013538542/article/details/83010279的详细说明
proxy_next_upstream error;
server { listen 80;
server_name 服务器名称;

由Nginx处理静态服务

location /static/{
alias /web/pythonweb/tornado/css/;
expires 24h;
}
location /{
proxy_pass_header Server;
#服务器名称和端口一起通过代理服务器传递
#proxy_set_header Host host:server_port;
proxy_set_header Host $http_host;
proxy_redirect off;
#传递客户端IP
proxy_set_header X-Real-IP $remote_addr;
# 负载均衡 tornado服务器(利用负载均衡)
proxy_pass http://tornadosweb;
}
nginx针对于运行在不同TCP端口上的Tornado实例,将使用反向代理服务器:客户端通过Internet连接一个反向代理服务器,然后反向代理服务器发送请求到代理后端的Tornado服务器池中的任何一个主机。代理服务器被设置为对客户端透明的,但它会向具有不同端口的Tornado服务传递客户端请求的信息,其中包括客户端的IP地址和请求的数据信息。

supervisor监控Tornado进程
Supervisord是用Python实现的
sudo apt-get install supervisor
创建配置文件
echo_supervisord_conf > /etc/supervisord.conf
此命令生成一个supervisord.conf样例。可在此样例的基础上做具体的配置。
将配置好的supervisord.conf拷贝到/etc/supervisor/下
明确指定supervisord -c /etc/supervisor/supervisord.conf配置文件。
在其间会用到ps -ef | grep nginx/supervisord,查看进程中与/var/run/supervisord.id 或nginx.id重复的进程,如有则kill 进程。
supervisorctl reload 更新配置文件且重启
supervisorctl update 只是更新配置文件。
127.0.0.:9001去查看supervisor对进程的管理状态。
sudo service nginx stop 停止nginx服务
nginx开始服务
在/etc/supervisor/conf.d下的文件
[group:tornadoweb] 与nginx负载均衡相对应
programs=tornadoweb0,tonadoweb1对多个tonadoweb进行管理
[program:tornadoweb0]
command=python /web/pythonweb/tonado/hello.py --port=8009
directory=/web/pythonweb/tonado/
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/supervisor/tornado/tornadoweb0.log
loglevel=info
完成以上的步骤最简单的单个server,多端口的网站已经实现只是在访问时需要用host:port来访问相应的服务。可不可以让url变得更优雅些呢?我想当然可以。
如果有域名分配的情况下可参见如下的引用:
https://blog.csdn.net/lin06051180/article/details/73480832

参看引用后,对优雅的单server多端口的服务有了明确的解决方案
解决方案所需的组件有dnsmasq
dnsmsq是小型的DNS服务器
/etc/hosts.conf,在文件中为内网解析,每 当内网机器在查询里优先查hosts.conf中的解析,当内网内的其它网络设备接入DNS服器时(即将其DNS设置为dnsmasq服务器的IP地址)相当于将/etc/host.conf中的内网解析共享纷呈了内网设备使用,解决了内网设备间互相识别的问题.
默认都会有127.0.0.1 localhost
可以加入自定义的IP与域名的绑定
127.0.0.1 a.com web01
127.0.0.1 b.com web02
通过此种方式hosts劫持了解析,如我们可以把baidu.com在hosts设置中解析一个内网的服务器,取代外网的baidu.com,这可以说算是作弊,但是说实话这种做法对只有一个服务器又都想通过优雅url来提供多服务端口的配置是最大的福音。好用得很。在解决这类问题的过程中还涉及到对/etc/resolv.conf的配置。
resolv.conf的设置很算单,只需把hosts中涉及到的IP地址设在里面就可以,

nameserver 127.0.0.1
nameserver 192.168.1.1
就这么简单。
只做了这些还不够,还需要改一改nginx中的配置
在http节内设置多个upstream .如下
upcstream tornados{
server a.com:8001
}
upstream sockets{
server b.com:8002
}
proxy_next_upstream error;
server{
listen 80;
server_name a.com;
location /static/{
alias /home/pi/pythonweb/tornado_asyn/img/;
expires 24h;
}
location /{
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://tornados;
}
}
server{
listen 80;
server_name b.com;
location /static/{
alias /home/pi/pythonweb/tornado_asyn/img/;
expires 24h;
}
location /{
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://sockets;
}
}

**/etc/supervisor/conf.d/**文件夹根据upstream来创建
文件名字与upstream中的自定义名一致。如下
[group:sockets]
programs=socket-0
[program:socket-0]
command=python /home/pi/pythonweb/test.py --port=8002
directory=/home/pi/pythonweb/
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/supervisor/tornado/socket-0.log
loglevel=info

在配置supervisor后,为检测是否配置文件有错误用
supervisord -c /etc/supervisor/supervisord.conf来重启
当然也可用supervisorctl reload,但是不报错
systemctl start supervisor.service

在配置 nginx:用nginx -s reload重新加载
netstat -ntlp来检测端口使用状况
用nginx -t来检测conf文件是否正确

下一步用配置好的服务器来做具体的服务,环境的搭建就此完结。

你可能感兴趣的:(学习笔记)