教程
信息差
资源
软件工具
技术笔记
AIGC
视频
Search
1
使用AI实现高精度钢琴曲转谱Piano Transcription简明使用教程
37,794 阅读
2
使用ESP8266Wifi模块制作Wifi杀手
37,467 阅读
3
unravel 让图片唱歌详细教程 Real Time Image Animation 项目
27,386 阅读
4
佳能相机刷Magic Lantern魔灯固件
23,503 阅读
5
战地3 正版账号免费分享!
16,213 阅读
教程
信息差
资源
软件工具
技术笔记
AIGC
视频
Search
标签搜索
python
前端
环境搭建
空镜素材
Ubuntu
markdown
神器
黑苹果
编码
技巧
Git
数据库
开发
下载工具
Youtube
CDN
PDF
OST
电影原声带
音乐
易小灯塔
累计撰写
176
篇文章
累计收到
44
条评论
首页
栏目
教程
信息差
资源
软件工具
技术笔记
AIGC
视频
页面
搜索到
127
篇与
的结果
2018-04-19
CentOS编译安装Nginx
1. 环境准备# 更换YUM源,centos默认源是国外的网站,下载会比较慢 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum makecache # 安装编译环境,如果安装过了,就不需要再安装了 yum -y install gcc* 2. 安装pcre库,如果不安装pcre库,Nginx无法使用rewrite模块,在编译安装过程也会报错# 查询pcre库是否安装 rpm -qa|grep pcre yum -y install pcre pcre-devel # 安装完之后查询一下是否安装成功,如果能够看到pcre和pcre-devel包就可以了 rpm -qa|grep pcre 3. 安装nginx# 创建一个software/目录用来放软件包 mkdir -p /opt/software # 创建安装目录 mkdir -p /application/nginx-1.14.0 # 下载nginx安装包 cd /opt/software wget -q http://nginx.org/download/nginx-1.14.0.tar.gz # 创建一个nginx用户 useradd nginx -s /sbin/nologin -M //创建一个nginx用户 # 解压 tar xvf nginx-1.14.0.tar.gz cd nginx-1.14.0 # 安装 ./configure --user=nginx --group=nginx --prefix=/application/nginx-1.14.0 --with-http_stub_status_module --with-http_ssl_module # 如果安装报./configure: error: SSL modules require the OpenSSL library 需要安装openssl-devel,安装完之后再执行一下上一条命令 yum -y install openssl-devel make && make install # 创建软链接是为了以后如果要升级,应用程序中如果有引用Nginx路径,不需要做任何更改,访问的还是原来的路径/application/nginx ln -s /application/nginx-1.14.0/ /application/nginx # 查看链接状态 ls -l /application/nginx 注意:编译安装Nginx软件时,还可以使用./configure --help查看相关参数帮助4. 检查安装结果# 启动nginx服务 /application/nginx/sbin/nginx netstat -lntup|grep 80 5. 在浏览器里面输入nginx服务器IP地址发现并没有成功,原因是被centos防火墙拦截了, 这个时候, 我们需要关闭防火墙6. 关闭防火墙CentOS7版本后防火墙默认使用firewalld,因此在CentOS7中关闭防火墙使用以下命令,# 临时关闭 $ systemctl stop firewalld # 禁止开机启动 $ systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.123456 当然,如果安装了iptables-service,也可以使用下面的命令,$ yum install -y iptables-services # 关闭防火墙 $ service iptables stop Redirecting to /bin/systemctl stop iptables.service # 检查防火墙状态 $ service iptables status Redirecting to /bin/systemctl status iptables.service iptables.service - IPv4 firewall with iptables Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled) Active: inactive (dead) 重新访问就能成功访问了
2018年04月19日
1,395 阅读
0 评论
0 点赞
2018-04-18
Django使用FastDFS文件存储系统
FastDFS服务部署完成后, 可以使用django调用点击进入部署教程Django自带文件存储系统,但是默认文件存储在本地, 要将文件保存到FastDFS服务器上,需要自定义文件存储系统。自定义文件存储系统的方法如下:1)需要继承自django.core.files.storage.Storage,如from django.core.files.storage import Storage class FastDFSStorage(Storage): ... 2)支持Django不带任何参数来实例化存储类,也就是说任何设置都应该从django.conf.settings中获取from django.conf import settings from django.core.files.storage import Storage class FastDFSStorage(Storage): def __init__(self, base_url=None, client_conf=None): if base_url is None: base_url = settings.FDFS_URL self.base_url = base_url if client_conf is None: client_conf = settings.FDFS_CLIENT_CONF self.client_conf = client_conf 3)存储类中必须实现_open()和_save()方法,以及任何后续使用中可能用到的其他方法。 _open(name, mode='rb')被Storage.open()调用,在打开文件时被使用。 _save(name, content)被Storage.save()调用,name是传入的文件名,content是Django接收到的文件内容,该方法需要将content文件内容保存。Django会将该方法的返回值保存到数据库中对应的文件字段,也就是说该方法应该返回要保存在数据库中的文件名称信息。 exists(name)如果名为name的文件在文件系统中存在,则返回True,否则返回False。 url(name)返回文件的完整访问URL delete(name)删除name的文件 listdir(path)列出指定路径的内容 size(name)返回name文件的总大小注意,并不是这些方法全部都要实现,可以省略用不到的方法。 4)需要为存储类添加django.utils.deconstruct.deconstructible装饰器我们在 项目/utils/fastdfs目录中创建fdfs_storage.py,实现可以使用FastDFS存储文件的存储类如下from django.conf import settings from django.core.files.storage import Storage from django.utils.deconstruct import deconstructible from fdfs_client.client import Fdfs_client @deconstructible class FastDFSStorage(Storage): def __init__(self, base_url=None, client_conf=None): """ 初始化 :param base_url: 用于构造图片完整路径使用,图片服务器的域名 :param client_conf: FastDFS客户端配置文件的路径 """ if base_url is None: base_url = settings.FDFS_URL self.base_url = base_url if client_conf is None: client_conf = settings.FDFS_CLIENT_CONF self.client_conf = client_conf def _open(self, name, mode='rb'): """ 用不到打开文件,所以省略 """ pass def _save(self, name, content): """ 在FastDFS中保存文件 :param name: 传入的文件名 :param content: 文件内容 :return: 保存到数据库中的FastDFS的文件名 """ client = Fdfs_client(self.client_conf) ret = client.upload_by_buffer(content.read()) if ret.get("Status") != "Upload successed.": raise Exception("upload file failed") file_name = ret.get("Remote file_id") return file_name def url(self, name): """ 返回文件的完整URL路径 :param name: 数据库中保存的文件名 :return: 完整的URL """ return self.base_url + name def exists(self, name): """ 判断文件是否存在,FastDFS可以自行解决文件的重名问题 所以此处返回False,告诉Django上传的都是新文件 :param name: 文件名 :return: False """ return False 在Django配置中设置自定义文件存储类在Django的配置文件setting.py文件中添加设置# django文件存储 DEFAULT_FILE_STORAGE = '项目名.utils.fastdfs.fdfs_storage.FastDFSStorage' # FastDFS FDFS_URL = '服务器地址:8888/' FDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'utils/fastdfs/client.conf')
2018年04月18日
1,142 阅读
0 评论
0 点赞
2018-04-16
Nginx 解析漏洞
Nginx 解析漏洞 Nginx 0.5.、Nginx 0.6.、Nginx 0.7 <= 0.7.65、Nginx 0.8 <= 0.8.37:以上 Nginx 容器的版本下,上传一个在 WAF 白名单之内扩展名的文件 shell.jpg,然后以 shell.jpg.php 进行请求。 Nginx 0.8.41~1.5.6:以上 Nginx 容器的版本下,上传一个在 WAF 白名单之内扩展名的文件 shell.jpg,然后以 shell.jpg%20.php 进行请求。
2018年04月16日
1,825 阅读
0 评论
0 点赞
2018-04-14
Pycahrm远程调试Django项目
Pycahrm远程调试Django项目blog没几个人看,少了很多动力,不过为了锻炼自己的总结能力,加深自己的记忆,就算是写给自己看也要写下去。废话不多说,进入正题…最近因为需要要把django项目部署到服务器端,又想在本地进行调试,发现了pycharm的远程调试的强大(不得不佩服jetbrains公司),网上搜出来的很多都是零散的,过程中也是踩了很多的坑,于是这里就来记录一下整个过程。 为了方便测试,这里使用的是virtual Box安装的ubuntu17.04。一丶远程连接配置首先需要配置的是ssh服务,ubuntu默认是没有安装openssh-server的,那就进入终端命令 sudo apt-get install openssh-server 然后查看ssh服务是否启动 ps -e|grep -ssh 如果看到sshd的进程就说明已经启动了,只有ssh-agent是没有启动的 然后手动去启动 sudo /etc/init.d/ssh start ssh默认的访问端口是22,可以进入配置文件修改,这里就不多说了,如果修改后了直接进行重启 sudo /etc/init.d/ssh restart 这里就不使用证书的方式进行访问了,直接使用远程登录用户的方式 然后进入pycharm, File->Settings->Deployment可以看到如下界面host填写服务器的公网ip,如果是用的虚拟机的话可以使用来查看ip ifconfig 这里可以使用root用户来连接,依次填入,然后就可以连接了,连接后选择项目在远程主机的根目录,可以直接新建一个。配置完成后,再去配置下Mappings,选择本地项目的根目录就可以了,最后不要忘了Apply。现在就可以把项目直接上传到服务器端了,然后选中项目根目录(切记不是选中某个文件!) 然后点击Tools->Deployment->Upload Default server 这样的话项目就上传完成了。二丶配置远程虚拟环境既然是python项目,自然要用到virtualenv和virtualenvwrapper。 直接使用命令 pip3 install python3-virtualenv 如果安装失败的话,就使用 sudo apt-get install python3-virtualenv 然后安装virtualenvwrapper pip3 install virtualenvwrapper 安装完成后需要配置下环境变量 vim ~/.bashrc 然后把光标移动到最后一行,加入如下两行 export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh 保存后重新加载一遍才会生效 source ~/.bashrc 这样的话虚拟环境的配置就完成了 然后可以使用 mkvirtualenv xxx #新建虚拟环境 workon xxx #进入虚拟环境 因为ubuntu下默认的python版本是python2.7的,这里要建python3的环境可以直接使用 mkvirtualenv Test --python=python3.5 接下来是安装项目的扩展包,因为我们之前只是将项目上传到服务器端,但是新建的虚拟环境扩展包为空,我们总不能一个个去安装吧, 这里我们可以把之前的扩展包全部写在一个test.txt文件中,然后进入虚拟环境后使用命令 pip3 install -r test.txt 如果安装速度慢的话,可以使用豆瓣源,这里就不多说了。 这些工作完成后, 然后进入Pycharm File->Setting->Project Interpreter,把项目环境改成远程服务器端的虚拟环境 点击设置按钮addRomte->SSH Credential,填入服务器端的相关信息,然后在ython interpreter path选择在服务器端建立好的虚拟环境,等待加载完成后Apply一下,这样准备工作就完成了。三丶项目相关的配置这里服务器端MySQL的配置就不多说了,这个基本百度出来的方法没什么问题, 把本地数据转移到服务器端可以直接使用Navicate for mysql的数据传输选项。主要记录下django里settings文件的配置,之前在本地进行调试的时候DATABASES里面的host使用的localhost使用的是localhost或者127.0.0.1,但是放到服务器端后要把它修改为服务器的公网ip。 然后还要修改一下这个 ALLOWED_HOSTS = ['*'] 这些都完成后再去Pycharm的Edit Confrgrations中,也就是项目运行的配置环境中修改一下Host,端口默认是8000和Python iterpreter为远程虚拟环境。 然后就可以直接在本地运行服务器端的项目。这样的话使用Pycahrm进行远程调试的整体过程就完成了
2018年04月14日
3,253 阅读
0 评论
0 点赞
2018-04-12
使用Docker部署分布式文件系统FastDFS
使用Docker部署分布式文件系统FastDFSFastDFS是一个开源的轻量级分布式文件系统, 功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。比较适合文件比较多的网站, FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,FastDFS比较适合以中小文件为载体的在线服务,比如跟NGINX(APACHE)配合搭建图片服务器。FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。上传交互过程 client询问tracker上传到的storage,不需要附加参数; tracker返回一台可用的storage; client直接和storage通讯完成文件上传。 下载交互过程 client询问tracker下载文件的storage,参数为文件标识(卷名和文件名); tracker返回一台可用的storage; client直接和storage通讯完成文件下载。 client为使用FastDFS服务的调用方,client也应该是一台服务器,它对tracker和storage的调用均为服务器间的调用FastDFS的安装和使用FastDFS可以使用docker进行部署要完全使用fastdfs的功能的话,需要安装配置的文件实在太多,包括libcomment,nginx,fdfs-nginx-module等其他依赖模块,都需要浪费很多的时间和精力,为了更好的解决这个问题,提高效率,利用doker技术完成对fastdfs镜像的构建,效率提高上百倍,几分钟内就搞定了获取镜像可以通过拉取镜像命令获得docker image pull delron/fastdfs 或者直接下载好镜像文件载入docker load -i 文件路径/fastdfs_docker.tar 镜像的下载地址链接: https://pan.baidu.com/s/1jQ3zIPVIPuAtAcCA3Dqm0w 密码: 2ghn加载好镜像后,就可以开启运行FastDFS的tracker和storage了。运行Docker开启docker服务docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker # 将fastDFS tracker运行目录映射到本机的 /var/fdfs/tracker目录中 查看tracker是否运行起来docker container ls 如果要停止tracker服务,可以执行如下命令docker container stop tracker 重新运行tracker,可以执行如下命令docker container start tracker 运行storage开启storage服务docker run -dti --network=host --name storage -e TRACKER_SERVER=192.168.25.170:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage # RACKER_SERVER=本机的ip地址:22122 本机ip地址注意不要使用127.0.0.1 # 将fastDFS storage运行目录映射到本机的/var/fdfs/storage目录中 查看storage是否运行起来docker container ls 要停止storage服务,可以执行如下命令docker container stop storage 重新运行storage,可以执行如下命令docker container start storage 注意:如果无法重新运行,可以删除/var/fdfs/storage/data目录下的fdfs_storaged.pid 文件,然后重新运行storage。FastDFS客户端的使用FastDFS的Python客户端安装pip install fdfs_client-py pip install mutagen pip isntall requests 使用ipython调试时发现语法错误如下In [1]: from fdfs_client.client import Fdfs_client Traceback (most recent call last): File "/home/moin/.virtualenvs/py3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2963, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-1-a4c50acd3321>", line 1, in <module> from fdfs_client.client import Fdfs_client File "/home/moin/.virtualenvs/py3/lib/python3.6/site-packages/fdfs_client/client.py", line 12, in <module> from fdfs_client.utils import * File "/home/moin/.virtualenvs/py3/lib/python3.6/site-packages/fdfs_client/utils.py", line 230 print get_file_ext_name('/bc.tar.gz') ^ SyntaxError: invalid syntax In [2]: 应该是因为是python2的版本所以在python3下使用所以出现语法错误, 所以在网上找了个修改好的版本, 使用python3的可以下载下面这个安装使用链接: https://pan.baidu.com/s/1eMD1MBhJifpG_APd7wOJgw 密码: tpzkpip install fdfs_client-py-master.zip 使用使用FastDFS客户端,需要有配置文件。在你的项目目录下新建fastdfs目录,将新建client.conf配置文件放到这个目录中。# 连接超时 connect_timeout=30 # 网络超时 network_timeout=60 # 存储日志文件的路径 base_path=FastDFS客户端存放日志文件的目录 # trackerserver 地址设置 tracker_server=运行tracker服务的机器ip:22122 # 日志级别: log_level=info # if use connection pool use_connection_pool = false # connections whose the idle time exceeds this time will be closed connection_pool_max_idle_time = 3600 # if load FastDFS parameters from tracker server load_fdfs_parameters_from_tracker=false # if use storage ID instead of IP address use_storage_id = false # specify storage ids filename, can use relative or absolute path # same as tracker.conf # valid only when load_fdfs_parameters_from_tracker is false # since V4.05 storage_ids_filename = storage_ids.conf #HTTP settings http.tracker_server_port=80 上传文件需要先创建fdfs_client.client.Fdfs_client的对象,并指明配置文件,如from fdfs_client.client import Fdfs_client client = Fdfs_client('你的项目/fastdfs/client.conf') 通过创建的客户端对象执行上传文件的方法client.upload_by_filename(文件名) 或 client.upload_by_buffer(文件bytes数据) 进入ipython进行测试In [1]: from fdfs_client.client import Fdfs_client In [2]: client = Fdfs_client('你的项目/fastdfs/client.conf') In [3]: client.upload_by_filename('/home/moin/Pictures/01.jpg') # 上传一张图片 getting connection <fdfs_client.connection.Connection object at 0x7f7500da5dd8> <fdfs_client.fdfs_protol.Tracker_header object at 0x7f7500da5cf8> Out[4]: # 出现这个代表上传成功 {'Group name': 'group1', 'Remote file_id': 'group1/M00/00/00/wKgZqluQiseARzRPAAISqdrr6pM456.jpg', 'Status': 'Upload successed.', 'Local file name': '/home/moin/Pictures/01.jpg', 'Uploaded size': '132.00KB', 'Storage IP': '192.168.25.170'} 然后访问地址就可以看到刚刚上传的照片了http://192.168.25.170:8888/group1/M00/00/00/wKgZqluQiseARzRPAAISqdrr6pM456.jpg # 服务器地址:8888/文件路径
2018年04月12日
2,080 阅读
0 评论
0 点赞
2018-04-05
Django 网络请求超时问题
服务器架构: gunicorn、 Django、nginx最近在工作中遇到一个奇怪的问题,某段逻辑偶尔会出现异常,却偏偏看不到error log。查看代码发现里面有一段网络请求的逻辑,resp = urlopen(url) 这里忽略一个重要的参数 - timeout, urlopen将默认读取 socket defaulttimout。 如果socket也没有设置的话,请求将一直等待,直到出错断开。>> socket.getdefaulttimeout() >> None 看起来就是一个疏忽,诡异的地方在于一直看不到请求报错!!没有报错就看不到错误日志,没有错误日志就无法自动报警,导致了这个问题一直没有被暴露。继续研究日志,在很后面的地方发现一个异常,刚好与发起网络请求的log相差30s。[2017-01-04 12:00:54 +0000] [1260] [CRITICAL] WORKER TIMEOUT (pid:19348) [2017-01-04 12:00:54 +0000] [19348] [INFO] Worker exiting (pid: 19348) [2017-01-04 12:00:54 +0000] [19417] [INFO] Booting worker with pid: 19417 是的,gunicorn worker 超时重启了。原因: gunicorn worker默认 Timeout 为30秒,当网络堵塞超过30秒时,worker将自动重启,这样永远也看不到网络超时的Error解决方法:1、修改gunicorn 默认超时时间 (添加到启动参数,按需修改)--timeout 60 2、非异步网络请求必须添加timeout参数,且不能大于等于gunicorn worker超时时间总结:要关注每个view工作时间,耗时长的任务建议做成异步任务(如使用Celery)
2018年04月05日
2,830 阅读
0 评论
0 点赞
2018-04-03
CentOS没有ifconfig命令的解决办法
全新安装centos的时候,运行ifconfig准备查看服务器IP的时候, 发现会报错-bash:command not found 网上搜了下, 原因可能是最小化安装centos等Linux发行版的时候会默认不安装ifconfig等命令解决的办法: yum安装ifconfig这个包首先搜索下$ yum search ifconfig 发现ifconfig所属的命令包是net-tools.x86_64安装$ yum install net-tools.x86_64 中途会询问“Is this os [y/d/n]”,按y回车,Complete完成安装。安装完之后就可以输入ifconfig查看网卡信息了
2018年04月03日
4,146 阅读
0 评论
0 点赞
2018-04-03
了解Web框架安全
暂无简介
2018年04月03日
3,938 阅读
0 评论
0 点赞
2018-04-02
CentOS解决终端乱码
CentOS修改终端输出语言 远程连接centos服务器的时候, 发现有些字符会乱码在网上搜了下, 发现是默认语言设置的问题. 可输入echo $LANG和locale查询 修改默认语言, 编辑配置文件$ vi /etc/locale.conf 添加下面字段, wq保存LANG=”zh_CN.UTF-8” 应用配置文件, 使其生效$ source /etc/locale.conf 问题解决
2018年04月02日
3,255 阅读
0 评论
0 点赞
2018-03-22
websocket协议
WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 最大不同是: WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Socket 一样; WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信。 以前客户端想知道服务端的处理进度,要不停地使用 Ajax 进行轮询,让浏览器隔个几秒就向服务器发一次请求,这对服务器压力较大。另外一种轮询就是采用 long poll 的方式,这就跟打电话差不多,没收到消息就一直不挂电话,也就是说,客户端发起连接后,如果没消息,就一直不返回 Response 给客户端,连接阶段一直是阻塞的。而 WebSocket 解决了 HTTP 的这几个难题。当服务器完成协议升级后( HTTP -> WebSocket ),服务端可以主动推送信息给客户端,解决了轮询造成的同步延迟问题。由于 WebSocket 只需要一次 HTTP 握手,服务端就能一直与客户端保持通信,直到关闭连接,这样就解决了服务器需要反复解析 HTTP 协议,减少了资源的开销。
2018年03月22日
919 阅读
0 评论
0 点赞
2018-03-16
Jupyter Notebook 安装使用
简介: 网页交互式编辑器, 多用于数据分析安装pip install jupyter notebook pip3 install jupyter配置设置jupyter notebook --generate-config启动jupyter notebook # 指定6666端口启动 jupyter notebook --port 6666找到内核配置路径λ jupyter kernelspec list Available kernels: python2 C:\Users\admin\AppData\Roaming\jupyter\kernels\python2 python3 C:\Users\admin\AppData\Roaming\jupyter\kernels\python3修改Python路径为当前Python的安装路径{ "argv": [ "D:\\DevelopTools\\Python37\\python.exe", "-m", "ipykernel_launcher", "-f", "{connection_file}" ], "display_name": "Python 3", "language": "python" }打开指定的notebook文件: jupyter notebook notebook.ipynb指定运行的端口:jupyter notebook --port 9999启动服务器但不打开浏览器:jupyter notebook --no-browser查看服务器帮助内容:jupyter notebook --help可配合vscode使用
2018年03月16日
753 阅读
0 评论
0 点赞
2018-03-16
Docker容器学习笔记
Docker容器学习笔记 Docker是一个开源的容器引擎, 让开发者可以打包让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux上.容器和虚拟机的区别Docker的特点速度快,大多数 Docker 容器只需要不到 1 秒中即可 启动Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务器 或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了 一个命令行工具 Docker 以及一整套 RESTful API。可以在同一台宿主机上运行 Docker 守护 进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。 docker镜像镜像是构建 Docker 的基石。用户基于镜像来运行自己的容器。镜像也是 Docker 生命周 期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构 建出来。Docker 容器就是: 一个镜像格式; 一些列标准操作; 一个执行环境。Docker 借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker 将这个模 型运用到自己的设计中,唯一不同的是:集装箱运输货物,而 Docker 运输软件。容器提供了隔离性,结论是,容器可以为各种测试提供很好的沙盒环境。在Ubuntu中安装Dockersudo apt-get install docker 启动与停止安装完成Docker后,默认已经启动了docker服务,如需手动控制docker服务的启停,可执行如下命令# 启动docker sudo service docker start # 停止docker sudo service docker stop # 重启docker sudo service docker restart Docker的镜像操作Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。列出镜像docker image ls 拉取镜像docker image pull hello-world 删除镜像docker image rm hello-world 创建容器docker run [option] 镜像名 [向启动容器中传入的命令] 常用可选参数说明: -i 表示以“交互模式”运行容器 -t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。 --name 为创建的容器命名 -v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。 -d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。 -p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射 -e 为容器设置环境变量 --network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同 交互式容器例如,创建一个交互式容器,并命名为myubuntudocker run -it --name=myubuntu ubuntu /bin/bash 在容器中可以随意执行linux命令,就是一个ubuntu的环境,当执行exit命令退出时,该容器也随之停止。守护式容器创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。在容器内部exit退出时,容器也不会停止。docker run -dit --name=myubuntu2 ubuntu 进入已运行的容器docker exec -it 容器名或容器id 进入后执行的第一个命令 如docker exec -it myubuntu2 /bin/bash 查看容器# 列出本机正在运行的容器 docker container ls # 列出本机所有容器,包括已经终止运行的 docker container ls --all 停止与启动容器# 停止一个已经在运行的容器 docker container stop 容器名或容器id # 启动一个已经停止的容器 docker container start 容器名或容器id # kill掉一个已经在运行的容器 docker container kill 容器名或容器id 删除容器docker container rm 容器名或容器id 将容器保存为镜像我们可以通过如下命令将容器保存为镜像docker commit 容器名 镜像名 镜像备份与迁移我们可以通过save命令将镜像打包成文件,拷贝给别人使用docker save -o 保存的文件名 镜像名 如docker save -o ./ubuntu.tar ubuntu 在拿到镜像文件后,可以通过load方法,将镜像加载到本地docker load -i ./ubuntu.tar
2018年03月16日
1,624 阅读
0 评论
0 点赞
2018-03-15
Python Django 商城开发简单小结
用python django框架,参与开发了一个电商物流的项目,简单说就是从用户(店主)在各个电商平台拉订单,然后智能选仓,发送订单,由仓库出货。订单后处理功能包括:各电商平台拉取订单,检查订单(去重,留言分析,货到付款标识识别,地址合法性检查),拆单/并单,选仓发货。 辅助功能包括:允许开展营销活动(满元赠,满件赠)。允许开启消费者理智期(延迟处理订单)。全国范围智能选仓进行备货,业内叫分仓。项目采用python django框架,涉及到下面几个技术要点: 1、以外键(Foreign Key)为关联,进行前向,后向联合查表,组合成一个QuerySet对象输出。 def get(self, user_id, order_id): # filter方法,这是最常用的一个方法,用来取出数据库中的表项,是一个list。 order_details = OrderDetail.objects.\ filter(order_id=order_id, is_deleted=False). \ select_related('sku') # select_related是后向查表,以'sku'为外键的另一张子表,一并查出来。 order_history = OrderHistory.objects.filter(order_id=order_id) # prefetch_related是前向查表,一并查出父表,并且可以迭加使用。 order = Order.objects.\ prefetch_related(Prefetch('order_detail', queryset=order_details, to_attr='order_details')).\ prefetch_related(Prefetch('order_history', queryset=order_history)).\ select_related('store').\ get(user_id=user_id, id=order_id) return order #返回的order是一个django QuerySet对象。是组合了多张表构成的一个对象。 2、QuerySet对象可以多次条件过滤,从而支持多条件查询操作。warehouse_list是一个QuerySet对象,可以经过几个不同条件的过滤和排除,从而得到符合多条件的对象。if 'province' in dict_arg: warehouse_list = warehouse_list.filter(province__in=dict_arg['province']) if 'city' in dict_arg: warehouse_list = warehouse_list.filter(city__in=dict_arg['city']) if 'not_approved' in dict_arg: warehouse_list = warehouse_list.exclude(approved=dict_arg['not_approved']) # province__in,数据库列名加上__in的意思是一个条件判断,判断province是否在=后的列表中。这是django强大之处。 3、prefetch_related另一种经典用法,关联表列名conditions = { "warehouseservice__code": SERVICE_ITEMS[0][0], } # 'warehouseservice_set'这是warehouse的一个父表的QuerySet对象。实际上django在查表时,一并把关联表全部查出来了的。 # 'warehouseservice__price'和"warehouseservice__code"是父表中的两个列名:price和code。 warehouse_list = warehouse_list.prefetch_related('warehouseservice_set') .filter(**conditions).order_by('warehouseservice__price') 4、django排序输出# 用order_by方法,可以对多个列名进行排序,先排第一个,第一个相同的情况下,按第二个来排。默认是升序,前面加-是降序。 warehouse_list = warehouse_list.order_by('-stars_level', 'cost_per_order') 5、http url中的query取参方法# 前端用GET或POST方法提交时,都可以在http url中添加query参数,就是?type=1这种参数。 request.GET 类似于一个字典,更好的办法是用 request.GET.get('a', 0) 当没有传递 a 的时候默认 a 为 0 一个同事写了一个get_param_by_request(params, param_name, default_val=None, _type=None)方法来达到这个目的, 看来似乎没必要。 6、url正则表达式写法 django框架给出了一个urlpatterns = [ url(r'^create$', livechat_view.create, name='create_channel'), # 发送申请看仓消息 url(r'^requests$', livechat_view.requests, name='create_or_list_requests'), # idx是频道号,func是动作名。这两个参数都通过url给进来。这是一个技巧。 url(r'^(?P<idx>\w+)/(?P<func>\w+)$', livechat_view.handle, name='pause_resume_delete'), ] django的匹配url时,是从上到下来顺序执行的,如果我们把最后一行提到最前面,那创建频道和发送看仓消息就得不到正确的匹配。7、前后台参数传递,用code而不是值,前端要展示的值,由后端查出来给前端。OPERATION_CODE = ( (10, '创建订单', '接收订单'), (11, '订单审核成功', '订单通过系统审核'), (30, '仓库接单', '仓库成功接受发货任务'), (31, '发货完成', '仓库出库完成'), ) 这个编码值,传递起来简单准确,数据量也少。当一个代码的描述值发生变化时,code仍然不用变。8、基于ModelSerializer做序列化,返回json对象给前端。class OrderHistorySerializer(ModelSerializer): order_id = CharField(source='order.id') class Meta: model = OrderHistory fields = [ 'id', 'created_at', 'updated_at', 'order_id', 'is_system', 'operator_id', 'copy_operator_name', 'action', 'comment', ] 把要返回的字段放进去,就可以得到json化的dict返回,比较方便快捷。
2018年03月15日
1,431 阅读
0 评论
0 点赞
2018-03-11
不使用sudo执行Docker
Docker守候进程绑定的是一个unix socket,而不是TCP端口。 这个套接字默认的属主是root,其他是用户可以使用sudo命令来访问这个套接字文件。因为这个原因,docker服务进程都是以root帐号的身份运行的。 为了避免每次运行docker命令的时候都需要输入sudo,可以创建一个docker用户组,并把相应的用户添加到这个分组里面。当docker进程启动的时候,会设置该套接字可以被docker这个分组的用户读写。这样只要是在docker这个组里面的用户就可以直接执行docker命令了。操作步骤: 1.创建docker组:sudo groupadd docker1 2.将当前用户加入docker组:sudo gpasswd -a ${USER} docker1 3.重启服务:sudo service docker restart1 4.刷新Docker成员:newgrp - docker
2018年03月11日
1,355 阅读
0 评论
0 点赞
2018-03-11
Nginx学习笔记
正向代理:代理端代理的是客户端。 反向代理:代理端代理的是服务端。1. 正向代理正向代理类似一个跳板机,代理访问外部资源。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。 正向代理的用途: 访问原来无法访问的资源,如google 可以做缓存,加速访问资源 对客户端访问授权,上网进行认证 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息 2. 反向代理反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。客户端是无感知代理的存在的,反向代理对外都是透明的,访问者者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。 反向代理的作用:1.保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。2.负载均衡通过反向代理服务器来优化网站的负载 Nginx的使用nginx的使用主要是对配置文件的配置配置文件位于conf文件夹的nginx.conf文件主要结构... #全局块 events { #events块 ... } http #http块 { ... #http全局块 server #server块 { ... #server全局块 location [PATTERN] #location块 { ... } location [PATTERN] { ... } } server { ... } ... #http全局块 } 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。 events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。 http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。 server块:配置虚拟主机的相关参数,一个http中可以有多个server。 location块:配置请求的路由,以及各种页面的处理情况。 配置文件示例########### 每个指令必须有分号结束。################# #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; #设置网路连接序列化,防止惊群现象发生,默认为on multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off #use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_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 8080; #监听端口 server_name 127.0.0.1; #监听地址 location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。 #root path; #根目录 #index vv.txt; #设置默认页 proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表 deny 127.0.0.1; #拒绝的ip allow 172.18.5.54; #允许的ip } } } 需要注意的有以下几点 $remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址 $remote_user :用来记录客户端用户名称; $time_local : 用来记录访问时间与时区; $request: 用来记录请求的url与http协议; $status : 用来记录请求状态;成功是200, $body_bytes_s ent :记录发送给客户端文件主体内容大小; $http_referer :用来记录从那个页面链接访问过来的; $http_user_agent:记录客户端浏览器的相关信息; 惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。 每个指令必须有分号结束。
2018年03月11日
712 阅读
0 评论
0 点赞
1
...
4
5
6
...
9