参考文章:http://www.jrrzz.net/2010/01/10/multi-host-trac-using-nginx/
我觉得多实例运行的关键点在于对 fastcgi中的script_name和path_info的理解
script_name是脚本名称,我们可以理解成应用的一个入口
path_name是传给这个入口的一个参数,是一个路径
比如在php中
http://www.test.com/index.php/foo/bar.html?c=index&m=search
这里的/index.php为script_name
/foo/bar.html为path_info
再后面的就为query_string鸟
在我们这里如果我们想这样运行多实例
http://xxx.com/trac/instance1/wiki
http://xxx.com/trac/instance2/wiki
就是使用这样的方式在运行instance1和instance2这两个trac的项目实例
那么我们就得设置/trac/instancex(x为可变的部分)为script_name
而后面的为path_info
比如这里的/wiki即为path_info
理解这点我们不难理解下面的配置文件了.
这里很欣赏nginx的配置文件的语法,弄的和脚本语言似的,有正则,有判断,有赋值
PS:为了彻底弄清楚fastcgi_split_path_info这个指令的工作原理,还去看了下nginx的源码,还好有c语言的功底.
这个没有文档的东东还真不容易找一些想知道的东西,除了看源码.
--------------------------------------------
MD 为了了解NGINX 中fastcgi_split_path_info这个指令的具体作用, 我读进了Nginx的源码src›http›modules›ngx_http_fastcgi_module.c 回复 回推 New Retweet 收藏 from Echofon2010-04-16 09:37:16
nginx fastcgi模块源码阅读:ngx_http_fastcgi_split_path_info(对应fastcgi_split_path_info 指令)这个函数将path的正则准备好到相应的结构体中 回复 回推 New Retweet 收藏 from Echofon2010-04-16 09:50:26
然后ngx_int_t ngx_http_fastcgi_path_info_variable和 ngx_http_fastcgi_script_name_variable这两个函数会解析正则并找依次取得两个group的值分别到 script_name和path_info中 回复 回推 New Retweet 收藏 from Echofon2010-04-16 09:51:47
----------------------------------------------------
下面是nginx的配置文件
user admin; worker_processes 5; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location ~ ^/trac/([0-9a-zA-Z\-]*)/chrome(.*)$ { alias /home/admin/trac/$1/htdocs$2; } fastcgi_split_path_info ^(/trac/[0-9a-zA-Z\-_]*[/]*)(.*)$; location ~ /htdocs/(.*){ root /home/admin/trac; } if ($uri ~ ^/trac/([0-9a-zA-Z\-_]*).*$) { set $trac_host $1; } location ~ ^/trac/([0-9a-zA-Z\-]*)/login { auth_basic "trac"; auth_basic_user_file /home/admin/etc/trac_$trac_host.htpasswd; fastcgi_pass unix:/home/admin/run/trac_fastcgi_$trac_host.sock; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param SERVER_NAME $server_name; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param QUERY_STRING $query_string; fastcgi_param REMOTE_USER $remote_user; fastcgi_param AUTH_USER $remote_user; fastcgi_param SCRIPT_NAME /trac/$trac_host; fastcgi_param PATH_INFO /$fastcgi_path_info; fastcgi_param REMOTE_ADDR $remote_addr; } location ~ ^/trac { auth_basic "trac"; fastcgi_pass unix:/home/admin/run/trac_fastcgi_$trac_host.sock; fastcgi_param SCRIPT_NAME /trac/$trac_host; fastcgi_param PATH_INFO /$fastcgi_path_info; ## WSGI NEEDED VARIABLES - trac warns about them fastcgi_param REQUEST_METHOD $request_method; fastcgi_param SERVER_NAME $server_name; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param QUERY_STRING $query_string; fastcgi_param REMOTE_USER $remote_user; fastcgi_param AUTH_USER $remote_user; fastcgi_param REMOTE_ADDR $remote_addr; #root html; #index index.html index.htm; } location = / { index index.html } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443; # server_name localhost; # ssl on; # ssl_certificate cert.pem; # ssl_certificate_key cert.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; # location / { # root html; # index index.html index.htm; # } #} }