技术标签: python nginx ubuntu flask
fabric只支持python2,只需要在开发机子上安装python2,服务器不需要
编写fabric脚本,把flask程序打包并上传到阿里云ECS的ubuntu服务器
针对狗书编写的脚本如下:
# -*- coding: utf-8 -*-
import os, re
from datetime import datetime
from fabric.api import *
env.user='root'
env.password='****'
env.hosts=['112.233.244.255']
_TAR_FILE='huu-flask.tar.gz'
def build():
includes=['app','config.py','manage.py','requirements.txt']
excludes=['__pycache__','*.pyc','*.pyo']
local('rm -f dist/%s'%_TAR_FILE)
with lcd(os.path.abspath('.')):
cmd=['tar','--dereference','-czvf','./dist/%s'%_TAR_FILE]
cmd.extend(includes)
cmd.extend(['--exclude=\'%s\''% ex for ex in excludes])
local(' '.join(cmd))
_REMOTE_TMP_TAR='/tmp/%s'%_TAR_FILE
_REMOTE_BASE_DIR='/srv/flasky'
def deploy():
newdir='flasky-%s'%datetime.now().strftime('%y-%m-%d_%H.%M.%S')
run('rm -f %s'%_REMOTE_TMP_TAR)
put('dist/%s'%_TAR_FILE,_REMOTE_TMP_TAR)
with cd(_REMOTE_BASE_DIR):
run('mkdir %s'%newdir)
with cd('%s/%s'%(_REMOTE_BASE_DIR,newdir)):
run('tar -xzvf %s'%_REMOTE_TMP_TAR)
with cd(_REMOTE_BASE_DIR):
run('rm -rf flasky')
run('ln -s %s flasky'%newdir)
首先生成配置:
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
编写配置:
[program:flasky]
command=/srv/venv3/bin/gunicorn manage:app --access-logfile /srv/flasky/flasky/logs/flasky.log
directory=/srv/flasky/flasky
user=root
#用gunicorn启动flask下面这个配置好像不管用,可以在gunicorn启动命令中加入log日志文件
stdout_logfile=/srv/flasky/flasky/logs/flasky.log
environment=A="1",B="2" #可以设置环境变量,虚拟环境添加PATH=""
启动:
supervisord -c /etc/supervisor/supervisord.conf
supervisorctl start flasky
查看状态:
supervisor本身的日志文件在
/tmp/supervisord.log
supervisorctl status
在/etc/nginx/sites-available下有default可以备份后修改
server {
listen 80; # 监听80端口
root /srv/flask/www;
access_log /srv/flask/log/access_log; #默认在/var/log/nginx
error_log /srv/flask/log/error_log;#默认在/var/log/nginx
# server_name awesome.liaoxuefeng.com; # 配置域名
# 处理静态文件/favicon.ico:
location /favicon.ico {
root /srv/flask/www;
}
# 处理静态资源:
location ~ ^\/static\/.*$ {
root /srv/flask/www;
}
# 动态请求转发到9000端口:
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
最后,
/etc/init.d/nginx reload
就可以查看网站了
接着上文 在初始化IO之后的代码是这样的 __try { if ( _ioinit() < 0 ) /* initialize lowio */ _amsg_exit(_RT_LOWIOINIT); /* get wide cmd line info */
为什么80%的码农都做不了架构师?>>> ...
主要的实现步骤:1、使用文件选择器选择图片文件2、把用户选择的文件存入 FormData 对象3、使用 axios 把 FormData 发送给服务器4、模拟文件选择器的点击事件let iptFile = document.querySelector('#iptFile') // 用户选择文件之后所触发的事件:change iptFile.addEventListener('change', function () { // console.log(ip.
参考一:sendto和recvfrom一般用于UDP协议中,但是如果在TCP中connect函数调用后也可以用.sendto()和recvfrom()——利用数据报方式进行数据传输 1. 在无连接的数据报socket方式下,由于本地socket并没有与远端机器建立连接,所以在发送数据时应指明目的地址,sendto()函数原型为: int sendto(int sockf
代码:# -*- coding: utf-8 -*-import numpyas npcsv_file= np.loadtxt(open("D:\运营商数据源字段列表.csv",encoding='utf-8'),dtype=np.str,delimiter=None,unpack=False)data = csv_file[0:,0:].astype(np.str)print(data)报错1:...
Redis 简介Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数
之前的手机安装过app,之后卸载后在重装就不行了。报:Error while executing: am start -n "pagekageName/pagekageName.ac.SpActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAU
参考文章.htaccess技巧: URL重写(Rewrite)与重定向(Redirect)TP5.1隐藏public/index.php第二种方式RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 是什么意思?效果图未隐藏入库文件时:隐藏入口文件后:具体步骤在TP5根目录中添加.htaccess文件就可以了,文件内容如下<IfModul...
声明:关于题目所述的解决办法,百度一搜,无论各种博客也好,还是一些别的什么网站给出的办法,无外乎那几种代码形式,也不知道最初的那段代码出自于谁之手,反正就是搬来搬去,抄来抄去,而且有几种版本基本不能用,本人亲测过,而且有些一看,乱七八槽,根本就是复制粘贴过来的,连排版都没有改,无所谓,就是这个环境本篇文章所列方法,也是来源于以上搜索到的一种版本,本人稍作修改,可以用了,并且成功转换,在此向最开始奉献那段代码的博主表示感谢,现在根本分不清最初是出自于谁之手其实解决题目所述问题,无非解决2件事第一个:将
# -*- coding:utf-8 -*-temp = '李姐'temp_unicode = temp.decode('utf-8')temp_gbk = temp_unicode.encode('gbk')print temp_gbk 转载于:https://www.cnblogs.com/yigongzi/p/6377255.html...
Date类Date():空参数构造,会以当前操作系统的时间构造一个Date对象。long getTime():获取到从1970年开始,到这个Date对象表示的时间,过了多少毫秒,返回时间戳public static void dateApi() { Date d1 = new Date(); System.out.println(d1); //Mon Jul 19 20:42:57 CST 2021 System.out.println(d1.getTime()); //162
最近发现从QDataStream向QByteArray中写入数据常常是写不进去的,通过查看QT的源码: QDataStream &amp;operator&gt;&gt;(QDataStream &amp;in, QByteArray &amp;ba){ ba.clear(); quint32 len; in &gt;&gt; len; if (len ==...