0%

markdown的精髓是内容和表现形式的分离,让写作者更专注于内容而不受或少受展现格式的影响。

发现一个不错的git托管开源程序Gogs,go语言开发的,据说比gitlab还好用,真的吗?

setuid与setgid使可执行二进制文件(不包括脚本)无论用哪个用户执行都具有文件属主或属组的权限。
比如一个文件的属主为root,如果设置了setuid位,则一个非特权用户执行此程序时就可以以root的身份运行此程序,可以访问到非特权用户访问不到的用户资源。setgid与此同。

setuid

1
# chmod u+s binary 

setgid

1
# chmod g+s binary

===
[erq]

为了实现动态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
2
$ sudo su - postgres
postgres@xxx:~$ createuser --pwprompt --createdb trac_db_admin

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
2
$ psql -U trac_db_admin -h localhost
sql>create database trac_db;

升级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
2
3
4
5
6
\[uwsgi\]
plugins = python
;socket = 127.0.0.1:3000
wsgi-file = /var/trac/cgi-bin/trac.wsgi
processes = 2
stats = 127.0.0.1:3001

配置nginx,配置文件/etc/nginx/sites-enabled/trac.xxx.com.conf

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name trac.xxx.com ;
access_log /var/log/nginx/trac_xxx_com_access.log;
error_log /var/log/nginx/trac_xxx_com_error.log;

location / {
include uwsgi_params;
#uwsgi_pass 127.0.0.1:3000;
uwsgi_pass unix:///run/uwsgi/app/trac/socket;
}
}

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
\[account-manager\]
htpasswd_file = /var/trac/trac.htpasswd
htpasswd_hash_type = md5
;hash_method = md5
password_store = HtPasswdStore
reset_password = false

\[components\]
acct_mgr.admin.* = enabled
acct_mgr.api.* = enabled
acct_mgr.db.sessionstore = disabled
acct_mgr.htfile.htdigeststore = disabled
acct_mgr.htfile.htpasswdstore = enabled
acct_mgr.pwhash.* = enabled
acct_mgr.pwhash.htpasswdhashmethod = enabled
acct_mgr.http.* = disabled
acct_mgr.notification.* = enabled
acct_mgr.register.* = enabled
acct_mgr.svnserve.svnservepasswordstore = disabled
acct_mgr.web_ui.* = enabled
acct_mgr.web_ui.resetpwstore = disabled
trac.web.auth.loginmodule = disabled

插件官方文档中配置了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
2
3
4
5
6
7
8
\[components\]
; git
tracopt.versioncontrol.git.* = enabled

\[trac\]
repository_dir = /home/git/repositories/xxx.git/
repository_sync_per_request = (default)
repository_type = git

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]