Untitled Post - 110
设计模式说到底就是迂回吧。
设计模式说到底就是迂回吧。
markdown的精髓是内容和表现形式的分离,让写作者更专注于内容而不受或少受展现格式的影响。
测试ssl/tls连接:js$ openssl s_client -connect host:port
egg之于python正如jar之于java
发现一个不错的git托管开源程序Gogs,go语言开发的,据说比gitlab还好用,真的吗?
为了实现动态web,我们发展出了各式各样的技术,那真是五花八门,乱花渐欲迷人眼。
各种网关接口协议,从最古老的CGI(Common Gateway Interface)到SCGI(Simple Common Gateway Interface),FastCGI,WSGI(Python Web Server Gateway Interface),PSGI(Perl Web Server Gateway Interface),rack,WSAPI(Lua Web Server API),甚至还出现了JWSGI(Java Web Server Gateway Interface)等,当然还有HTTP协议。这些协议大部分已经标准化,还有许许多多的私有协议。只有协议是不够的,所以又有了对协议的各种各样的实现,比如php-fpm,spawn-fcgi,fcgiwrap,uWSGI等
web server也通过很多内置的模块来直接实现对动态web支持,比如mod_perl,mod_python,mod_php,mod_lua等。
传统的web server,比如apache,nginx等,自身处理静态资源请求,然后将动态资源请求通过内置模块或者支持相关网关协议的application server转发到相应的应用程序来处理。当然也有tomcat此类的应用服务器,可以通过http来与传统的web服务器进行集成,甚至自身完全担当起application server和web server两种角色。有很多web框架自己也提供了http服务器。但一般来讲传统的web server除了处理静态资源性能上的优势,还有其他很多丰富的功能,比如访问控制,反向代理,负载均衡等等。
为什么会有这么多的协议,这么多的模块?应该讲主要还是性能方面的考量,动态web从无到有,从小规模到大规模,还要面对各种各样的后端开发技术,有这么多的协议和模块也是无可避免的。
一般来讲,部署一个动态应用可以有多种不同的选择。比如部署php应用可以使用php-fpm,也可以使用mod_php,甚至也可以使用其他的FCGI服务器,只要FCGI服务器实现了对PHP的支持即可。
uWSGI是个什么东东?
uWSGI是一个应用服务器,支持几乎所有现有的网关接口协议,同时自己也实现了另一个网关接口协议,叫做uwsgi。这么多接口了,为什么再造一个?据说还是性能,据说uwsgi比fastcgi和wsgi都快的多。
且不论uWSGI的性能有多高,只是能支持几乎所有的网关接口协议就已经很不错了。nginx已经内置支持uWSGI,这样nginx + uWSGI这种组合可以应对各种各样的后端应用,部署和管理起来都方便的多。
nginx不支持CGI,只能通过FastCGI来调用CGI程序。
References:
[1]uWSGI
[2]Running (almost) anything on Nginx with uWSGI
===
[erq]
ext4文件系统的时间戳精度达到了nanosecond,而之前的ext2和ext3文件系统的时间戳精度只有second。
简介(intro)
Trac is an enhanced wiki and issue tracking system for software development projects.
Trac是成熟的软件开发项目管理自由软件,支持wiki,问题跟踪,里程碑,版本控制工具集成等特性。
先决条件(prerequisites)
不使用源里的包安装,使用pip安装最新的stable,所以需要先安装python-dev
1 | # apt-get install python-dev |
安装uWGSI
1 | $ apt-get install uwsgi uwsgi-plugin-python |
安装(install)
1 | # pip \[--proxy http://ip:port\] install babel pygments trac psycopg2 |
如果需要使用代理,指定–proxy参数
babel用于国际化,pygments用于语法高亮,由于使用PostgresQL数据库,所以要安装psycopg2
创建数据库角色和数据库
创建角色
1 | $ createuser -U postgres -h localhost --createdb trac_db_admin |
or
1 | $ sudo su - postgres |
or
1 | postgres=# CREATE ROLE trac_db_admin CREATEDB LOGIN PASSWORD 'passwd'; |
创建数据库
1 | $ createdb --host=localhost --username=trac_db_admin --owner=trac_db_admin --encoding=UTF8 trac_db |
or
1 | $ psql -U trac_db_admin -h localhost |
升级setuptools
1 | $ wget https://bootstrap.pypa.io/ez_setup.py -O - sudo python |
创建trac项目/环境
1 | # trac-admin /var/trac/projects/proj_name initenv |
提示输入数据库连接串时这样输入:
1 | postgres://trac_db_admin:admin@localhost/trac_db |
也可以用unix socket方式,具体看官方文档。
WSGI方式部署trac到nginx
生成uWSGI入口程序/var/trac/cgi-bin/trac.wsgi文件
1 | # trac-admin /var/trac/projects/proj_name deploy /var/trac |
修改trac.wsgi支持多项目,去掉trac.env_path环境变量,添加trac.env_parent_dir变量为多个项目所在路径的父路径。
1 | environ.setdefault('trac.env_parent_dir', '/var/trac/projects') |
配置uWSGI应用trac,配置文件/etc/uwsgi/apps-enabled/trac.ini
1 | \[uwsgi\] |
配置nginx,配置文件/etc/nginx/sites-enabled/trac.xxx.com.conf
1 | server { |
uWSGI应用生成的unix socket文件为/run/uwsgi/app/{$app_name}/socket,$app_name即是配置文件/etc/uwsgi/apps-enabled/trac.ini配置文件的basename,不包含扩展名。
用户管理插件
不是用trac内置的用户管理模块,安装AccountManagerPlugin插件
1 | # easy_install https://trac-hacks.org/svn/accountmanagerplugin/tags/acct_mgr-0.4.4 |
配置文件/var/trac/projects/proj_name/conf/trac.ini添加:
1 | \[account-manager\] |
插件官方文档中配置了acct_mgr.pwhash.* = disabled,会导致以下错误:
1 | Cannot find an implementation of the IPasswordHashMethod interface named HtDigestHashMethod. Please check that the Component is enabled or update the option \[account-manager\] hash_method in trac.ini. |
注册第一个用户,然后将第一个用户设置为管理员:
1 | # trac-admin /var/trac/projects/proj_name permission add firstusername TRAC_ADMIN |
git集成
配置文件/var/trac/projects/proj_name/conf/trac.ini添加:
1 | \[components\] |
uWSGI是以用户www-data运行的,www-data用户必须拥有读git仓库的权限,否则可能会提示:
1 | Warning: Can't synchronize with repository "(default)" (/home/git/repositories/reis.git does not appear to be a Git repository.). Look in the Trac log for more information. |
如果无法浏览代码,且log文件中有如下错误字样:
1 | Trac\[PyGIT\] DEBUG: git exits with 128, dir: u'/path/to/xxx.git/', args: branch -> ('-v', '--no-abbrev'), stderr: 'fatal: Failed to resolve HEAD as a valid ref.\\n' |
则仍然应该是权限的问题,运行trac的用户无法读取一些文件,可以将git仓库对other用户开发rx权限,或者更改仓库文件的组为www-data并适当授权。
gitolite集成
可以使用插件trac-GitolitePlugin集成trac和gitolite
日志
日志设置见Trac Logging
安装结束
References:
[1]The Trac User and Administration Guide
[2]Trac 1.0.1 in Ubuntu 14.04 with Basic Authentication (Nginx + uWSGI)
[3]installs Trac with uWSGI and Nginx in gentoo/funtoo
[4]Nginx8.x+uWSGI驱动 Trac
[5]Account Manager Plugin to manage user accounts
===
[erq]
Cassandra is a row-oriented database.