Posts for the month of 三月 2013

nginx 反向代理功能介绍及在Windows下使用的Portable版本

想做一个公网访问内网的反向代理,但是在公网机器上的 Apache 怎么也安装不上(那个机器已经安装了两个 Apache,不知道是不是这方面的原因),于是就研究了一下如何使用 nginx 来实现反向代理。

搜索了一下资料,发现 nginx 似乎比 Apache 更好用,包括:

  • 配置的方式类似 json,比较容易阅读;
  • 运行简单,Windows 平台上的二进制文件本身就是解压即可运行,够 “Portable”;
  • 在网上找到了使用 Windows Service Wrapper 将 nginx 转为一个 Windows 服务的方法,经试验简单有效,见 Nginx Windows Service

nginx 自然在其 官网下载,本文使用的是 Stable version, nginx/Windows-1.2.7;

winsw(Windows Service Wrapper)原来 host 在 https://kenai.com/,不过Oracle 收购 Sun 之后这个网站似乎受到一些影响,目前已经转到了 github 上: https://github.com/kohsuke/winsw/ (是用 C# 编写的,呵呵), 其二进制文件可以在 Nginx Windows Service 文中提到的地点 http://download.java.net/maven/2/com/sun/winsw/winsw/ 下载(似乎是一个 maven 的仓库?);

本文附件中的 “PortableNgnix” 只是简单的将解压后的 nginx Windows 程序和 winsw 合并在一起而已,其中包含一个简单的 proxy 写法示例(将 http://localhost/main/browser/AdminShells/ 反向代理连接到 http://thinkbase.net/main/browser/AdminShells/ ):

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    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;

    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location /main/browser/AdminShells/ {
                proxy_pass              http://thinkbase.net/main/browser/AdminShells/;
                proxy_redirect          off;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

其实很多时候还有更简单的写法,比如下面这个反向代理 svn 服务器的例子:

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    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;

    keepalive_timeout  65;

    server {
        listen       81;
        server_name  localhost;

        location / {
                proxy_pass              http://192.168.0.77:8080/;
                proxy_redirect          off;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

使用 winsw 创建 Windows Service 的过程也很简单,附件 PortableNginx.7z 中的例子是假设 nginx 解压后在 D:\PortableNginx 目录下的情况:

<service>
    <id>nginx-reverse-proxy</id>
    <name>nginx reverse proxy</name>
    <description>nginx reverse proxy</description>
    <executable>D:\PortableNginx\nginx\nginx.exe</executable>
    <logpath>D:\PortableNginx\nginx\logs</logpath>
    <logmode>roll</logmode>
    <depend></depend>
    <startargument>-p D:\PortableNginx\nginx -c D:\PortableNginx\nginx\proxy.conf</startargument>
    <stopargument>-p D:\PortableNginx\nginx -s stop</stopargument>
</service>

更多细节可以继续研究附件(参见其中的 readme.txt),或者把附件解压后自己体验,下面是 winsw 产生的 Windows Servicce 以及 Service 运行时产生的相关文件截图,供参考: .

Windows: 定义以较短时间间隔重复运行的计划任务

增强Windows计划任务执行用户的安全性 里面提到了如何增强计划任务的安全性, 其实计划任务中存在很多灵活应用的地方, 比如如何让一个任务以较短的时间间隔重复运行, 比如一个每小时执行一次的任务, 呆板地为每次运行设置一个日程安排条目(那么就有12个日程安排, 如果是每隔5分钟运行一次呢?!!!)显然不是最好的方案.

附图是在 Windows Server 2008(Win7、Win8 的计划任务设置界面也是这样的)中设置每5分钟执行一次的任务时的触发器定义, 供参考.

附加说明:截图中的"1430分钟"是这样计算的:1430/60 = 23.83 小时 = 23 小时 50 分钟.

在 Trac 中集成 Git 版本库

按照 [TracGit] 的说明, 把现有的几个 Github 上的 Git Repositories( https://github.com/thinkbase )集成到 thinkbase.net.

主要操作记录如下:

  1. 将 Git 引入运行环境. git.exe 来自 Git for Windows, 具体的安装版本是 Git-1.8.1.2-preview20130201.exe, 安装后只需要保留 bin 目录即可.
  2. 修改 trac.ini 及 增加版本库:
    • 按照 [TracGit] 的说明, 在 trac.ini[components] 小节增加:
      tracopt.versioncontrol.git.* = enabled
      
    • 在 Trac 的 管理: 版本库 中添加版本库:
    • 注意, 在添加版本库时, Trac 会提醒需要执行 trac-admin $ENV repository resync ... 命令(参见上图的提示), 经过实际检验, 这些命令并不是必须的, 可以通过设置 [trac] 小节的 repository_sync_per_request 属性来自动同步源代码库(可能对性能有一定的影响), 例如:
      repository_sync_per_request = PortableTrac, dev-thinkbase.net, trac-thinkbase.net
      
    • 详细的修改参见 97b08e...