做这个的初衷很简单:IRC 对小白太远了。
它不像论坛,打开网页就能刷; 不像 QQ/Gtalk,软件是人都能找到,装上就能上。它需要专用客户端(比如 konversation),而且装完你还不能上,还有一堆命令等着你,何况还有 20 年早期互联网流传下来的各种名词、礼仪。总之它是一整个与世隔绝的黑客生态圈。
但是吧,不学还不行,你看哪个开发者不会使用 IRC 的?于是我想先降低一下它对小白们的陌生感,做一个给蠢人用的玩意。(成功把自己从其它蠢人中分离开以示区别哦耶!)
于是最蠢的来了:qwebirc,是一个自由开源的网页 IRC 客户端,最早是给 QuakeNet 游戏网开发的。这是目前我能找到的唯一一个开源的。
看了下,发现它居然不支持多语言!好吧,硬 hack 出了一个繁体中文版(别问为什么不用简体,因为硬 hack 就是只能使用一种语言,没有动态切换,那简体用户繁体一样能看懂,自豪吧?)。
安装依赖(openSUSE 下)
sudo zypper in nginx python-Twisted python-simplejson java-1_7_0-openjdk
下载
然后随便找个文件夹,因为 qwebirc 和 HTTP 服务器的关系不是常规那样的,常规是在 /srv/www/htdocs(又叫 webroot)下面放一些 html/php 文件,然后 HTTP 服务器让那个文件夹下面的东西能被访问,但是 qwebirc 其实是自己跑起来了一个专用的 http 服务器,为什么呢?据说是通用 HTTP 服务器设计不是用来服务大量的、长期活动的连接的,它们可以处理的是大量的但是都是一次性的连接,这种基于线程或者多进程的服务器(Apache 被点名了)没办法处理太多的这种连接,到时候会把你的网站一起拽下线呦!
但 qwebirc 的专用服务器是开在 9090 端口的,你不想访问 yourircserver.com:9090 这种丑丑的链接吧?所以你需要一个反向代理,还不能用被怒黑的 Apache。。。也就 nginx 了吧?好在我们别的服务器也是用的 nginx,因为 openSUSE 社区穷 VPS 内存小。。。
言归正传。找到文件夹了吧?然后在命令行下载最新的稳定版 qwebirc:
wget http://qwebirc.org/download-stable-zip
它没后缀但它是个 zip,解压:
unzip download-stable-zip
进入文件夹:
cd qwebirc-qwebirc-516de557ddc7
配置
把 config.py.example 复制为 config.py:
cp -r config.py.example config.py
打开
vi config.py
要改的我都写好:
连接到的服务器:
IRCSERVER, IRCPORT = "chat.freenode.net", 6667
因为我们是网页客户端不是网页服务器端,我们要连一个服务器的…
REALNAME:
REALNAME = "http://irc.suse.org.cn/"
你要提供服务的那个网址
BASE_URL:
BASE_URL = "http://irc.suse.org.cn/"
同上
NETWORK_NAME = “openSUSE 中文”
你的客户端显示给客户看的「你叫什么名」字段。这里需要注意,如果你要用中文,要在这个页面的最上面加上这两行:
#!/usr/bin/python
# -*- coding: utf-8 -*-
因为它用 python2 写的,默认是英文编码…
Nginx 相关配置:
FORWARDED_FOR_HEADER="x-forwarded-for"
FORWARDED_FOR_IPS=["127.0.0.1"]
ARGS = "-i 127.0.0.1 -p 9090"
简单说就是在你 VPS 上的 127.0.0.1:9090 开一个网页 IRC,然后 Nginx 后面干的事就是把对你的某个网址比如 irc.suse.org.cn 的访问全中转给 127.0.0.1:9090 上。我不太懂,但听起来像是挺安全的,因为我觉得 127.0.0.1 只有登录到那台 VPS 才能用的嘛。
当然你也可以试试把前两个的 # 号继续留着,然后直接:
ARGS = "-i 你的公网 IP -p 80"
没试验哦,估计这样就能直接开在你的 80 端口了,也不用 nginx 了。但这样做最大的问题就是你的那个公网 IP 也只能做网页 IRC 了。因为不管你怎么做域名解析,通过浏览器过来的都默认跑 80 端口就来到这里了,如果别的还用(我不懂网络那些哦),可能就会出现我前面 nginx 重定向配置错误时的情况,时而打开网页 IRC,时而打开你别的网站…
而用 nginx 做反向代理的话,那个 IP 还可以干别的。(我说的是 IP 不是域名哦,你不可能 irc.suse.org.cn 又当 wordpress 博客又当网页 IRC 的)
剩下的配置就留默认就好
编译和启动
这里其实我有点不能理解,它编译应该是把 *.py 编译为 *.pyc/pyo 才对,但事实上,你在 javascript 里面的硬翻译,也是由编译来管的…我刚开始先架设了一个英文的,然后本地翻译完,上传,我想 js 应该刷新网页就好了吧,结果不行…debug 了好久,后来在官网 Installation 指南看到
Run compile.py to "compile the HTML/js/css"
整个人都呆掉了…
开始编译:
./compile.py
把它跑起来:
./run.py
它写的就比较有节操,自己会 fork 自己到后台,不像我之前写的那些 openshift 跑 python 的教程里面的脚本都要使用 nohup 来跑…
qwebirc 就配置好了。
Nginx 反向代理
cd /etc/nginx
你是直接编辑 /etc/nginx/nginx.conf 还是建一个 /etc/nginx/vhosts.d/irc.suse.org.cn.conf 我管不着,反正里面是像这样的:
server {
listen 80;
listen [::]:80;
server_name webchat.domain.tld;
access_log /var/log/qwebirc.access.log;
error_log /var/log/qwebirc.error.log;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
location / {
proxy_pass http://127.0.0.1:9090;
}
}
它和 Nginx Wiki 上说的那个配置的唯一不同之处在于:
listen 80;
listen [::]:80;
Wiki 上用的是:
listen 127.0.0.1:80;
listen [::1]:80;
导致我在不明白其原理的时候狂刷 irc.suse.org.cn。。。。
后来才反应过来:Wiki 的教学的场景是说,你在本机(127.0.0.1)跑起来了一个 qwebirc,然后嫌用 127.0.0.1:9090 访问它比较的麻烦,于是做下反向代理让 127.0.0.1 可以直接访问到它。
但我们的场景是说,我在本机(127.0.0.1)跑起来了一个 qwebirc,然后想用 http://irc.suse.org.cn 直接访问它!127.0.0.1:9090 和我没一毛钱关系,因为我没在服务器上登录装图形界面开网页浏览器…
我们要让 Nginx 去监听对 irc.suse.org.cn 的 80 端口访问,然后把它扔给 VPS 上的 127.0.0.1:9090。。。所以直接监听 server_name 的 80 端口就好了嘛…
这个错误很难反应过来,尤其对我这种水货 SA!Nginx 还会正常跑,但你在 VPS 外面是访问不到它的:
qwebirc 提供的服务在 127.0.0.1 不是你的公网 IP,所以你用 xxx.xxx.xxx.xxx:9090 根本打不开…甚至 Nginx 也不知道你在干啥,因为别的配置是没有用 9090 端口的,连 Fallback 这种安慰奖都没有…
nginx 监听着你的内!网!IP!你访问 irc.suse.org.cn,是有这个配置,但是它找了一圈发现没有跟 irc.suse.org.cn: 有关的事啊,这个配置在管 127.0.0.1 呢…
还有注意:proxy_pass http://127.0.0.1:9090; 这个不要手贱把 127.0.0.1 改成 irc.suse.org.cn 了。。。因为那个域名的 A 记录是你的公网 IP,而 qwebirc 并没有对公网提供服务…血泪的教训!
接着重启下 Nginx 服务器:
sudo systemctl restart nginx.service
就 OK 了!
PS:终于有个顺手的 IRC 去调戏 #kde-cn 的 BadGirl 了…