一步一步学python
——–为应用而学习!
——–为应用而学习!
五 9th
以前都是用C#写webservice,而现在多以php做开发,也很少用windows的平台。就打算用python来写一下
网上找了下相关的库,使用到的如下: python2.7+ soaplib2.0+ pyyaml3.1+ MySQLdb
以前配置都是用的ini文件,这次使用了yaml,使用还是很方便的 先来个例子
#-*- coding:utf-8 -*- import soaplib from soaplib.core.service import soap from soaplib.core.service import DefinitionBase from soaplib.core.model.primitive import String, Integer from soaplib.core.server import wsgi from soaplib.core.model.clazz import Array ''' This is a simple HelloWorld example to show the basics of writing a webservice using soaplib, starting a server, and creating a service client. ''' class HelloWorldService(DefinitionBase): @soap(String, Integer, _returns=Array(String)) def say_hello(self, name, times): ''' Docstrings for service methods appear as documentation in the wsdl <b>what fun</b> @param name the name to say hello to @param the number of times to say hello @return the completed array ''' results = [] for i in range(0, times): results.append('Hello, %s' % name) return results if __name__=='__main__': try: from wsgiref.simple_server import make_server soap_application = soaplib.core.Application([HelloWorldService], 'tns') wsgi_application = wsgi.Application(soap_application) server = 更多 >
五 2nd
先安装nginx和mercurial,这里只把nginx当做前端的代理
mkdir /var/www/hgrep cd /var/www/hgrep hg init
创建一个mercurial项目,建立一个配置文件 vi /var/www/hgrep/hgweb.config 内容如下:
[web] push_ssl = false allow_push = * encoding = "UTF-8" [paths] /hgrep = /var/www/hgrep [hooks] changegroup = hg update
这里建立了一个hook,当用户提交时自动更新 开启服务
hg serve -d -a localhost --webdir-conf hgweb.config
开始配置nginx: 在 http://trac.edgewall.org/browser/trunk/contrib/htpasswd.py 下载该程序,并拷贝至/etc/nginx目录,用于创建密码文件。 我是直接打开这个连接复制的,复制下来的文件是有行号的,先保存到/etc/nginx/htpasswd.py,再使用sed替换行号
sed -i 's/^[0-9]*//g' htpasswd.py
创建你的用户
cd /etc/nginx/ python htpasswd.py -c -b htpasswd user1 123 python htpasswd.py -b htpasswd user2 123
修改nginx的配置文件
vi /etc/nginx/sites-enabled/default 增加如下:
location /hgrep {
root html;
index index.html index.htm;
proxy_pass http://127.0.0.1:8000;
auth_basic "Restricted";
auth_basic_user_file htpasswd;
}
重启nginx服务器即可 在浏览器可以使用localhost/hirep访问 局域网内也能直接访问,需要clone的可以用 hg clone http://user1@host/hirep 此处host换成服务器IP
四 3rd
运营部门提出需求,想把网站进行一次静态化。而ecshop是没有静态的,不像dedecms。要想静态还是要自己下一下功夫。 刚好使用的是nginx做的前端服务器,就改了下配置 让部分页面静态化 对于ecshop来说,商品最终页和分类页是可以静态的,搜索的就没有必要 下面说下详细的实现方法: 如把网站部署到 /data/www/ecshop下; 现在新建目录/data/www/ecshop/html 修改nginx的配置文件如下
server
{
listen 80 default;
server_name example.com
index index.html;
root /data/www/ecshop;
error_page 404 /error.html;
error_page 403 /error.html;
location ~.*\.html {
root /data/www/ecshop/html;
if (!-e $request_filename)
{
root /data/www/ecshop;
rewrite "^/index\.html" /index.php last;
rewrite "^/goods-([0-9]+)(.*)\.html" /goods.php?id=$1 last;
rewrite "^/article_cat-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /article_cat.php?id=$1&page=$2&sort=$3&order=$4 last;
rewrite "^/article_cat-([0-9]+)-([0-9]+)(.*)\.html$" /article_cat.php?id=$1&page=$2 last;
rewrite "^/article_cat-([0-9]+)(.*)\.html$" /article_cat.php?id=$1 last;
rewrite "^/article-([0-9]+)(.*)\.html$" /article.php?id=$1 last;
rewrite "^/brand-([0-9]+)-c([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)\.html" /brand.php?id=$1&cat=$2&page=$3&sort=$4&order=$5 last;
rewrite "^/brand-([0-9]+)-c([0-9]+)-([0-9]+)(.*)\.html" /brand.php?id=$1&cat=$2&page=$3 last;
rewrite "^/brand-([0-9]+)-c([0-9]+)(.*)\.html" /brand.php?id=$1&cat=$2 last;
rewrite "^/brand-([0-9]+)(.*)\.html" /brand.php?id=$1 last;
}
}
location ~ .*\.(php|php5)?$
{
root /data/www/ecshop;
include /usr/local/nginx/conf/fastcgi_params;
}
}
在ecshop目录下新建文件outputhtml.php
<?php $file=$_SERVER['REQUEST_URI']; if(!file_exists(dirname(__FILE__)."/html/".$file)){ $content = ob_get_contents(); file_put_contents(dirname(__FILE__)."/html/".substr($file,0,strpos($file,'.')).'.html',$content); }
在使用了重写的文件最后添加
require(dirname(__FILE__) . '/outputhtml.php');
编写shell脚本,定时删除生成的静态文件
#!/bin/bash
find /data/www/ecshop/html -type f -mtime +1 -exec rm {} \;
我这里删除一天前生成的文件,有些可能时间要更长,请根据自己的需求来设置时间 而首页访问有可能会出现404的错误,并且首页更新的频率会很高,我这里设置为5分钟 更多 >
三 26th
最近写的公司oa系统,在各功能不断增加时运行一点点慢变,有时候还会出现504错误 因为我开发环境是在ubuntu下使用ngix+php-fpm运行 查看了下php-fpm的进程,只有五个,第一反应就是有可能是进程太少了,不能处理过多的请求 找到php-fpm.conf 修改 pm.max_children = 100 还要再有一个可能就是cgi的超时时间太短了,去查了下cgi的配置 果然只有60 将fastcgi_params加入或者是修改如下几行
fastcgi_buffers 8 128k; fastcgi_buffer_size 128k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300;
这里的几个buffer的设置一定要注意,如果内存不够高的话就不要设置那么高了,不然会把服务器拖死的 我开始也把本站的配置按这个改的,结果服务器负载到了30+,全死了;所以大家要根据自己的实际情况来修改 再修改下内核的参数,vi /etc/sysctrl.conf 增加
net.ipv4.tcp_max_syn_backlog = 65536 net.core.netdev_max_backlog = 32768 net.core.somaxconn = 32768 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_tw_recycle = 1 #net.ipv4.tcp_tw_len = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_max_orphans = 3276800 #net.ipv4.tcp_fin_timeout = 30 #net.ipv4.tcp_keepalive_time = 120 net.ipv4.ip_local_port_range = 1024 65535
vi /etc/rc.loacl追加如下内容
ulimit -SHm 65535
再去看看程序的运行,打开速度快了不少,也没有出现过504的错误
三 20th
最近一直没有更新东西了,忙着做一个oa,里面用到了工作流 自己开发流程画图的软件,又用php写了一个实现;不过说实话和codeigniter的结合让我写php都想吐了 也许是习惯了以前.net那种方便的调试方法和友好的错误信息。这个php还真是没有这个办法
先不说这么多,先来介绍一下几个和工作流相关的词汇
工作流: 就是工作从开始到完成的过程。工作流由流程逻辑和路线规则组成。流程逻辑定义了任务的顺序和必须遵循的路线规则,还有截止期限以及由工作流引擎实现的其他业务规则
流程定义(process definition) 一个图形流程定义或流程图,代表工作流的流程逻辑元素以及各元素之间的关系 流程实例(process instance): 一个流程实例,通常称为工作,是一个流程定义的运行实例 状态(state,或者说等待状态): 代表一种对外部参与者的依赖;这意味着在流程运行时流程引擎必须等待,直到外部参与者通知工作流系统指定的状态完成了 动作(action): 在流程运行过程中,工作流系统为响应指定事件运行的一段程序逻辑;当流程运行过程中指定的事件发生时,工作流系统启动并执行这些动作 流程上下文变量(process context variable): 保存每一个流程运行的上下文信息;通常在流程定义中声明这些变量,然后在流程实例生成时被实例化 参与者 以下类型之一:资源集、特定资源、组织单元、角色(一个人在组织内部的作用)、人或系统(自动代理)。 活动 组成流程定义中的一个逻辑步骤的任务,我也把它叫作流程节点。可以是自动的或人工的。自动指在流程操作过程中定义脚本和触发器的能力。流程定义中的特定活动可以作为无人参与的任务来运行,自动化可以在手工或人力驱动的任务中执行业务规则。常见的一种自动活动就是截止期限管理,如果某个工作项在预定的截止期限之前未能完成,该管理可以自动发送一条提醒消息或触发一个延期程序。 节点完成后可根据不同条件进行执行相关的后续的执行程序; 活动所有者 活动所有者是有权宣布一个活动结束,然后推进工作到流程中的下一个活动的参与者 工作所有者 工作所有者是有权整体控制流程实例执行过程的参与者 工作项 代表流程实例中活动的参与者将要执行的工作
二 6th
管理着服务器的人都知道,一般都把服务器端的密码设置的很复杂 而自己又不可能记得很牢,每次都要打开自己记密码的文档来登陆服务器,很是麻烦 在这给大家说一个不用再记密码的办法 ssh是支持公钥验证登陆的 在linux下的操作步骤如下: 切换到root用户下 本机输入ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. 按提示输入相应的内容 这一操作生成了私钥id_rsa和公钥id_rsa.pub 将公钥拷入服务器上,如你的服务器ip为192.168.1.10则输入 scp /root/.ssh/id_rsa.pub root@192.168.1.10:/root/.ssh/authorized_keys 等输入密码后公钥将上传成功 现在在终端中输入 ssh 192.168.1.10 则不用输入密码就能直接登陆到了服务器中
如果没有成功,则可能是由于权限的问题造成的,当前使用的用户权限不能访问/root下的私钥 我的每步操作都是在root用户下进行的,使用服务器的也是root用户,所以没碰到权限问题
操作完成,不用再记那么复杂的密码了