Ubuntu停止支持版本的源列表
[| 2012/03/27 21:49]
今天想在我的ubuntu 9.10 Server开发用虚拟机上装个软件,发现apt各种404,以为是用的上海交大的教育网源把不在支持周期内的版本都删除了,于是换了官方源,发现还是不行。找了半天,发现过期版本的源地址都改变了,以9.10为例,改成:
deb http://old-releases.ubuntu.com/ubuntu/ karmic main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ karmic-security main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ karmic-updates main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ karmic-proposed main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ karmic-backports main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic-security main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic-updates main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic-proposed main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic-backports main restricted universe multiverse
对于其他版本则只需把karmic改成其他版本对应的代号即可。
这样超期ubuntu就能继续使用了。
deb http://old-releases.ubuntu.com/ubuntu/ karmic main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ karmic-security main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ karmic-updates main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ karmic-proposed main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ karmic-backports main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic-security main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic-updates main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic-proposed main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic-backports main restricted universe multiverse
对于其他版本则只需把karmic改成其他版本对应的代号即可。
这样超期ubuntu就能继续使用了。
BAE-百度开放云发布了
[| 2012/03/23 15:59]
linux共用同uid的两个用户名(用户别名)
[| 2012/03/14 23:38]
突然想到一个问题,linux能否支持一个用户有别名?试了试,发现一定程度上是可以的。
创建一个用户,然后把其uid,gid改的和一个已知用户相同。然后登陆。
发现w命令和last命令里面都显示的是新用户名,但建立的文件权限显示还是老用户名。权限跟老用户相同。内部文件权限存储应该是用的uid和gid,显示时区passwd里面查出用户名然后显示的。
无聊鼓捣,想想这个特性有什么用。。
创建一个用户,然后把其uid,gid改的和一个已知用户相同。然后登陆。
发现w命令和last命令里面都显示的是新用户名,但建立的文件权限显示还是老用户名。权限跟老用户相同。内部文件权限存储应该是用的uid和gid,显示时区passwd里面查出用户名然后显示的。
无聊鼓捣,想想这个特性有什么用。。
ubuntu下设置cron任务不生效原因(run-parts的bug)
[| 2012/03/14 13:48]
一个ubuntu server某用户配了crontab任务后一直不执行。但系统的可以。刚开始以为是crontab -e后是否要重启cron服务,man了一下,不需要。然后加了一个每分钟1次的echo,执行正常,排除了cron的问题。
然后检查run-parts是否执行正常,执行run-parts --test cron.daily,发现是空结果。。。疑惑,上ubuntu的wiki一查,原来ubuntu版的run-parts有个bug,凡是带.sh后缀的不执行。。。这是什么鸟设计。并且06年就有这个bug了,还没修复。不靠谱。
解决方法是建个不带sh的软链即可
然后检查run-parts是否执行正常,执行run-parts --test cron.daily,发现是空结果。。。疑惑,上ubuntu的wiki一查,原来ubuntu版的run-parts有个bug,凡是带.sh后缀的不执行。。。这是什么鸟设计。并且06年就有这个bug了,还没修复。不靠谱。
解决方法是建个不带sh的软链即可
nginx强制使用https(http到https自动跳转
[| 2012/03/11 10:45]
nginx对于使用http访问开启了https的站点会返回400.而浏览器输入网址默认是http的,每次都要去改成https很烦,于是考虑自动跳转的方法,刚开始用的$scheme变量判断,如果不是https则跳转。发现无效。
搜了一下,网上的一大抄们都表示rewrite (.*)https://$host/$1 permanent;可以,光目标地址没考虑端口号就让人感觉不是特别靠谱。试了下,果然不行。
想了下,应该是在一开始就被判断出异常,根本没有往后走的缘故。
这时找到一个方法:error_page 497 https://$host:$server_port$request_uri;
497表示使用http连接https的错误码。一旦出错让其跳转到https。
搞定
搜了一下,网上的一大抄们都表示rewrite (.*)https://$host/$1 permanent;可以,光目标地址没考虑端口号就让人感觉不是特别靠谱。试了下,果然不行。
想了下,应该是在一开始就被判断出异常,根本没有往后走的缘故。
这时找到一个方法:error_page 497 https://$host:$server_port$request_uri;
497表示使用http连接https的错误码。一旦出错让其跳转到https。
搞定
nginx做反向代理proxy_pass,proxy_redirect的使用
[| 2012/03/11 01:39]
今天用nginx作为trac的反代,发现一个问题,就是登入登出跳转的时候是白页,看了下网页相应内容,发现相应的location是空的。查了一下发现是只单纯用了proxy_pass,没有使用proxy_redirect.
假设前端url是example.com。后端server域名是in.com,那么后端server在返回refresh或location的时候,host为in.com,显然这个信息直接返回给客户端是不行的,需要nginx做转换,这时可以设置:
proxy_redirect http://in.com /
nginx会将host及port部分替换成自身的server_name及listen port。不过这种配置对server_name有多个值的情况下支持不好。
我们可以用nginx内部变量来解决这一问题:
proxy_redirect http://in.com http://$host:$server_port
搞定
如果不设定的话,proxy_redirect默认是default属性,官网例子是这样介绍default的:
我试了下,location /{}规则时似乎不太正常,会导致location为空。这个有待详细考证
假设前端url是example.com。后端server域名是in.com,那么后端server在返回refresh或location的时候,host为in.com,显然这个信息直接返回给客户端是不行的,需要nginx做转换,这时可以设置:
proxy_redirect http://in.com /
nginx会将host及port部分替换成自身的server_name及listen port。不过这种配置对server_name有多个值的情况下支持不好。
我们可以用nginx内部变量来解决这一问题:
proxy_redirect http://in.com http://$host:$server_port
搞定
如果不设定的话,proxy_redirect默认是default属性,官网例子是这样介绍default的:
引用
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect default;
}
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect http://upstream:port/two/ /one/;
}
proxy_pass http://upstream:port/two/;
proxy_redirect default;
}
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect http://upstream:port/two/ /one/;
}
我试了下,location /{}规则时似乎不太正常,会导致location为空。这个有待详细考证
lighttpd日志切分
[| 2012/03/09 18:56]
之前在读代码的时候发现lighttpd在收到SIGHUP信号后会把日志重新打开一下,一直没有理解这么做的意义是什么。今天终于用到了这个功能。
一个新模块没有使用cronlog等日志切分工具,直接打印日志到文件,(使用管道切分日志有风险,被打印程序一旦hang住,lighttpd也就卡住了),但如何切分日志文件就变成了一个问题。mv的话由于不改变inode,还是往同一个文件打。cp代价太大。直接清空日志的话又太粗暴。这里就用到了sighup功能。只要将文件mv到新名字,然后用killall -s SIGHUP lighttpd,这样lighttpd就会自动重新打开lighttpd.log打印了。
一个新模块没有使用cronlog等日志切分工具,直接打印日志到文件,(使用管道切分日志有风险,被打印程序一旦hang住,lighttpd也就卡住了),但如何切分日志文件就变成了一个问题。mv的话由于不改变inode,还是往同一个文件打。cp代价太大。直接清空日志的话又太粗暴。这里就用到了sighup功能。只要将文件mv到新名字,然后用killall -s SIGHUP lighttpd,这样lighttpd就会自动重新打开lighttpd.log打印了。
项目管理软件--trac安装手记
[| 2012/03/08 01:17]
之前安装了redmine,确实功能多、使用简单,但ror架构实在是吃内存,小vps根本hold不住,于是还是选用python写的trac。丰富的插件使trac只要配置得当,功能还是很强大的。
首先安装setuptools。这个可以用apt或yum安装,也是一个类似于apt的包管理器,是针对python的。安装后可使用easy_install命令
然后配置PYTHONPATH,使用easy_install默认是安装到系统路径下的。需要root权限。不推荐使用这种方式,这样会把文件放到用户不可控的位置,为以后的升级备份带来困难。所以就需要--install-dir参数(使用--prefix参数无效,不知为何),但单纯使用该参数会报指定目录不在PYTHONPATH里。这是easy_install会推荐去看一个网页,我看了下,讲的几个方法都很繁琐,也没什么理由。其实只需要export PYTHONPATH=${PYTHONPATH}:your_dir即可。在.bash_profile里设置一下,避免每次都要手动。
这里建议在.bash_profile里设置一下alias easy_install='easy_install --install-dir=your_dir',这样就不用每次安装时都手动输入一大坨地址了。
设置完后source .bash_profile生效一下。
然后开始安装,先执行:easy_install Babel==0.9.5 这个一定要装,否则安装后的trac没有中文。
然后easy_install Trac
ok,trac的安装就完成了。
现在需要建立项目,trac需要为每个项目建立一个实例。这时在your_dir里找到trac-admin,这个是用来管理项目实例的工具。
运行:trac-admin your_proj_dir initenv
会提示项目名和使用的数据源。
在数据源那里我使用官方推荐的:mysql://name:password@localhost:3306/test报错:trac TypeError: unsupported operand type(s) for /: 'int' and 'NoneType' 看了下代码,是数据库没有配成utf8字符集导致的。配了一下,ok了
建立数据库时要使用:CREATE DATABASE IF NOT EXISTS test default charset utf8 COLLATE utf8_general_ci;
建好项目后就可以登陆进行进一步设置了。
首先配置用户具有admin权限:
trac-admin your_proj_dir permission add user TRAC_ADMIN
然后指定使用web auth进行用户验证:
./tracd --port 8000 --auth="*,/your_dir/user.htdigest,trac" /your_dir
user.htdigest文件是用户名密码文件,需要自己生成,比较麻烦,反正也是临时使用,这里贴个成品:
user:trac:fb05f80adf782a74f48a5acdc71dba65
这个的文件名和密码分别是“user”,“password”
启动后进入控制台
进入管理,插件,开启TracAccountManager 0.3.2
修改trac.ini,
[components]下添加trac.web.auth.loginmodule = disabled
然后在account配置里SessionStore选一个1,(为啥不知道),但不开这个就不能注册
然后手动添加管理员账户
然后可以用./tracd --port 8000 /your_dir 启动了。
用permission add给刚才添加的用户加上管理员权限。然后ok了。可以使用web登陆了
然后添加git支持:
easy_install http://github.com/hvr/trac-git-plugin/tarball/master
暂时没找到支持远程git的方法
首先安装setuptools。这个可以用apt或yum安装,也是一个类似于apt的包管理器,是针对python的。安装后可使用easy_install命令
然后配置PYTHONPATH,使用easy_install默认是安装到系统路径下的。需要root权限。不推荐使用这种方式,这样会把文件放到用户不可控的位置,为以后的升级备份带来困难。所以就需要--install-dir参数(使用--prefix参数无效,不知为何),但单纯使用该参数会报指定目录不在PYTHONPATH里。这是easy_install会推荐去看一个网页,我看了下,讲的几个方法都很繁琐,也没什么理由。其实只需要export PYTHONPATH=${PYTHONPATH}:your_dir即可。在.bash_profile里设置一下,避免每次都要手动。
这里建议在.bash_profile里设置一下alias easy_install='easy_install --install-dir=your_dir',这样就不用每次安装时都手动输入一大坨地址了。
设置完后source .bash_profile生效一下。
然后开始安装,先执行:easy_install Babel==0.9.5 这个一定要装,否则安装后的trac没有中文。
然后easy_install Trac
ok,trac的安装就完成了。
现在需要建立项目,trac需要为每个项目建立一个实例。这时在your_dir里找到trac-admin,这个是用来管理项目实例的工具。
运行:trac-admin your_proj_dir initenv
会提示项目名和使用的数据源。
在数据源那里我使用官方推荐的:mysql://name:password@localhost:3306/test报错:trac TypeError: unsupported operand type(s) for /: 'int' and 'NoneType' 看了下代码,是数据库没有配成utf8字符集导致的。配了一下,ok了
建立数据库时要使用:CREATE DATABASE IF NOT EXISTS test default charset utf8 COLLATE utf8_general_ci;
建好项目后就可以登陆进行进一步设置了。
首先配置用户具有admin权限:
trac-admin your_proj_dir permission add user TRAC_ADMIN
然后指定使用web auth进行用户验证:
./tracd --port 8000 --auth="*,/your_dir/user.htdigest,trac" /your_dir
user.htdigest文件是用户名密码文件,需要自己生成,比较麻烦,反正也是临时使用,这里贴个成品:
user:trac:fb05f80adf782a74f48a5acdc71dba65
这个的文件名和密码分别是“user”,“password”
启动后进入控制台
进入管理,插件,开启TracAccountManager 0.3.2
修改trac.ini,
[components]下添加trac.web.auth.loginmodule = disabled
然后在account配置里SessionStore选一个1,(为啥不知道),但不开这个就不能注册
然后手动添加管理员账户
然后可以用./tracd --port 8000 /your_dir 启动了。
用permission add给刚才添加的用户加上管理员权限。然后ok了。可以使用web登陆了
然后添加git支持:
easy_install http://github.com/hvr/trac-git-plugin/tarball/master
暂时没找到支持远程git的方法
一个unsigned int(size_t)的坑
[| 2012/03/07 22:24]
前几天把一个函数的返回值由int改为size_t了。当时心想就是改个类型的问题,逻辑没啥要动的。反正都是算数。
编译器什么也没报。似乎没什么问题。
后来凑巧又改了一下另外一个程序的相同函数,结果编译的时候报了error,说试图转换-1到unsigned。一检查,果然程序中的异常分支返回了-1.急忙改了过来。
所以在返回值是size_t类型的函数中,异常处理要注意。(主要是c程序,因为没有异常)
编译器什么也没报。似乎没什么问题。
后来凑巧又改了一下另外一个程序的相同函数,结果编译的时候报了error,说试图转换-1到unsigned。一检查,果然程序中的异常分支返回了-1.急忙改了过来。
所以在返回值是size_t类型的函数中,异常处理要注意。(主要是c程序,因为没有异常)
为nginx生成自签名ssl证书
[| 2012/03/03 00:00]
今天要搭一个ssl加密的站点,由于是自用,所以就准备自签发一张证书。之前搞过几次,比较复杂,早忘光了。找到一篇不错的文章,留下备份。
http://blog.duyao.de/posts/to-generate-an-ssl-certificate-for-nginx-in-linux.html
这里说下Linux 系统怎么通过openssl命令生成 证书。
首先执行如下命令生成一个key
openssl genrsa -des3 -out ssl.key 1024
然后他会要求你输入这个key文件的密码。不推荐输入。因为以后要给nginx使用。每次reload nginx配置时候都要你验证这个PAM密码的。
由于生成时候必须输入密码。你可以输入后 再删掉。
mv ssl.key xxx.key
openssl rsa -in xxx.key -out ssl.key
rm xxx.key
然后根据这个key文件生成证书请求文件
openssl req -new -key ssl.key -out ssl.csr
以上命令生成时候要填很多东西 一个个看着写吧(可以随便,毕竟这是自己生成的证书)
最后根据这2个文件生成crt证书文件
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
这里365是证书有效期 推荐3650哈哈。这个大家随意。最后使用到的文件是key和crt文件。
如果需要用pfx 可以用以下命令生成
openssl pkcs12 -export -inkey ssl.key -in ssl.crt -out ssl.pfx
在需要使用证书的nginx配置文件的server节点里加入以下配置就可以了。
ssl on;
ssl_certificate /home/ssl.crt;
ssl_certificate_key /home/ssl.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
然后重启nginx就大功告成了
http://blog.duyao.de/posts/to-generate-an-ssl-certificate-for-nginx-in-linux.html
这里说下Linux 系统怎么通过openssl命令生成 证书。
首先执行如下命令生成一个key
openssl genrsa -des3 -out ssl.key 1024
然后他会要求你输入这个key文件的密码。不推荐输入。因为以后要给nginx使用。每次reload nginx配置时候都要你验证这个PAM密码的。
由于生成时候必须输入密码。你可以输入后 再删掉。
mv ssl.key xxx.key
openssl rsa -in xxx.key -out ssl.key
rm xxx.key
然后根据这个key文件生成证书请求文件
openssl req -new -key ssl.key -out ssl.csr
以上命令生成时候要填很多东西 一个个看着写吧(可以随便,毕竟这是自己生成的证书)
最后根据这2个文件生成crt证书文件
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
这里365是证书有效期 推荐3650哈哈。这个大家随意。最后使用到的文件是key和crt文件。
如果需要用pfx 可以用以下命令生成
openssl pkcs12 -export -inkey ssl.key -in ssl.crt -out ssl.pfx
在需要使用证书的nginx配置文件的server节点里加入以下配置就可以了。
ssl on;
ssl_certificate /home/ssl.crt;
ssl_certificate_key /home/ssl.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
然后重启nginx就大功告成了