Flask项目部署云服务器 CentOS7.3+Redis+MySQL+Flask+Nginx+Gunicorn +Supervisorctl

项目运行环境

阿里云(单核CPU, 2G内存, CentOS7.3 x64 带宽1Mbps), 具体购买和ssh连接阿里云本文不做描述。

实用工具

首先进入阿里云后先要升级下apt-get, CentOS采用的是yum管理工具 ,并下载所需软件

sudo apt-get update
sudo apt-get install vim git wget tmux mysql-devel gcc gcc-devel python-devel libffi-devel bzip2-devel

或者

sudo yum update
sudo yum install vim git wget tmux mysql-devel gcc gcc-devel python-devel libffi-devel bzip2-devel

我还会使用zsh和oh-my-zsh来替换bash

sudo apt-get install zsh
或
yum  install zsh

替换bash为zsh

chsh -s /bin/zsh    #只对当前用户

重新连接阿里云就可以看到效果, 具体主题可以根据自己喜好更改主目录下的.zshrc即可

redis

1.获取redis资源

wget http://download.redis.io/releases/redis-5.0.8.tar.gz

2.解压

tar xzvf redis-5.0.8.tar.gz

3.安装

cd redis-5.0.8makecd srcmake install PREFIX=/usr/local/redis

(如果有执行出错,先安装gcc。安装命令为:yum -y install gcc automake autoconf libtool make 。

若出现【zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录】,则运行命令make MALLOC=libc)

4.移动配置文件到安装目录下

cd ../mkdir /usr/local/redis/etcmv redis.conf /usr/local/redis/etc

5.配置redis为后台启动

  vi /usr/local/redis/etc/redis.conf (:/daemonize查找到daemonize  将daemonize no 改成daemonize yes)#如果要设置远程访问把bind=127.0.0.1注释掉(如果想设置密码在redis.conf中加上:requirepass:密码即可)protected-mode 要设置成no      (默认是设置成yes的, 防止了远程访问,在redis3.2.3版本后)

6.将redis加入到开机启动

 vi /etc/rc.local #在里面添加内容:/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf #(意思就是开机调用这段开启redis的命令)

7.开启redis

/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

8.建立快捷指令

#临时有效
alias redis-cli='/usr/local/redis/bin/redis-cli'

要想永久有效

vim ~/.bashrc
#加入
alias redis-cli='/usr/local/redis/bin/redis-cli'# 立即生效
source ~/.bashrc#之后就可以使用redis-cli进入redis

注意:
自定义指令写入~/.bashrc只对当前用户永久生效,所用用户永久生效要写入/etc/bashrc。

常用指令

  • 打开redis命令:redis-server
  • 关闭redis命令:redis-cli shutdown
  • 设为开机启动:chkconfig redis on
  • 设为开机关闭:chkconfig redis off

【注意】
正常服务器重启之后Redis数据是会丢失的,为防止数据丢失,做以下设置:

  1. 找到 /etc/sysctl.conf
vim /etc/sysctl.conf
  1. 在最后一行添加
vm.overcommit_memory = 1
  1. wq保存,用sysctl -p 使配置生效
sysctl -p

会返回添加的那一行,说明添加成功。

以后linux服务器在重启,redis的数据就不会丢了

MySQL

CentOS7.3 安装mysql数据库5.7
国内服务器可以使用国内镜像

安装Python3

Linux 安装python3.7.6

虚拟环境

使用python的pip包管理工具

sudo apt-get install python-setuptools
sudo apt-get install python-pip

pip 安装到指定目录 sudo pip2 install numpy --target=/usr/local/lib/python2.7/site-packages

安装虚拟环境的命令 :

sudo pip install virtualenv
sudo pip install virtualenvwrapper

安装完虚拟环境后,如果提示找不到mkvirtualenv命令,须配置环境变量:

# 1、创建目录用来存放虚拟环境
mkdir $HOME/.virtualenvs# 2、打开~/.bashrc文件,并添加如下:
export WORKON_HOME=$HOME/.virtualenvs
#export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh# 3、运行
source ~/.bashrc

如果采用了zsh替换bash

# 1、创建目录用来存放虚拟环境
mkdir $HOME/.virtualenvs# 2、打开~/.zshrc文件,并添加如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh# 3、运行
source ~/.zshrc

如果报错 -bash:/root/.zshrc:source:2: no such file or directory: /usr/local/bin/virtualenvwrapper.sh

说明文件没在这个路径下,

可以通过which 命令查看(which是用来查看当前要执行的命令所在的路径)

[root@localhost ~]$ which virtualenvwrapper.sh
/usr/bin/virtualenvwrapper.sh

重新修改 ~/.bashr或 ~/.zshrc对应的路径即可:

export WORKON_HOME=$HOME/.virtualenvs
source /usr/bin/virtualenvwrapper.sh
#  然后重新运行以下命令
source ~/.bashrc

创建虚拟环境的命令 :

提示:如果不指定python版本,默认安装的是python2的虚拟环境

在python2中,创建虚拟环境

mkvirtualenv 虚拟环境名称
例 :
mkvirtualenv py_flask

在python3中,创建虚拟环境

mkvirtualenv -p python3 虚拟环境名称
#也可以使用
mkvirtualenv py3_venv  --python=python3.7
例 :
mkvirtualenv -p python3 py3_flask

如果报错:ImportError: No module named zipp。解决方法:pip install zipp==1.2.0

pthon 2.7 如果报错:无法从from backports.configparser import ConfigParser导入configparser,是因为缺少configparser文件,可以在https://pydoc.net/configparser/3.5.0/configparser/ 将缺少的configparser文件准备好,放入backports文件夹,即可解决

如果报错:Error while finding module specification for ‘virtualenvwrapper.hook_loader’ (ModuleNotFoundError: No module named ‘virtualenvwrapper’)
解决办法:python -m pip install --user virtualenvwrapper --upgrade

如果virtualenvwrapper装好后, 发现使用mkvirtualenv XX时, 又找不到virtualenv了:
which: no virtualenv in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
ERROR: virtualenvwrapper could not find virtualenv in your path
解决办法:
将python环境下的virtualenv拷贝至/usr/bin/目录下:ln /usr/local/python3/bin//virtualenv /usr/bin/virtualenv

提示 :

  • 创建虚拟环境需要联网
  • 创建成功后, 会自动工作在这个虚拟环境上
  • 工作在虚拟环境上, 提示符最前面会出现 “虚拟环境名称”

关于虚拟环境的其他用法:

查看虚拟环境

workon 两次tab键

使用虚拟环境的命令 :

workon 虚拟环境名称例 :使用python2的虚拟环境
workon py_flask例 :使用python3的虚拟环境
workon py3_flask

退出虚拟环境的命令:

deactivate

删除虚拟环境的命令:

rmvirtualenv 虚拟环境名称#例 :删除虚拟环境py3_flask#先退出:
deactivate
#再删除:
rmvirtualenv py3_flask

项目部署

安装依赖
用pip freeze查看当前安装版本

pip freeze

导出依赖包

pip freeze > requirements.txt

这将会创建一个 requirements.txt 文件,其中包含了当前环境中所有包及 各自的版本的简单列表。您可以使用 “pip list”在不产生requirements文件的情况下, 查看已安装包的列表。这将会使另一个不同的开发者(或者是您,如果您需要重新创建这样的环境) 在以后安装相同版本的相同包变得容易。

安装依赖包

pip install -r requirements.txt

这能帮助确保安装、部署和开发者之间的一致性。

安装Gunicorn
Gunicorn是一个wsgi服务器, 我们将通过它来启动我们的web服务。

# 注意我们是通过pip来安装,所以该模块所有文件都是在venv里面
pip install gunicorn

安装成功就可以直接使用了。

运行一下manage.py

# 不适用gunicorn运行
python manage.py runserver# 使用gunicorn 运行
# 这里需要注意一下, 冒号前面的是文件名也就是manage.py而后面的是应用的名称。我在这里载过跟头。因为服务器需要接受一个wsgi的应用而manager = Manager(app)不是一个wsgi应用所以报错
gunicorn manage:app

我们创建一个gunicorn配置文件gunicorn.py并把他放到code目录下

## gunicorn.py# encoding: utf-8import multiprocessing# 监听端口
bind = '0.0.0.0:5000'
# 工作模式
worker_class = 'gevent' #必须先安装gevent
# 并行工作进程数(我采用跟CPU核心数一致)
workers = multiprocessing.cpu_count() * 1
#线程
#threads=8000
keepalive=1
#在keep-alive连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间。
worker_connections=1000000
#worker_connections最大客户端并发数量,默认情况下这个值为1000。此设置将影响gevent和eventlet工作模式
graceful_timeout=0
#graceful_timeout优雅的人工超时时间,默认情况下,这个值为30。收到重启信号后,工作人员有那么多时间来完成服务请求。在超时(从接收到重启信号开始)之后仍然活着的工作将被强行杀死
limit_request_line=8048
#limit_request_line HTTP请求行的最大大小,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。值是0~8190的数字。此参数可以防止任何DDOS攻击
backlog=8048chdir = './'proc_name='gunicorn.pid' # 设置守护进程 True为后台运行
daemon = False
#显示现在的配置,默认值为False,即显示。
check_config = True# 设置日志记录水平
loglevel = 'debug'
#记录PID
pidfile='debug.log'
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
# 设置错误信息日志路径 ,设置里错误日志路径后将不再屏幕打印调试信息
errorlog = './logs/error.log'
# 设置访问日志路径
accesslog = './logs/access.log'

启动程序

#-c 指定配置文件运行。-D后台运行
gunicorn manage:app -c gunicorn.py

查看状态

pstree -ap|grep gunicorn

杀死gunicorn进程

ps -ef |grep gunicorn|grep -v grep|awk '{print $2}'| xargs kill -9

安装Nginx
我们通过nginx来反向代理我们的服务。

# 首先下载一个nginx
sudo apt-get install nginx

我们可以访问我们的域名或IP地址,如果出现Nginx的提示就表示安装成功了。
nginx安装在/usr/local/nginx/目录下, 我们把项目的配置文件放到/usr/local/nginx/conf/nginx.conf
(新版本的Nginx 安装在/etc/nginx目录下)

这是nginx配置文件nginx.conf详解:

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为onmulti_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off#use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventportworker_connections  1024;    #最大连接数,默认为512
}
http {include       mime.types;   #文件扩展名与文件类型映射表default_type  application/octet-stream; #默认文件类型,默认为text/plain#access_log off; #取消服务日志    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式access_log log/access.log myFormat;  #combined为日志格式的默认值sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。upstream mysvr {   server 127.0.0.1:7878;server 192.168.10.121:3333 backup;  #热备}error_page 404 https://www.baidu.com; #错误页server {keepalive_requests 120; #单连接请求上限次数。listen       4545;   #监听端口server_name  127.0.0.1;   #监听地址       location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。#root path;  #根目录#index vv.txt;  #设置默认页proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表deny 127.0.0.1;  #拒绝的ipallow 172.18.5.54; #允许的ip           } }
}

注意:

屏蔽IP的配置文件既可以屏蔽单个IP,也可以屏蔽IP段,或者只允许某个IP或者某个IP段访问。

# 屏蔽单个IP访问deny IP;# 允许单个IP访问allow IP;# 屏蔽所有IP访问deny all;# 允许所有IP访问allow all;# 屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令deny 123.0.0.0/8;# 屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令deny 124.45.0.0/16;# 屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令deny 123.45.6.0/24;# 如果想实现这样的应用,除了几个IP外,其他全部拒绝,# 那需要在 nginx_limit中这样写allow 1.1.1.1;allow 1.1.1.2;deny all;

单独网站屏蔽IP的方法,把 include /etc/nginx/conf.d/nginx_limit; 放到网址对应的在server{}语句块,

所有网站屏蔽IP的方法,把 include /etc/nginx/conf.d/nginx_limit; 放到http {}语句块。

搭建站点:

server{gzip on;gzip_buffers 32 4K;gzip_comp_level 6;gzip_min_length 100;gzip_types application/javascript text/css text/xml;gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不
支持)   gzip_vary on;listen 8088;server_name localhost;# nginx log信息, 需要创建logs目录access_log /home/slp/Project/WYTT/nginx_log/access.log;error_log /home/slp/Project/WYTT/nginx_log/error.log;location / {root  /var/www/static/dist;index  index.html index.htm;}location /api/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header HOST $host;proxy_redirect off;proxy_pass http://127.0.0.1:5000/;}}server {#SSL 访问端口号为 443listen 443 ssl; #填写绑定证书的域名server_name cloud.tencent.com; #证书文件名称ssl_certificate 1_cloud.tencent.com_bundle.crt; #私钥文件名称ssl_certificate_key 2_cloud.tencent.com.key; ssl_session_timeout 5m;#请按照以下协议配置ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on;location / {#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。root html; index  index.html index.htm;}
}
#建立快捷指令
vim ~/.zshrc
#加入
alias nginx='/usr/local/nginx/sbin/nginx'# 然后检查nginx有没有错误
nginx -t # 重新启动服务
nginx -s reload

nginx常用指令

#启动nginx
nginx -c /path/to/nginx.conf
#关闭nginx:
nginx -s stop  :快速停止nginx  quit  :完整有序的停止nginx
#重启nginx:
nginx -s reload  :修改配置后重新加载生效
nginx -s reopen  :重新打开日志文件
nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确#其他的停止nginx 方式:
ps -ef | grep nginxkill -HUP 主进程号       :平滑重启nginx
kill -QUIT 主进程号     :从容停止Nginx
kill -TERM 主进程号     :快速停止Nginx
pkill -9 nginx          :强制停止Nginx

安装Supervisor

supervisor用来监控进程,并在进程挂掉的时候自动重启它。

# 这里需要把它安装到系统中
sudo pip install supervisor# 生成配置文件
sudo echo_supervisord_conf > /etc/supervisord.conf

编辑/etc/supervisord.conf,并在最后一行加入一下字段

# 编辑/etc/supervisord.conf,并在最后一行加入一下字段
# 这样配置文件会将/etc/supervisor/conf.d下所有.conf结尾的都会导入进来
[include]
files = /etc/supervisor/conf.d/*.conf# 在创建一个配置文件到/etc/supervisor/conf.d/WYTT.conf
[program:WYTT]
directory=/root/project/WYTT
environment=PATH="/root/.virtualenvs/py3_venv/bin/" ;指定虚拟环境
command = gunicorn manage:app -c /root/project/WYTT/gunicorn.py ; 程序启动命令
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3       ; 启动失败自动重试次数,默认是3
user=root          ; 用哪个用户启动进程,默认是root
priority=999         ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=100MB  ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/root/supervisor_logs/wytt.out
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程,如果出现无法彻底杀死进程时,改为True

通过supervisorctl工具用来管理supervisor维护的进程

# reread来重新加载的配置内容, update来更新
supervisorctl reload
#或
supervisorctl update

centos上常用的命令

supervisorctl status:查看所有进程的状态supervisorctl stop :停止supervisorctl start :启动supervisorctl restart 或者使用supervisorctl reload: 重启supervisorctl update :配置文件修改后可以使用该命令加载新的配置supervisorctl reload: 重新启动配置中的所有程序  supervisorctl restart all: 启动全部(你想重启的单个应用名字也可以)

但是在centos上使用supervisorctl reload会报错error: <class ‘socket.error’>, [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224

可以通过下面指令来启动

mkdir /etc/supervisor
#supervisor安装成功之后,没有提供默认的配置文件,可以通过运行echo_supervisord_conf程序生成supervisor的初始化配置文件
echo_supervisord_conf > /etc/supervisor/supervisord.conf
#使用supervisord 来启动
supervisord -c /etc/supervisor/supervisord.conf :启动
supervisorctl shutdown :关闭

当我使用 supervisorctl start WYTT时,一直显示:

WYTT: ERROR (no such process)

几番周折才发现,/etc/supervisor/supervisord.conf 一直还是原来的。我们之前改的是/etc/supervisord.conf。所以我们只要将/etc/supervisor/supervisord.conf中被注释掉的 [include] 解开,并改为:

[include]
files = /etc/supervisor/conf.d/*.conf

就可以了。

WEBUI 管理进程
supervisord 默认是没有开启WEB服务的,需将配置文件/etc/supervisor/supervisord.conf中

;[inet_http_server]         ; inet (TCP) server disabled by default
;port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)

中注释解开,重启supervisord就可以通过http://127.0.0.1:9001打开web界面了。如果是linux服务器,127.0.01是不允许外部访问的,可以通过nginx转发,或者更改host地址为0.0.0.0:9001。就可以使用外部访问了。

[inet_http_server]         ; inet (TCP) server disabled by default
port=0.0.0.0:9001          ; ip_address:port specifier, *:port for all iface
username=user              ; default is no username (open server)
password=123               ; default is no password (open server)

每当云服务器重启之后,需要重新启动:
1.Redis

/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

设置快捷启动

vim ~/.bashrc
#加入
alias redis-cli='/usr/local/redis/bin/redis-cli'# 立即生效
source ~/.bashrc#之后就可以使用redis-cli进入redis

2.Nginx

nginx -s reload

出现错误:nginx: [error] open() “/run/nginx.pid” failed (2: No such file or directory)
解决方案:

sudo nginx -c /etc/nginx/nginx.conf   # 指定nginx配置文件
sudo nginx -s reload                  # 重新启动nginx

3 .MySQL
出现ONLY_FULL_GROUP_BY错误

set sql_mode=(select replace(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
set @@global.sql_mode=(select replace(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

4.Supervisorctl

启动supervisorctl(为防止受到权限限制,最好通过root用户启动supervisord)

supervisord -c /etc/supervisor/supervisord.conf

Flask项目部署云服务器 CentOS7.3+Redis+MySQL+Flask+Nginx+Gunicorn +Supervisorctl相关推荐

  1. 将安卓项目部署云服务器,将app项目部署到云服务器上

    将app项目部署到云服务器上 内容精选 换一换 ContainerOps需要与其他云服务协同工作,ContainerOps和其他云服务的关系如图1.云容器引擎云容器引擎(Cloud Container ...

  2. 阿里云服务器——centos7下安装MySQL,并且实现远程连接

    centos7下安装MySQL,并且实现远程连接 1.先查看MySQL是否安装 rpm -qa|grep mysql 2.更新yum源 wget https://dev.mysql.com/get/m ...

  3. centos7 ifconfig命令找不到_centos7+mysql+gunicorn+flask项目部署

    前言 出于学习和实践的目的,近期自己写了一个小项目关于flask的API项目,涉及到服务器的上线部署问题,这里就做一个详细的记录和分享吧~欢迎一起交流学习指正~ 正文 一.centos7安装pytho ...

  4. 江在川上曰:云服务器上的flask项目部署(Ubuntu+Flask+Gunicorn+Supervisor+Nginx+Anaconda)

    云服务器上的flask项目部署(anaconda.python.flask等相关安装) 在探索未知的路上走了很多弯路,这里记载了我在阿里云上部署项目切实可行的步骤,当然问题因人而异,没有四海皆适用的准 ...

  5. Flask项目的云服务器选择和部署

    本来是自己搭一些东西,没想到一波三折,云服务器买了好几家,索性写一篇云服务器对比和使用体验. 文章重点是通过Python的Flask框架,来在云服务器部署一个web服务. Flask诞生于2010年, ...

  6. 如何将本地python项目部署到服务器上_如何将本地的Django项目部署到云服务器

    如何将本地的Django项目部署到云服务器 开发环境 开发语言: Python 后台框架:Django 前端框架:bootstrap web服务器:nginx wsgi服务器:uwsgi 查看本地项目 ...

  7. 快速部署web项目上线云服务器

    快速部署web项目上线云服务器 一.第一步登录腾讯云 1.登录腾讯云后,先购买或者在最新活动中免费领取一个十五天的云服务器产品 2.然后点击头像 3.在云产品选项中选择你需要的云服务器或轻量级应用服务 ...

  8. 最新Elasticsearch8.4.3 + Kibana8.4.3在云服务器Centos7.9安装部署(参考官方文档)

    一.前言   最近笔者学习Elasticsearch,官方最新稳定版为 Elasticsearch-8.4.3,想在云服务器上Centos7.9搭建.搭建之路坑多路少啊(指网上的博文教程五花八门,基本 ...

  9. 从零部署 Django 项目至云服务器

    过去半个月,成功实现了将 Python Django 搭建的 API 本地项目部署到阿里云服务器.因为是初次尝试部署服务器.注册域名等,甚至也是自己独立去使用 Linux 系统,在整个部署过程中没来得 ...

最新文章

  1. luogu P6113 【模板】一般图最大匹配(带花树)
  2. Java B2B2C多用户商城 springcloud架构-服务容错保护(Hystrix服务降级)
  3. PAT1052---------初步了解正则表达式
  4. SuperMap iDesktop 8C 进行地图SQL查询并显示结果操作示例
  5. mongodb在插入数据环节避免数据重复的方法(爬虫中的使用update)
  6. mysql数据库连接失败,挑战大厂重燃激情!
  7. SAP 免费赠与客户货物的销项税处理
  8. unsigned char与char的区别
  9. 小冰与老东家微软达成战略合作,并宣布数亿元Pre-A轮融资,将全面开展商业化
  10. 自动化测试selenium基础面试技巧?
  11. ajax以base64上传图片到django
  12. linux 自动化安装系统,Linux-运维之半自动化安装系统
  13. 《老罗Android开发视频教程》更新
  14. Mac 下修改eclipse内存设置
  15. 结合量价持仓分析的股指期货日内交易策略
  16. 66个求职应聘技巧性问答(三)
  17. 本周AI热点回顾:Hinton独立发布44页论文火爆社区;新特效火爆全网!各路神仙齐唱《蚂蚁呀嘿》...
  18. vs2017无法解析外部符号__imp__fprintf和__imp____iob_func
  19. 跨平台SIP 客户端-linphone下载、使用
  20. 修改安卓默认的系统button样式,以及其它系统控件的默认样式

热门文章

  1. Sencha Cmd 6/7 让你的 ExtJS6/7 项目使用 ES6/ES7/ES8 语法规范
  2. Anniversary party (hdu1520) 没有上司的晚会
  3. 计算机的过去和现在作文英语怎么说,过去和现在的作文英语_六年级真题英语作文2篇-五维英语...
  4. 技术冲浪: 拥抱 Linux 的时代
  5. 如何在 Windows XP 中使用 Web 浏览器连接打印机
  6. 中专计算机英语期中考试试卷答案,职业中专英语期中考试试卷
  7. 阿宇wifi球机如何连接手机
  8. “for“的循环语句(python)
  9. 发现onmouseup事件无法调用?
  10. 论文计算机的教学方法,职业院校计算机教育教学方法初探论文