Quantcast
Channel: 看得透又看得远者prevail.ppt.cc/flUmLx ppt.cc/fqtgqx ppt.cc/fZsXUx ppt.cc/fhWnZx ppt.cc/fnrkVx ppt.cc/f2CBVx
Viewing all 20465 articles
Browse latest View live

美国瞄准习近平的个人独裁

$
0
0
美国与中国双边关系的交恶与习近平建立的个人独裁做法密不可分
习近平是公认的毛泽东继承者,毛泽东是中国极权制度加个人独裁的建立者,正因为毛泽东的个人决断,1950年参加韩战,与西方文明体系绝缘,国内政策给国家和人民带来一个接一个巨大的灾难,使得中共建政的前30年沦为世界上最贫穷落后的国家之一。即便如此,毛泽东在1972年,在内外交困之下扭转了外交政策,邀请美国总统尼克逊和国务卿基辛格访华,打开了封闭的大门,开辟了和美国建交之路。
建立邦交的40年,中美关系始终是中国外交的第一关系,邓小平与卡特、赵紫阳与列根、江泽民与克林顿,胡锦涛在南草坪被小布殊拉了一把的合影,成为外交史的经典,其意义远远超过周恩来周游列国。进入21世纪,也是美国将中国拉入WTO。诚如彭斯所说,中国变成世界第二大经济体,很大程度上得益于美国对中国的投资。中共使用了与自由公平贸易不符的一系列政策,包括关税、货币操纵、强制技术转移等,“这些政策建立了中国制造业的基本,而以竞争对手特别是美国的利益为代价”可以说,“以美国的利益为代价”让习近平做起“两个一百年”的中国梦,成就了他“定于一尊”的野心

独裁者因为权力不受制约,依附的是人类最坏的制度,往往是世界正常秩序的破坏者和战争发动者,对人类文明和安全造成巨大破坏的教训极为深刻,尤以纳粹历史和苏联铁幕为甚。

利用TinyProxy,给terminal设置代理

$
0
0
为了解决国内的各种网络问题,真的是费劲了脑汁(例如 wget git……)

您需要
一台墙外服务器

如何安装?
# Ubuntu
apt-get update
apt-get install tinyproxy -y

# CentOS
yum install tinyproxy -y

您需要调味料.
编辑 /etc/tinyproxy.conf
也可能是 /etc/tinyproxy/tinyproxy.conf
不同的系统,文件目录存在差异.
Port 10086
MaxClients 100
Allow 127.0.0.1

Port 是 TinyProxy 的监听端口
MaxClients 最大客户端链接数
Allow 是服务器的 IP 限制,请务必将 Allow 127.0.0.1 注释掉.
重启 TinyProxy:
/etc/init.d/tinyproxy restart

使用
您可以使用以下命令,让Shell/console/terminal使用之前搭建好的代理:
export http_proxy=http://vps-ip:10086
export https_proxy=http://vps-ip:10086

10086 为您此前设置的服务器上的TinyProxy 的监听端口。

当然你也可利用squid来做。

GUI You-Get: 下载油管等主流视频网站视频的工具

$
0
0
需要注意的是,如果需要下载国外视频(事实上这玩意就是用来干这个的),请确保你可以正常访问国外网站;如果你使用局部代理,请在 GUI You-Get 里面设置好相应的代理地址。
今天我们就直接来个简单的 – GUI You-Get。
一个基于开源项目 You-Get 和 Youtube-dl的 GUI 程序,已开源至 GitHub
GUI = Graphical User Interface,图形用户界面
下载 以后可能会出现安全报错,不需要理会,直接选择“高级选项”,“仍然运行”即可。
安装过程中一路下一步下一步就好了,没有任何的套路。
使用非常简单,首先在下方选择一个下载引擎(下载Youtube 推荐 Youtube-dl 引擎,其余网站推荐 You-Get 引擎),然后在上方输入视频网址,点击下载。
然后会加载一小会儿(取决于你的网速),然后软件就会显示这个视频的所有分辨率以及对应的大小。选择合适的分辨率,单击就可以开始下载。
下载完以后点击返回,然后选择 “打开目录”。
就可以看到下载的视频。
需要注意的是,如果需要下载国外视频(事实上这玩意就是用来干这个的),请确保你可以正常访问国外网站;如果你使用局部代理,请在 GUI You-Get 里面设置好相应的代理地址。

RAIN-利用VPS建立多用户离线下载服务

$
0
0
简介
功能不多做介绍,类似百度网盘,加种子自动离线,可通过生成的时效 HTTP 连接在本地 nplayer 播放。
帮你充分压榨 VPS 性能,节省电费开销。

demo: http://rain.mengsky.net
服务器资源有限,请勿滥用遵守契约精神,尽量使用真实邮箱+弱密码(暂时存的明文)
目前对内容没有限制,尽量不要下国外组发的电影,还不知道会不会吃 dmca
h5 限制在线预览只支持 mp4,推荐 nplayer
尽量避免使用迅雷下载,推荐 idm 或者旋风取回。

服务搭建相关
client api + internel api:
https://github.com/mengskysama/rain

web client (一个很简陋的前端):
https://github.com/mengskysama/rain-frontend

backend api (仅测试过 ubuntu) 与 deluge 通信,暴露一些 node 相关信息: https://github.com/mengskysama/frog

Tampermonkey脚本: 解除B站视频的地区限制

$
0
0
方法
准备工作
注意:需要先安装Tampermonkey才可以使用!

Firefox浏览器的插件:Greasemonkey
Chrome浏览器的插件:Tampermonkey

下载下来的crx文件可能不能直接安装,需要手动拖到扩展管理界面(一般为chrome://extensions/)中,应该就能安装成功了。

JS脚本安装,
访问这个地址:https://greasyfork.org/zh-CN/scripts/25718-%E8%A7%A3%E9%99%A4b%E7%AB%99%E5%8C%BA%E5%9F%9F%E9%99%90%E5%88%B6

然后直接点安装脚本。
解除B站地区限制

安装脚本是一闪而过,点安装后自动关闭窗口了,一般都是直接安装成功没有任何提示,想卸载脚本就去扩展里删除
解除B站地区限制

检验成果
好了,ctrl+F5刷新页面,点开艾伦就能看啦

更多相关问题解答看这里:
https://greasyfork.org/zh-CN/scripts/25718-%E8%A7%A3%E9%99%A4b%E7%AB%99%E5%8C%BA%E5%9F%9F%E9%99%90%E5%88%B6

Docker-Pan: Filerun + AriaNg + Aria2 实现离线下载及在线播放

$
0
0
建议更换docker镜像为 docker pull taroballs/cloudstorage

docker-pan是一个开箱机用的搭建私有网盘的 docker 镜像,由Filerun+AriaNg+Aria2几部分构成.
Filerun:一款简洁的在线文件管理器,可在线对文件进行:图片预览、播放音乐、播放视频、文本编辑还支持语法高亮。
AriaNg:aria2 web 界面,可离线下载磁力链接、BT 种子等,使用响应式布局,支持各种计算机或移动设备。

Docker Hub: https://hub.docker.com/r/jaegerdocker/pan/

一键安装
运行命令:
docker run –name=pan -ti -p 8081:80 -p 6800:6800 jaegerdocker/pan

或者挂着数据卷,数据券路径:/var/www/html/system/data/default_home_folder
docker run –name=pan -v /data/pan:/var/www/html/system/data/default_home_folder -ti -p 8081:80 -p 6800:6800 jaegerdocker/pan

访问地址:
Filerun:http://yourdomain.com:8081

登陆用户名:superuser
登陆密码:superuser

AriaNg:http://yourdomain.com:8081/dweb

docker run –name=pan -dti -p 8081:80 -p 6800:6800 jaegerdocker/pan

docker 不正常的换这条命令看看,上面的命令没有加-d参数,很多人可能不知道运行完命令后关掉了容器导致无法正常访问。

from https://www.v2ex.com/t/383801#reply64

彭斯的演讲有力命中四大历史谎言

$
0
0
10月4日,美国副总统彭斯发表震撼性演讲,回顾了美中关系历史,表示美中关系曾有着很好的过去,并从意识形态、历史、经济、军事、人权等方面全方位批评中共。

彭斯演讲的真实、真诚,有力命中了中共编织多年、煽动国人对美仇恨的谎言,中共官方紧急封杀彭斯的演讲稿。那彭斯的演讲究竟命中了哪些历史谎言呢?

谎言一:“门户开放”是美国提出的侵略中国的政策

事实一:中国是“门户开放”政策的受益者

彭斯说:“当中国经受‘百年耻辱’之际,美国拒绝加入,并主张‘门户开放’政策,我们能够与中国进行更自由的贸易,并维持他们的主权。”

彭斯提到的“门户开放”政策是怎么回事?

中共官方出版的《中国大百科全书,外国历史》中“门户开放”词条解释说,“门户开放政策是19世纪末美国国务卿J・M・海提出的侵略中国的政策。”

事实上,门户开放政策不仅不是“侵略中国的政策”,恰恰相反,中国是“门户开放”政策的受益者。

120年前,1898年,大清戊戌变法失败,同时美国在对西班牙的美西战争中获胜,成为一个新兴的、工业生产力逼近世界首强英国的国家。

这时美国发现,欧洲列强包括英、法、德、俄四国与日本除了既得利益,已经准备瓜分其余大部分在华利益,美国感到其在华商业利益受到了威胁。

这时美国提出了“门户开放”政策。一个大家需要了解的基本事实是:作为贸易原则的门户开放政策,最初不是针对中国提出的,而是针对俄国、日本以及欧洲列强提出的,不是要求中国开放自己的口岸让美国进行经济侵略,而是要求上述列强遵守中国关税规定,采纳中国统一收费标准。

1899年,美国国务卿海约翰取得英国对门户开放政策的“谅解”,向各列强发布照会,要求保持中国的主权和领土完整,并不会影响在其各自势力范围内的通商口岸。

作为新兴的强国,美国提出的这项政策,列强们不予理睬。于是到了1900年7月,海约翰认为,不反对就是同意,宣布各国原则上同意了这项决定。

“门户开放”政策的第一次提出对列强在中国的掠夺形成了一种制约,让中国收回了在《南京条约》中丧失的关税自主权,保证了中国的关税收入。列强遵守中国规定,相互之间平等待遇的结果,减弱了列强间以强权手段争夺在华利益的可能,确定了中国对外贸易的主动地位,同时也保护了中国的利益和自主权。

1902年,美国政府抗议俄国在义和团运动之后侵犯满洲,违反门户开放政策。1904~1905年,日俄战争爆发,日本获胜,取得以前俄国在满洲的特殊权益,美国随即要求日本作出承诺,维持各列强在满洲的机会平等。在金融上,美国努力维护门户开放政策,成立一个国际财团。中国的铁路贷款通过它实现各国货币之间的兑换。门户开放政策随即第二次提出,避免了中国被日本、俄国以及欧洲列强瓜分再度瓜分。

再后来,门户开放政策在历史进程中从一个单纯的对华贸易政策,演变成了一个国际性政治政策,并在20世纪上半叶维护了中国的领土主权完整。

谎言二:八国联军侵华暴行 美帝参与其中

事实二:八国联军入京,故宫完好。《辛丑条约》,美国斡旋

1900年,义和团开始以“扶清灭洋”为口号,大举进京“勤王”,随后慈禧太后对11国宣战。8月14日,联军来到北京城外,15日,联军逐步攻占北京各城门,当晚,联军已基本占领全城。

1900年10月,清政府派李鸿章到北京,同八国谈判。当时俄国志在另约取得东北;德、法、日、意皆有瓜分中国的想法;但英、美则以商业为重,希望保持在华的贸易利益,对俄国的扩张存有戒心,因此反对各国的领土要求。

在《辛丑条约》的具体谈判过程中,美国此前提出的在华贸易机会均等、保持中国领土和行政完整的问题,被抛诸脑后,无人理睬。

1900年10月17日,光绪帝为了感谢美国施以援手,并敦促美国加大斡旋力度,再次致信美国总统麦金莱:“大清国大皇帝问大亚美理驾和众国大伯理玺天德好。此次中国变起仓猝,遒蒙大伯理玺天德顾念邦交,允为排解,并先撤兵。感佩之忱,曷有既极。用特派四品卿衔出使大臣伍廷芳呈递国电,先伸谢悃。还祈大伯理玺天德保全大局,永敦和好,转商各国,尽捐嫌隙,速定和议。则感荷高谊,益无涯矣。不胜盼切祷切之至。”

接到光绪帝的信,美国政府非常重视。第二天,麦金莱回信光绪皇帝,答应继续斡旋,信中说:“我由衷地表示与陛下抱有共同的愿望:中国同其利益和侨民在贵国遭到严重侵害的各国之间所存在的一切问题均可和平解决,以达到完全消除他们之间一切嫌隙的结果。本政府希望能这样迅速解决,这一点已经为各国所了解。”

1900年10月22日,美国再次向列强发出“门户开放”的正式外交照会,以减少列强对中国的“惩罚”。美国谈判代表在《辛丑条约》谈判的过程中“代表”中国舌战其他七个列强,特别针对“惩凶”和“赔款”两个问题,美国政府为了中国的利益煞费苦心。

谎言三:美国是资本主义 天生是中国的敌人

事实三:美国喜爱中华文明 帮中国创立最早最优秀大学

彭斯说:“当美国传教士带着福音来到中国海岸,他们被古老而充满活力的人民和深厚的文化所吸引。他们不仅传播了信仰,还创立了中国一些最早和最优秀的大学。”

的确如此,比如创办于1919年的燕京大学,是由4所美国和英国的基督教教会,联合在北京开办的大学,也是近代中国规模最大、质量最好、环境最优美的大学之一。

创建于1870年的上海圣约翰大学,由美国圣公会上海主教施约瑟,将原来的两所圣公会学校:培雅书院和恩度书院合并而成。

另外,中国所有的医学院几乎都由外国传教士创建,这其中自然少不了美国。

《辛丑条约》中规定的庚子赔款,美国是11国中最早退还的。

1904年,美国国务卿海约翰告诉清朝驻美公使梁诚,美国得到的赔款过多了。

海约翰和美国一些传教士和教育家支持退还多余赔款,但是不愿意让这笔钱由中国官员任意使用。他们认为,如果美国帮助中国兴办现代教育并让中国学生来美留学,将会造就一批熟知美国价值观并和美国联系密切的人士,也就不会再次爆发“拳乱”了。

1907年12月,美国总统西奥多・罗斯福正式请求国会批准把多余的庚子赔款退还中国,赞助中国教育事业。1908年1月,国会通过决议,批准总统退款,决定把“拳乱赔款”从当时的2400多万美元金币减少为1300多万美元,余额退还中国。

1909年,中国首度利用退还的庚子赔款向美国派出了几十名留学生。1911年(辛亥年),用于培养留美预备生的“清华学堂”在北京成立,这是清华大学的前身。这座学堂设立在原来的王府“清华园”。

就在建立清华学堂的同一年,“辛亥革命”爆发,中华民国取代了满清王朝。民国政府继续按4%的年息向各国支付庚子赔款,而美国继续每年退款给中国,用于教育事业。

1924年,美国政府又宣布第二次退还庚子赔款,把余下的所有赔款全数退还中国。由于当时中国处在战乱时期,没有稳定的中央政权,美国政府委讬由美中两国人士组成的“中华文化教育基金”管理退款。基金会用退还的赔款兴办文教事业,继续培养留学生并资助清华大学,还在1931年建立了当时远东最先进的图书馆之一“国立北平图书新馆”。这是今天的中国国家图书馆古籍分馆的前身。

美国的退款、中国的外交努力以及时局变化(第一次世界大战、苏俄革命等)促使英、法、日、意等国也陆续在1920年代同意把庚子赔款专用于在中国的文化教育等事业。

谎言四:美帝国主义/霸权主义

事实四:美国不是帝国 更不是帝国主义

彭斯说:“随着二战开始,我们做为盟国共同打击帝国主义。在战争之后,美国确保中国成为联合国的一部分,成为战后世界的一股重要力量。”

什么?共同打击帝国主义?大陆人可能会想,美国本身不就是帝国主义吗?“美帝”“美帝”我们叫了多少年了。

几十年前的极左派,把美国冠上了“美利坚帝国”的恶称。共产党和许多二、三世界国家一贯指控美国是“帝国主义”,许多人深信不疑,如今这个称号更是登堂入室。

可是,大英帝国的殖民地曾遍布世界,美国的殖民地在哪里?两次世界大战,美国宰割了哪个国家?

就许多方面来说,美国军事打击力领衔世界、军事基地遍及全球,美国经济举世无匹,美国文化近悦远来。但即便如此,美国和帝国主义根本不是一回事。

美国和19、20世纪的欧洲强权帝国不一样,当时帝国主义的核心是政治霸权。全盛期的大英帝国,曾经统治全球四分之一版图,掌控了许多国家的内政事务,美国对他国并没有正式的政治掌控权,因此“帝国”一词不符事实,也相当误导。

而且就美国本身的历史来说,从乘五月花号来到美洲,到抗击英国殖民打的独立战争,都使她本身对被压迫国家与民族有深切的同情。

美国国防部长唐纳德・拉姆斯菲尔德曾说:“我们不追求帝国式统治,我们不是帝国,从来就不是。”

两次世界大战,美国不但没有宰割任何一个国家。作为战胜国,美国没有得到战败国的多少赔款,反而拨出更多的钱帮助他国重建和复兴。

史家Stuart Creighton Miller评论说,“帝国主义”一词因遭误用、滥用,因而在文义上几无意义。

特朗普的目标为什么一个个都实现了?

$
0
0
特朗普的执著给美国带来了什么呢?失业率达到历史最低、GDP增长强劲且可持久性、强势美元又重新回来了、军费开支恢复到历史最高、美军已经渗透到"敌人"的最前沿、几届政府没有解决的"朝鲜核问题"出现了转机、一个崭新的世界贸易体系在有序的建立中.
许多国家、许多组织、许多人在改变,都在适应一个新的世界,这一切都是因为特朗普的出现。到底是特朗普太伟大?还是一个伟大的美国造就了一个与众不同的特朗普?我想这是双方作用的结果。美国本来一直是伟大的,特朗普倒是难得出现的一位奇才!

    那么,问题来了,特朗普的目标为什么一个个都实现了?这里我来分析一下:

    一是:美国其实是一个总统"独裁"的国家,总统的权力非常大,并且这种"独裁"是具有民主和自由属性的,因此不会给国家和人民带来灾难的。
    在我们传统的眼里,美国是一个"三权分治"的国家,总统的权力受到多方制约;这不假,但有一点必须要强调:"三权分治"并非要削弱总统的权力,而是使总统的权力"更加具有合法性",表面上议会对总统可以"指手画脚",其实这是在给总统"赋予合法性"的一个过程,也可以说是一种表演,让国民心服口服。
    许多集权国家的领导人苦于权力的合法性,整天提心吊胆,因为没有议会的监督和制约,因此执政效率并不高,内耗浪费了许多资源,整个国家一潭死水,容易产生决策错误。欧美的民主体制其实是从集权统治中总结出来的,在民主体制下也可以实施"独裁"施政,但这种"独裁"必须要获得民众的授权。
    特朗普在白宫一个人说了算,且公开一个人说来算、与媒体怼骂,他是唯一的"老板",由于他的"独裁"使许多精英丢掉了饭碗,但确保了整个团队的执行力。在一个个目标实施过程中,凡是反对者都离开了特朗普,逐渐形成了一个"绝对服从特朗普"的政府内阁。

    二是:特朗普准确地把握住了民众的心理,那就是"改变"和"民族情绪";由于是商人的身份,特朗普明白美国基层民众的需求:就是高就业、高收入、高舒适和高优越;针对"四高"目标,特朗普提出了"让美国重新伟大"的蓝图,使基层民众重新感受到上世纪的"辉煌岁月"。
    可以说,美国人近十多年来没有感受到优越感,国家地位在逐渐丧失,美国综合国力的红利在被某些大国瓜分,尤其制造业的衰败使最基层的民众很难享受到"高收入和高就业"舒适感。由于把准了目标,特朗普就一门心思往前走,因为他知道"肯定是有好结果的",他"宁愿得罪全世界,也要让美国人高兴起来"。结果,他成功了!

    三是:特朗普知道"美国余威尚在",盟友肯定会"屈服"于美国;他更明白:欧盟和日本同样也对现有的贸易体制不满,对某些大国的扩张感到忧虑,只是苦于没有人带头;因此,特朗普的目标仅仅顺应了自由世界的潮流,是符合市场体制需求的。
    假如美国再晚几年出手,就可能力不从心了;目前,美国还有4大优势:美元和贸易逆差,再加上强大的科技和军事优势;任何国家都要与美国做生意,美国是世界上最自由的消费市场,只有美国才能激活市场;尤其是那些经济增长最快、生产能力最活跃的国家,都要与美国贸易;特朗普瞄准了方向,抓住了时机,感受到了欧盟和日本等国的担忧所在;他并不蛮干,通过谈判妥协,有进有退,有硬有软,各个击破,最终达到自己渴望的目标。

    四是:世界上还没有哪个国家可以单挑美国,那些崛起的大国还没有形成绝对的优势,"反美"势力还没有能力改变美国制定的贸易规则;同时,在新型大国之间也存在着不可调和的矛盾和冲突;尤其是某些大国没有价值观优势,无法形成同盟,仅仅互相唯利是图,这为美国的"挑拨离间"创造了条件。
    特朗普是一个善于利用矛盾和冲突的人;他知道:当两个价值观和执政理念迥异国家一起贸易的时候,很容易翻脸的,因为动机和目标不同;即便是生意做的再大,结果都是互相猜疑的。新型经济体为什么始终没有形成合力挑战美国?核心一点就是志趣不同,"三观"差异太大。而美国与盟友之间的关系却非常牢固,这最终为特朗普施展拳脚创造了条件。

    五是:也是最关键的一条,那就是特朗普的偏执和执著毅力,他的个性决定了他是一个有理想的人,要为美国创造一个新天地。
    说特朗普是一个大公无私的人有点拍马屁的嫌疑,他绝对不是一个道德清教徒、慈悲心肠的老好人、为全世界劳苦大众乐于奉献的人,这无关大局,只要他是一个意志坚强的人就足够了特朗普可能是美国历史上最多被争论的总统,从竞选一开始就被人质疑,他是媒体攻击的主要对象,无论是党内党外都有大量反对者。特朗普说:"媒体92%有关他的内容都是不真实的"。即使执政2年来,始终被"通俄门"、"艳星门"和"逃税门"所困扰,他的铁杆粉丝不会超过30%,许多支持他的人也始终处于"摇摆状态";许多美国人喜欢他的执政风格,但又担心他的个性张扬。
    但,好在美国是一个绝对开放自由民主的社会,权力始终被处于阳光之下,确保了国家政策随时可以作出调整;再加上美国特殊的体制,健全的法制、高智慧的国民素质和敢于监督的媒体等,这一切综合因素确保了特朗普目标的一个个实现.

黑莉辞去美国驻联合国大使职务的真相让中国人笑掉大牙!(附黑莉背景)

$
0
0

美东时间10月9日,美国总统特朗普与美国常驻联合国代表妮基·黑莉共同会见记者,宣布黑莉将于今年年底离职。特朗普极为不舍,表示尊重妮基·黑莉的个人选择,希望她随时返回政府部门工作,并且可以挑选她喜欢的职位。

      这位深得特朗普欣赏,并且得到国会共和党和民主党一致赞扬的美国内阁高官,为何会突然宣布辞职?

话说黑莉在联合国带头抗击"反美"/"反以色列"活动,包括退出联合国人权理事会、停止向联合国近东巴勒斯坦难民救济和工程处提供援助资金,她自己说,美国在叙利亚、北大西洋公约组织、贸易谈判、朝鲜半岛和伊朗核问题全面协议等外交政策方面的调整让她"最激动"。

黑莉可看作是特朗普"美国优先"政策在联合国的代言人,在代表共和党的卡瓦诺大法官就任的大好时刻,在中期选举即将到来的关键时刻,与特朗普步调一致的黑莉的请辞,是否扰乱了白宫营造稳定形象的努力,而这,又意味着什么呢?

妮基·黑莉拒绝说明她辞职的原因。外界猜测说是黑莉准备参加2020年的总统大选,但她自己断然否认,说她将坚定地支持特朗普总统的连任。其实,真相说出来,一定会令中国人笑掉大牙:这位美国政府高官之所以辞职,只因为丈夫收入有所下降,而政府提供给她的薪水不高,这令她的家庭入不敷出!如果她辞职到私人企业打工,薪水可以翻几番。至此,中国的瓜众们是彻底看不懂了!

黑莉在州众议院任职六年,后来又当了六年的州长,这些职位居然都不怎么挣钱。在她任职州长期间的2015年,她和丈夫全年收入仅17万美元,而2014年和2013年,他们俩加起来的收入分别是19万美元和27万美元。另外,据黑莉2018年度的财产公示报告显示,他们家可谓债台高筑,他们的信用卡欠费达25000美元和65000美元之间,另外他们在2013年按揭贷款25-50万美元购自主房,30年期,年利率是3.8%;在2017年他们又投资买房,按揭贷款超过100万美元,20年期,年利率是4.25%。黑莉有一个孩子正在读大学,而还有一个孩子过不了几年也要读大学,这对他们的家庭来说可是个大负担。作为联合国大使,年收入估计也就十几万美元。CNN分析,黑莉的个人履历让她很容易在私企领域年收入达到7位数,她很可能受此诱惑决定辞职。

       原来美帝官员的财产是要公示的,你的言行身家都要曝光在太阳底下。身价归为地球第一经济强国的美国的州长,和驻联合国大使,居然薪水这么低!而且就没有人为了批个条子给她明里暗里给她送点银子、股权、房子什么的,难道她在海外就没有账户?为了钱,养孩子,居然请辞我们国人没有背景、挤破脑袋也进不去的官场,真是的,笑掉我们中国瓜众的大牙!

原来白宫无非就是一个打工的地方,与星巴克麦当劳里的服务生没啥高低贵贱的不同,也没有薪资上的大差别。这就是现代文明社会政府的重要标志。
--------

附:
这位联合国的美国钢炮辞职了,她的背景会让你惊跌下巴

Nikki Haley,美国驻联合国大使,向特朗普提出辞职了。

一般的朋友,一看到这名字,就想起这样的形象:特朗普在俩合国的钢炮,舌战群雄,然后,也就这样而已。不了解内情的,还以为她是特朗普的小喽罗。

https://v.qq.com/x/page/m0522zo8s1h.html

然而,当你翻开她的简历,你的下巴估计都要被吓掉了。

原来,她在出任美国驻联合国第29任大使之前,就已经是南卡的第116任州长,足足当了6年!听说过阿诺德·施瓦辛格(Arnold Schwarzenegger)么?前加州州长。听说过骆家辉(Gary Faye Locke)没?前华盛顿州州长。也就是说,这位以特朗普喉舌面目在联合国亮相并被世界广为所知的小钢炮,竟然曾经是美国一个州的州长!

这不让人吃惊,吃惊的是,大家猜猜她今年多少岁?她是1972年出生的!在她刚好要39岁生日的时候,她就已经是南卡的州长了!而早在2005年,她已经是州议员,那时,她也就刚好要33岁而已。

Nikki Haley并非大家所想象的传统的美国白人,她是印度后裔!她是第一位在内阁层面上任职的印度裔,第二位印度裔州长。想不到吧?

在2017年12月,她名列《彭博商业周刊》2017年度全球50大最具影响力人物榜单第一位,而孙正义,居然只排到第6位,特斯拉的老总Elon Musk,更是排到了第43位。。。

最后,想告诉各位Nikki Haley的一堆"黑历史"。不过这个"黑历史"有些人会不喜欢。那就这样吧,点标题下的"北美华人之声",关注,进入公众号,发送"特朗普"三个字,系统将会为您推送有关信息,点进去,就可以在2018-10-10部分看到有关内容了。

——北美华人之声


微信号:
HuarenVoice

为什么中国对川普政府的政策始料不及?

$
0
0
前共识网创办人和总裁周先生最近在美国待了一阵子,所遇之人,无论是中国人还是美国人,谈得最热的都是中美关系。
由于中美关系现状,他对中国智库与目前美国政府的智囊人物的关系疏远,很是感慨,从而引出了烧冷灶的问题。
美国是智库最多也最强的国家。作为老牌的超级大国,美国人对世界的边边角角都有兴趣,似乎没什么死角,也可以说没有冷灶。
中国的智库世界第二,但它们没有美国式的旋转门,与政府的关系就像是隔了一堵墙,而且更像是宣传或者新闻机构,以诠释领导决策以获得领导批示为第一要务,于是追逐热点和热点人物成为工作重点,没有人去烧冷灶。
所以一旦美国政府起用所谓的冷灶的这些人担当重任,或者在某些冷门领域对华发起挑战,那么就只有傻眼的份了。依靠非常功利的接近或修复关系,往往不能达到预期效果。
他举了班农、纳瓦罗、白邦瑞、波廷杰几个人的例子。
确实,这几个人都不在中国智库对外交流的视线之内。
究其原因,有些人在过去担任过记者,被认为进行不利于中国(实际所指要狭隘得多)的报道,因此像波廷格(以前译作博明)这样的人不受欢迎,甚至曾经有不良待遇。他们曾在中国直接从事一线报道,对中国了如指掌,因此在制定政策时非常有针对性
比如波廷格就是川普政府亚洲事务首席顾问,在对华政策制订上角色关键。他是"以结果为导向的中美关系"提出者,而且实际运用到对华外交实践了,在中美关系发展中产生了重要影响。
像班农、纳瓦罗等人,更是被经常视为"反华"学者。其实他们只是从学问或政策本身出发作出的客观理性研究,不怎么中听,甚至刺耳。当然,他们很多时候是站在美国利益的立场上。但这些都属于正常范围内。
然而他们不仅被讨厌,对他们的思想观点几乎没有研究,不允许其出版,而且事实上被拒于中外交流的大门之外。这些人尽管在多年里都不是美国对华政策观点的主流,但绝对不能忽视,而且在中美冲突的背景下,他们的观点更能体现中美关系发展的本质和趋势,因此更有市场。
班农和纳瓦罗等人的政治思想,对川普政府,而且势必对美国未来的政府,都将产生深远影响
白邦瑞是另一个类型。他曾在里根政府担任国防部助理副部长,在中美"心照不宣"的同盟时代,曾为中美关系的具体合作和关系作过大量实际工作。离职后转入智库。
但中国显得急功近利,乐于跟时任美国政府的智库"红人"打交道,而对白邦瑞这样暂时坐冷板凳的美国智库研究人员抱以冷淡。白邦瑞曾多次对此感到抱怨,为中国区别对待他和基辛格愤愤不平。
白邦瑞现在对美国政府具有重要影响的哈德逊研究所担任中国战略研究中心主任——就在前不久,美国副总统pence在该研究所发表了一份有关中美关系的重要演说。个人经历因素可能在某种程度上影响其观点倾向。
对于外国智库持不同观点的研究者或者如实报道中国国内情况的记者,采取排斥性态度;或者对处于权力或研究核心之外的学者,采取轻视态度。而对那些高唱中美友好或炙手可热的研究者,又是趋之若鹜。
这不仅是由于对国家利益的狭隘认识,而且是中国人内在的某些国民性在中外交往中的表现。

用 Telegram 收发微信消息

$
0
0
仅以此文简单记录下安装使用 EFB,用 Telegram 收发微信消息。
EH Forwarder Bot(简称 EFB)是一个可扩展的聊天平台隧道框架,基于 Python 3。目前已内置了 Telegram 主端 (Master Channel) 和微信从端 (Slave Channel),用来在 Telegram 收发微信消息。

创建 Telegram Bot

可以使用 @BotBrother 创建,发送指令 /newbot,根据提示完成创建,之后得到一个 token
接下来还要对刚刚启用的 Bot 进行进一步的配置:允许 Bot 读取非指令信息、允许将 Bot 添加进群组、以及提供指令列表:
  • 发送 /setprivacy 到 @BotFather,选择刚刚创建好的 Bot 用户名,然后选择 Disable;
  • 发送 /setjoingroups 到 @BotFather,选择刚刚创建好的 Bot 用户名,然后选择 Enable;
  • 发送 /setcommands 到 @BotFather,选择刚刚创建好的 Bot 用户名,然后发送如下内容:
    link - 将会话绑定到 Telegram 群组
    chat - 生成会话头
    recog - 回复语音消息以进行识别
    extra - 获取更多功能
然后还需要获取你自己的 Telegram ID,向 @get_id_bot 发起 /start 会话便可。

VPS(墙外) 安装 EFB

安装依赖,具体可见 Wiki
然后下载安装 EFB
$ git clone https://github.com/blueset/ehForwarderBot.git
$ cd ehForwarderBot
$ pip3 install -r requirements.txt
配置 EFB
$ cd ehForwarderBot
$ mkir storage
$ chmod +rw storage
$ cp config.sample.py config.py
$ vi config.py
把 config.py 中的 token 和 admin 字段换成你的 Telegram Bot 的 token 和你的 Telegram ID,至于下面的两个语音转换可根据自己需求设置,不用则删除掉。
启动 EFB:python3 daemon.py start,之后会出现微信二维码供扫描登录,当终端显示:Start auto replying 时,即代表登陆成功,这时候就可以 Ctrl + C 了。

使用 Telegram 收发微信消息

到你创建到 Bot 中发送 /start 即可开始与微信互通消息。
发送 /chat 选择会话,然后回复这个消息就可以向指定联系人或群组发送消息。
收到消息时,只要双击该消息,回复即可。
PS. 也可以使用 @bao3 的 docker.

参考:https://blog.1a23.com/2017/01/09/EFB-How-to-Send-and-Receive-Messages-from-WeChat-on-Telegram-zh-CN/

何清涟:彭斯讲话——美国屠龙派观点大放送

$
0
0
美国副总统彭斯10月4日在华府哈德逊研究所发表公开讲话,明确指责了中国的军事侵略、商业盗窃、侵犯人权以及试图干涉即将举行的美国中期选举,国际社会反应强烈,有的甚至评说这场讲话“拉开了冷战的铁幕”,中美关系濒临破裂。
持这种评论的人,可能对华府智库圈派别及其观点的多年演变及动态并不熟悉。

美中关系历来有“晴天版”与“阴天版”
早在2006年,我就写过一篇《美中关系的晴天版与阴天版再次交战》,介绍美国对华关系上的两派——拥抱熊猫派(Hug panda)与屠龙派(Dragon Slayer)的由来。
多年前,美国学者哈罗德·艾萨克斯(Harod Issaacs)就已经意识到美国人对中国的认识极端矛盾,他说:“在西方与中国接触的漫长历史中,我们指认中国的两副面孔——高度文明或残忍荒蛮——不断变换,这两副面孔分别在不同时期进入或淡出人们的脑际。但它们从不会彼此取代,而是相互依存。这两副面孔随情势的变化而发生转换,进而影响人们对中国的复杂感情——或同情中国或拒斥中国,或呵护或迁怒,或对中国热情洋溢或敌意有加,热爱或恐惧,几至痛恨。”
印地安那大学教授杰弗里N.瓦萨斯特罗姆(Jeffrey N. Wasserstrom)则用“晴天版”与“阴天版”这两个词来说明美国社会对中国的两极看法。1989年中国“六四事件”以后,美国社会形成了“邪恶的中国政府与善良的中国人”这种看法。1999年4月朱镕基总理访问华盛顿与克林顿总统会谈,特别是在关于中国窃取核情报的考克斯报告之后,媒体和公共舆论对中国的问题愈炒愈烈,“中国”这个词反复出现在新闻报道、社论与政治演说中。有时候,与中国相伴的措辞是“核间谍”;有时候,一些媒体和政客努力描画另一幅图景:中华人民共和国是一个充满了善良人民的国度(其中也包括改革派的领导人),他们坚定地走向了正确的道路。于是,媒体出现了两个极端对立的中国叙述:一个是不断制造人权丑闻的中国专制政府,而另一个则是对中国领导人的美化报导,这种报道后来陷入一个新套路:在无法美化老一代领导人时,则努力美化新一代领导人,直到习近平上台之初还是这个套路,习夫人彭丽媛都成了为习加分的因素(见《纽约时报》2013年3月25日《彭丽媛为中国形象加分》)。
概言之,在两派主张当中,拥抱熊猫派当道,中美关系是晴天;屠龙派当道,中美关系则是阴天。从克林顿以来美国三任总统长达24年的时间中,只有六四之后短暂的几年内是阴天,大多数时候是晴天。
彭斯讲话是屠龙派观点的集中表述
拥抱熊猫派与屠龙派并非横空出世,各自有继承关系。
冷战结束以后,中美关系的变化反映在美国对华政策思潮中,有“接触派”和“遏制派”,美国政坛与媒体将接触派称为“红队”,将遏制派称为“蓝队”——美国军事演习中,“蓝队”代表美军,而“红队”代表敌方(冷战时为苏联红军,冷战后为中国人民解放军)。属于“红队”的有主张接触政策的政界和企业界人物,以及深谙中国事务的“中国通”们,包括学术界、新闻界、政策研究与咨询机构和政府职能部门(如外交、情报等)的中国问题专家。他们并不认为共产党执政的社会主义中国是美国必然的敌人,主张通过增加同中国的接触影响中国,实行“和平演变”,使中国在意识形态、价值观和社会制度方面同美国更为接近,从而减少今后中国强盛后与美国为敌的可能性。后来因这一派明确主张对华友好,被命名为“拥抱熊猫派”。布什执政以来,一批“蓝队”人士进入政府出任高级官员,但由于“接触派”以及有钱有势的“中国游说集团”(China Lobby)多年来居于主流地位,在美国朝野根深叶茂,美中关系全国委员会成员多为拥抱熊猫派主力,布什只能采取居中的“熊猫避险”策略。
对华“遏制派”的中坚力量是“蓝队”,主力是20世纪90年代后期崛起的新保守主义“外交政策共同体”(foreign policy community),最初只是七、八个志同道合的朋友纵论国是的私宅聚会,后来便发展到四十来人的“精英圈子”。“蓝队”并无正式组织形式,因为它并没有正式的章程和成员,也没有办公机构和领导人,但却有毫不含糊的纲领和影响力。它的纲领非常明确,就是要把在冷战后“迷失了方向”的美国外交“拉回正确轨道”,尤其把重点放在美国对华政策的“纠偏”上。这一派后来被命名为屠龙派,后来觉得对以龙为图腾的中国来说显得杀气太重,一度改称为敲打熊猫派。
2018年3月以来,屠龙派重要成员、力反全球化且有系统理论的前美国驻联合国大使约翰·罗伯特·博尔顿(John R. Bolton)被特朗普总统任命为国家安全顾问,鹰派人物迈克·蓬佩奥(Michael Richard Pompeo)继之被任命为国务卿,在外交事务中,屠龙派终于占压倒性优势,对拥抱熊猫派的批评终于公开化。今年6月,美国高官离职后为中国游说、成为中国在美国的利益代言人这一多年存在的问题,陆续被The Daily Beast等媒体披露之后,美国国会下属的美中经济和安全审查委员会(USCC)于8月24日正式发布报告《中国的海外统战工作背景及对美国的影响》,特朗普总统上任前在葛底斯堡的演讲中誓言的“排干沼泽”见诸行动,打击外国代理人的防谍工作列上美国政府的工作日程,拥抱熊猫派的声音才算沉寂下去,这一派支持、由中国政府出资的孔子学院、以及在大学中的中国研究(信息)中心等纷纷关闭。
如果熟悉美国对华政策,就会发现,彭斯讲话的内容近年来陆续在华府智库的屠龙派研究中出现,彭斯讲话中提到的白邦瑞(Michael Pillsbury)就是屠龙派的代表人物,他于2015年出版的《2049:百年马拉松——中国称霸全球的秘密》热销,该书的主题就是全面反思中美关系及美国对中国判断失误而导致的外交政策失误。
彭斯讲话的意义何在?
彭斯将屠龙派的观点系统地归纳于一个报告中,以副总统公开演说的形式发表,公开否定了历经克林顿、布什、奥巴马三任总统的各种友好关系说辞,例如“经济合作伙伴”、“战略伙伴”、“重要的战略合作伙伴”,将特朗普确定的“竞争关系”推进一步,指出中国对美国的渗透、干预美国政治等恶意行为,只是中国试图在世界各地推动其战略利益的几种方式,实质上是对中国的一种明确警告。
但是,将这一讲话说成是新冷战宣言,却有点夸张。理由如下:
一、特朗普曾强调过:“我们不要竞相颠覆那些我们根本不了解的国家的政权”。这是美国自海湾战争、伊战、阿拉伯之春以来吸取的教训,中东、北非地区的现实,说明依靠外部干预实现的“民主”,与原来的期望完全相反,特朗普撤销外援中的民主资金,就是为此。今年9月25日川普在73届联合国大会上发表讲话时,重点批评中国对国际贸易体系的滥用,并对委内瑞拉的马杜罗政权进行抨击,指控他实行的社会主义制度为该国人民带来了痛苦和艰辛,呼吁各国联手抵制社会主义。但他说的“抵制”更多带有防御色彩,距离“冷战”还有很长距离。
二、彭斯讲话主要还是防守性的。他提到特朗普总统在2017年12月公布的《国家安全战略》讲课费,谈到在“大国竞赛”的新时代,外国开始“重塑他们在区域和全球的影响力”,并“挑战美国的地缘政治优势,并试图改变国际秩序使之适合他们的利益”,并特别指出:“在这项战略中,特朗普总统明确表示,美国已经对中国采取新的政策。我们寻求公平、对等以及相互尊重主权的关系”,这段话表明,美国虽然警告中国必须停止对美的各种渗透与干预,但设定的底线也是明确的:相互尊重主权。被媒体与分析者忽视的一句话,“美国在过去25年‘重建了中国’,……北京仍然口头上在说‘改革开放’,然而邓小平的这个著名政策已经变得空洞”,其实表达了美国对中国的期待而非敌意。
三、美国国内政治对外交政策的限制。一国的外交与军事行动,其实就是国内政治在国际社会的一种延续,也因此,彭斯以副总统身份在智库的发言,官方色彩相对较淡,是否代表美国政府立场,其间解释余地很大。之所以会采取这种形式表态,一则因为屠龙派并不主张以摧毁中共政权为目标的强力干预,只是主张扼制中国。因为伊战与阿拉伯之春的前车之鉴犹在,美国社会多数成员希望本国政府“不要再多管国际社会的闲事了”。二则因为美国国内共和、民主两党政争前所未有地激烈,在卡瓦诺大法官提名在极为艰难的情形下获得通过之后,希拉里·克林顿在10月9日接受CNN的采访时,干脆鼓励民主党选民不择手段:在夺回白宫与国会控制权之前,不要对共和党讲客气。
中美关系短期内不会阴转晴,是否出现“晴天版”,在很大程度上取决于北京如何应对。无论如何,北京采取的强硬姿态,以及将宝押在中期选举民主党获胜、川普将在2020年败选这一点上,不是明智之举。

用 GitLab CI 实现持续集成

$
0
0
弄了下 GitLab CI 做持续集成,躺了些坑,稍微记录下。

安装 gitlab-ci-multi-runner

因为 GitLab CI 是通过 GitLab Runner 来构建任务的,所以我们必须在服务器或者开发机跑 GitLab Runner,GitLab CI 本身是管理各个项目的构建状态。安装如下:
# for CentOS
$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | bash
$yum install gitlab-ci-multi-runner

# for MacOS
brew install gitlab-ci-multi-runner

注册、启动 Runner

注册并启动 Runner 跟 GitLab CI 绑定连接。我这里只用 Specific Runner,在 GitLab 设置的 CI/CD Pipelines 中可以看到 Specific Runner 的 setup 说明,下面的 url 和 token 是注册时要用到的
$ gitlab-ci-multi-runner register
根据提示分别输入 url,token,runner executor(我用 docker),因为是 node 项目,image 我用了 node:latest
注册完成,启动 Runner
$ gitlab-ci-multi-runner install
$ gitlab-ci-multi-runner start
这时候可以在 GitLab 中看到 Runner 的状态为 online 了

配置 .gitlab-ci.yml

然后我们需要在项目中新建 .gitlab-ci.yml,来实现代码合并更新后自动执行任务,我主要做的任务是打包并同步相关文件到服务器。我的 .gitlab-ci.yml 配置大致如下:
image: node:latest

stages:
- build
- deploy

cache:
paths:
- node_modules/

build:
before_script:
- npm install
stage: build
only:
- master
script:
- npm run build

deploy:
before_script:
- apt-get update && apt-get upgrade -y && apt-get dist-upgrade -y && apt-get install -y rsync
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- ssh-add <(echo "$SSH_PRIVATE_KEY")
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\\n\\tStrictHostKeyChecking no\\n\\n"> ~/.ssh/config'
stage: deploy
only:
- master
script:
- bash deploy.sh
这里遇到的坑主要是 deploy 这一步,主要是设置问题,我用的 rsync 来同步,需用服务器的 ssh private key,在你生成 key 后,需要把 public key 放到 authorized_keys 中。
SSH Key 的配置介绍参考官方文档
拿到服务器的 ssh private key 后,需要配置到 GitLab 的 Secret Variables 中,添加 variable,key 为 SSH_PRIVATE_KEY,Value 为你的 ssh private key。
这样,每次更新代码后我就不用去管打包发布了。

Refs.

------------

用 GitLab CI 进行持续集成

从 GitLab 8.0 开始,GitLab CI 就已经集成在 GitLab 中,我们只要在项目中添加一个 .gitlab-ci.yml 文件,然后添加一个 Runner,即可进行持续集成。 而且随着 GitLab 的升级,GitLab CI 变得越来越强大,本文将介绍如何使用 GitLab CI 进行持续集成。

一些概念

在介绍 GitLab CI 之前,我们先看看一些持续集成相关的概念。

Pipeline

一次 Pipeline 其实相当于一次构建任务,里面可以包含多个流程,如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。
任何提交或者 Merge Request 的合并都可以触发 Pipeline,如下图所示:

+------------------+ +----------------+


| | trigger | |


| Commit / MR +---------->+ Pipeline |


| | | |


+------------------+ +----------------+

Stages

Stages 表示构建阶段,说白了就是上面提到的流程。
我们可以在一次 Pipeline 中定义多个 Stages,这些 Stages 会有以下特点:
  • 所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始
  • 只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功
  • 如果任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败
因此,Stages 和 Pipeline 的关系就是:

+--------------------------------------------------------+


| |


| Pipeline |


| |


| +-----------+ +------------+ +------------+ |


| | Stage 1 |---->| Stage 2 |----->| Stage 3 | |


| +-----------+ +------------+ +------------+ |


| |


+--------------------------------------------------------+

Jobs

Jobs 表示构建工作,表示某个 Stage 里面执行的工作。
我们可以在 Stages 里面定义多个 Jobs,这些 Jobs 会有以下特点:
  • 相同 Stage 中的 Jobs 会并行执行
  • 相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功
  • 如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败
所以,Jobs 和 Stage 的关系图就是:

+------------------------------------------+


| |


| Stage 1 |


| |


| +---------+ +---------+ +---------+ |


| | Job 1 | | Job 2 | | Job 3 | |


| +---------+ +---------+ +---------+ |


| |


+------------------------------------------+

GitLab Runner

简介

理解了上面的基本概念之后,有没有觉得少了些什么东西 —— 由谁来执行这些构建任务呢?
答案就是 GitLab Runner 了!
想问为什么不是 GitLab CI 来运行那些构建任务?
一般来说,构建任务都会占用很多的系统资源 (譬如编译代码),而 GitLab CI 又是 GitLab 的一部分,如果由 GitLab CI 来运行构建任务的话,在执行构建任务的时候,GitLab 的性能会大幅下降。
GitLab CI 最大的作用是管理各个项目的构建状态,因此,运行构建任务这种浪费资源的事情就交给 GitLab Runner 来做拉!
因为 GitLab Runner 可以安装到不同的机器上,所以在构建任务运行期间并不会影响到 GitLab 的性能~

安装

安装 GitLab Runner 太简单了,按照着 官方文档 的教程来就好拉!
下面是 Debian/Ubuntu/CentOS 的安装方法,其他系统去参考官方文档:

# For Debian/Ubuntu


$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash


$ sudo apt-get install gitlab-ci-multi-runner




# For CentOS


$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash


$ sudo yum install gitlab-ci-multi-runner

注册 Runner

安装好 GitLab Runner 之后,我们只要启动 Runner 然后和 CI 绑定就可以了:
  • 打开你 GitLab 中的项目页面,在项目设置中找到 runners
  • 运行 sudo gitlab-ci-multi-runner register
  • 输入 CI URL
  • 输入 Token
  • 输入 Runner 的名字
  • 选择 Runner 的类型,简单起见还是选 Shell 吧
  • 完成
当注册好 Runner 之后,可以用 sudo gitlab-ci-multi-runner list 命令来查看各个 Runner 的状态:

$ sudo gitlab-runner list


Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml


my-runner Executor=shell Token=cd1cd7cf243afb47094677855aacd3 URL=http://mygitlab.com/ci

.gitlab-ci.yml

简介

配置好 Runner 之后,我们要做的事情就是在项目根目录中添加 .gitlab-ci.yml 文件了。
当我们添加了 .gitlab-ci.yml 文件后,每次提交代码或者合并 MR 都会自动运行构建任务了。
还记得 Pipeline 是怎么触发的吗?Pipeline 也是通过提交代码或者合并 MR 来触发的!
那么 Pipeline 和 .gitlab-ci.yml 有什么关系呢?
其实 .gitlab-ci.yml 就是在定义 Pipeline 而已拉!

基本写法

我们先来看看 .gitlab-ci.yml 是怎么写的:

# 定义 stages


stages:


- build


- test




# 定义 job


job1:


stage: test


script:


- echo "I am job1"


- echo "I am in test stage"




# 定义 job


job2:


stage: build


script:


- echo "I am job2"


- echo "I am in build stage"

写起来很简单吧!用 stages 关键字来定义 Pipeline 中的各个构建阶段,然后用一些非关键字来定义 jobs。
每个 job 中可以可以再用 stage 关键字来指定该 job 对应哪个 stage。
job 里面的 script 关键字是最关键的地方了,也是每个 job 中必须要包含的,它表示每个 job 要执行的命令。
回想一下我们之前提到的 Stages 和 Jobs 的关系,然后猜猜上面例子的运行结果?

I am job2


I am in build stage


I am job1


I am in test stage

根据我们在 stages 中的定义,build 阶段要在 test 阶段之前运行,所以 stage:build 的 jobs 会先运行,之后才会运行 stage:test 的 jobs。

常用的关键字

下面介绍一些常用的关键字,想要更加详尽的内容请前往 官方文档

stages

定义 Stages,默认有三个 Stages,分别是 buildtestdeploy

types

stages 的别名。

before_script

定义任何 Jobs 运行前都会执行的命令。

after_script

要求 GitLab 8.7+ 和 GitLab Runner 1.2+
定义任何 Jobs 运行完后都会执行的命令。

variables && Job.variables

要求 GitLab Runner 0.5.0+
定义环境变量。
如果定义了 Job 级别的环境变量的话,该 Job 会优先使用 Job 级别的环境变量。

cache && Job.cache

要求 GitLab Runner 0.7.0+
定义需要缓存的文件。
每个 Job 开始的时候,Runner 都会删掉 .gitignore 里面的文件。
如果有些文件 (如 node_modules/) 需要多个 Jobs 共用的话,我们只能让每个 Job 都先执行一遍 npm install
这样很不方便,因此我们需要对这些文件进行缓存。缓存了的文件除了可以跨 Jobs 使用外,还可以跨 Pipeline 使用。
具体用法请查看 官方文档

Job.script

定义 Job 要运行的命令,必填项。

Job.stage

定义 Job 的 stage,默认为 test

Job.artifacts

定义 Job 中生成的附件。
当该 Job 运行成功后,生成的文件可以作为附件 (如生成的二进制文件) 保留下来,打包发送到 GitLab,之后我们可以在 GitLab 的项目页面下下载该附件。
注意,不要把 artifacts 和 cache 混淆了。

实用例子

下面给出一个我自己在用的例子:

stages:


- install_deps


- test


- build


- deploy_test


- deploy_production




cache:


key: ${CI_BUILD_REF_NAME}


paths:


- node_modules/


- dist/






# 安装依赖


install_deps:


stage: install_deps


only:


- develop


- master


script:


- npm install






# 运行测试用例


test:


stage: test


only:


- develop


- master


script:


- npm run test






# 编译


build:


stage: build


only:


- develop


- master


script:


- npm run clean


- npm run build:client


- npm run build:server






# 部署测试服务器


deploy_test:


stage: deploy_test


only:


- develop


script:


- pm2 delete app || true


- pm2 start app.js --name app






# 部署生产服务器


deploy_production:


stage: deploy_production


only:


- master


script:


- bash scripts/deploy/deploy.sh

上面的配置把一次 Pipeline 分成五个阶段:
  • 安装依赖(install_deps)
  • 运行测试(test)
  • 编译(build)
  • 部署测试服务器(deploy_test)
  • 部署生产服务器(deploy_production)
设置 Job.only 后,只有当 develop 分支和 master 分支有提交的时候才会触发相关的 Jobs。
注意,我这里用 GitLab Runner 所在的服务器作为测试服务器。

参考资料

如何在婚姻里活下来?学会接受差异.

$
0
0

我觉得两口子过日子,先要学会接受对方跟自己的不同。这种接受不是窝囊,而是既然要长久的生活在一起,那就不要每处都较劲了。接受对方差异的方法就是,每次觉得自己快要受不了的时候,对她说:好的,没问题
比如她想国庆节出门去旅行,参加各种人山人海的运动会,我就想在家里宅着。她安排好了各种行程,我一看没辙就说:好的,没问题。然后戴上我的帽子,戴上我的耳机,戴上我的墨镜,戴上我的手机,她一路玩一路拍一路发朋友圈,我负责在她的朋友圈里点赞。因为在家里宅和跟太太出门旅行是一个概念,有太太的地方就是家,不是吗?
为什么忍不了的时候还要说好的呢?因为当你说‌‌“好的‌‌”的时候,思维就会逆向回来,毕竟从古到今叛乱都没什么好下场。想想汉朝的七国之乱,唐朝的安史之乱,宋朝的方腊之乱,清朝的太平天国之乱,都没个好下场。其实忍的真正原因是,这世界上反正跟谁结婚都会后悔,与其再找人痛苦磨合一次,还不如就死在熟人手里
培根一句话点明了这事的真相:试想你居然有耐心能忍受这样的伴侣,你难道不会感到自豪吗?忍的真相是,接受了彼此的差异性,开始尝试跟一个不同于自己的生物一起生活。
当然我必须要说清楚的是,这种差异性是不碰触自己底线的,如果碰触了自己的底线,那没什么好说的,从此萧朗是路人。

遇上你是我的缘


彩雲追月(其实是一首古曲,又有人说是广东民乐)

$
0
0
-这二胡声真悠扬,太悦耳了。

用 Homebridge 连接 HomeKit 和小米智能设备

$
0
0
起因是女儿偶尔半夜起床上厕所的时候没灯,老是跑进我房间让帮忙开灯, 于是入了小米人体感应器、小米多功能网关、智能插座来感应,女儿出房间的时候自动给她开厕所灯。
其实小米智能设备,在米家 App 设置后基本上满足需求了,接上 HomeKit 是为了可以用 Siri。
Homebridge is a lightweight NodeJS server you can run on your home network that emulates the iOS HomeKit API. It supports Plugins, which are community-contributed modules that provide a basic bridge from HomeKit to various 3rd-party APIs provided by manufacturers of “smart home” devices.

安装 homebridge和插件

家里长期开着 Mac Mini 做服务,所以直接在 Mac Mini 上起 Homebridge 服务了,你也可以用 NAS、树莓派等。
$ npm i -g homebridge

# 小米智能网关插件
$ npm i -g homebridge-aqara

# 小米 yeelight 插件,如果有 yeelight 的话就装
$ npm i -g homebridge-yeelight

配置 homebridge

这里需要先获取小米多功能网关的 MAC 地址和网络通讯协议密码。
米家 App 联接小米多功能网关,然后进入多功能网关,点右上角 ...,选择“关于”,然后快速点击空白处,会出现 “网关信息”和“局域网通信协议”,在“网关信息”中找到 MAC 地址并记下,在“局域网通信协议”中打开局域网通信协议 并记下记下密码。
然后开始配置 config.json
# 创建 .homebridge 目录
$ mkdir -p .homebridge && cd .homebridge
$ vi config.json

# config.json 内容大致如下
{
"bridge": {
"name": "Homebridge", // 在 HomeKit 中显示的名称
"username": "", // 随意填写
},
"platforms": [
{
"platform": "AqaraPlatform", // 多功能网关
"sid": ["cc223de3ce30"], // 上面记录下来的 MAC 地址,假如是 CC:22:3D:E3:CE:30
"password": ["上面记录下来的局域网通信协议密码"]
},
{
"platform": "yeelight", // YeeLight
"name": "yeelight"
}
]
}
然后终端运行 homebridge 就可以了,之后会终端会出现 8 位数 pin 码, 打开 HomeKit 就可以输入 pin 码就可以联接到 homebridge 了.

OS X 下给 Raspberry Pi 安装 XBian

$
0
0
搞了个 Raspberry Pi 来折腾,目的就是用用 XBMC 和当个下载机。
最简单的安装就是直接下载 NOOBS,解压丢进格式化过的 SD 卡,然后插入 Rasberry Pi 接上电源启动,当然显示器、键盘鼠标啥的也要接上,然后就进入安装了。
最开始我也是用 NOOBS 装的 Raspbian,不过 Raspbian 编译 XBMC 太麻烦,对比了 OpenELEC,RaspBMC 和 XBian,还是决定安装 XBian。我没用 OS X 的 installer 安装,据说下载太慢,下面说说用终端安装的方法:
  1. 下载 XBian image 文件,插入 SD 卡到电脑;
  2. 打开终端,输入 df -h,查看 SD 卡盘符号,比如我的是 /dev/disk2s1,那 2 就是它的盘符号。很重要,下面都需要用到,下面用 ? 代表 SD 卡盘符号;
  3. 输入下面命令(假设 image 文件放在 Desktop):
    sudo diskutil unmount /dev/disk?s1   
    sudo dd bs=1M if=~/Desktop/xbian.img of=/dev/rdisk?
  4. 开始安装到 SD 卡了,按 ctrl + t 可以看到安装过程。安装完后你会看到 xxxx bytes transferred in xxx secs 字样;
  5. 输入 sudo diskutil eject /dev/rdisk? 安全拔出 SD 卡;
  6. 把 SD 卡插入 Raspberry Pi,启动就可进入安装了。安装完后直接就是 XBMC 界面了.

Ubuntu VPS系统配置指南

$
0
0


目录

 [隐藏

拿到的帐号

VPS 开通后,你将收到如下的帐号:
VPS IP Address: 184.82.9.30
SSH Root Password: pass001
面板地址在 http://vps.ubuntu.org.cn/vm/ 需要使用你的开通时留下的邮箱注册。
以下的指南都是针对 ubuntu 的,请 centos 或其它 Linux 用户到面板 reload 到ubuntu 14.04 然后继续。
Attention niels epting.svg 注意:如果你安装 ubuntu 14.04 可能会无法登录,提示访问拒绝,这并不是密码输入错误了,而是因为 sshd 的默认配置里面禁止了 root 帐号登录,所以你需要使用面板的 临时通道 上去,逐行执行如下命令开启 root 登录权限:
sed -i "s/PermitRootLogin.*$/PermitRootLogin yes/" /etc/ssh/sshd_config
service ssh restart
顺便提一句,如果你是老手,不用开启 root 登录,可以直接创建一个普通帐号,加入到 sudo 组,使用sudo 来执行命令,这样更安全。

如何远程访问

Linux VPS支持ssh远程访问,因此需要使用putty工具来访问。
1 下载putty
2 运行putty
这个程序不需要安装,下载后直接运行,后在Host地址输入VPS的IP如下:
Vps putty1.png
3 登录vps
点击上图中的 Open 按钮,第一次登录会出现确认密钥的提示,如下图,请点击 “是” 按钮。
Vps putty2.png
4 如下图输入登录用户名 root 回车,继续输入密码。
Attention niels epting.svg 注意输入密码是不会显示 “*” 的,同时密码是区分大小写的。
有个技巧,直接去复制密码后,鼠标点击 putty 的输入密码窗口,直接按下鼠标右键,然后回车即可登录。 在putty的窗口按下鼠标右键表示粘贴。
Vps putty3.png
5 如果显示下图则表示登录成功了。
Vps putty4.png
6 设置 putty 支持 vps 的中文文件名或中文文件内容显示,此步骤非必需,可以忽略:
在主窗口,点击左上角的图标,在弹出菜单中选择 Change Settings... 菜单,出现设置窗口。
设置显示字体,左边窗口点击 Window -> Appearance ,右边点击 Font settings -> Change 如下图:
Vps putty5.png
字体选择 新宋体 字符集选择 CHINESE_GB2312 ,字体大小随你喜好设置。设置完毕后点确定
Vps putty6.png
设置终端字符,左边窗口点 Window -> Translation ,右边选择 Remote character set 的下拉框选择 UTF-8 ,如下图:
Vps putty7.png
设置Socket5代理,左边窗口点 Connection -> SSH -> Tunnels,右边如下图选择 Dynamic ,Source port 输入 7070,然后点 Add 按钮,就启用了本机代理。
PuttySocket5.png

如何上传和下载文件

VPS 直接支持ssh协议,因此不需要采用 ftp 方式上传,可以直接使用支持 sftp 协议的客户端上传文件,这里使用 FileZilla。
1 下载FileZilla
2 下载完毕后安装 FileZilla
3 添加站点
运行FileZilla,点击菜单 文件 -> 站点管理器
Vps FileZilla1.png
点击后如下图:
Vps FileZilla2.png
再点击面板的 "新站点"按钮,在右边的输入地方,输入:
主机:VPS的IP,本例输入 184.82.9.30
协议:选择 SFTP
登录类型:选一般
用户:输入root
密码:输入ssh的登录密码,注意密码区分大小写。
如下图:
Vps FileZilla3.png
输入完毕后,再切换到字符集,选择 "强制 UTF-8",如下图:
Vps FileZilla4.png
输入完毕后直接点击 “连接” 按钮即可,连接完毕后如下图所示,你就可以直接上传和下载文件了。
Vps FileZilla5.png
下一次打开 FileZilla 时,直接到站点管理器,点击连接即可。

更新软件源 (不可跳过)

以下命令均需要使用 putty 登录到服务器远程执行命令操作,你可以直接复制下面的命令,然后点击 putty 窗口按鼠标右键,粘贴命令。
本步骤不可跳过,需要先执行,后面才可以继续,建议每次安装新软件时,都执行一遍本步骤。
输入如下命令更新软件源:
apt-get update
下面的提示不同的Linux的版本存在不同的差异,但有如下类似的提示时,表示更新成功:
root@241541:~# apt-get update
Get:1 http://archive.ubuntu.com maverick Release.gpg [198B]
Ign http://archive.ubuntu.com/ubuntu/ maverick/main Translation-en
Ign http://archive.ubuntu.com/ubuntu/ maverick/restricted Translation-en
Ign http://archive.ubuntu.com/ubuntu/ maverick/universe Translation-en
Get:2 http://archive.ubuntu.com maverick-updates Release.gpg [198B]
Ign http://archive.ubuntu.com/ubuntu/ maverick-updates/main Translation-en
Ign http://archive.ubuntu.com/ubuntu/ maverick-updates/restricted Translation-en
Ign http://archive.ubuntu.com/ubuntu/ maverick-updates/universe Translation-en
Get:3 http://archive.ubuntu.com maverick-security Release.gpg [198B]
Ign http://archive.ubuntu.com/ubuntu/ maverick-security/main Translation-en
Ign http://archive.ubuntu.com/ubuntu/ maverick-security/restricted Translation-en
Ign http://archive.ubuntu.com/ubuntu/ maverick-security/universe Translation-en
Get:4 http://archive.ubuntu.com maverick Release [39.8kB]
Get:5 http://archive.ubuntu.com maverick-updates Release [31.4kB]
Get:6 http://archive.ubuntu.com maverick-security Release [31.4kB]
Get:7 http://archive.ubuntu.com maverick/main i386 Packages [1492kB]
Get:8 http://archive.ubuntu.com maverick/restricted i386 Packages [5992B]
Get:9 http://archive.ubuntu.com maverick/universe i386 Packages [5791kB]
Get:10 http://archive.ubuntu.com maverick-updates/main i386 Packages [380kB]
Get:11 http://archive.ubuntu.com maverick-updates/restricted i386 Packages [1797B]
Get:12 http://archive.ubuntu.com maverick-updates/universe i386 Packages [157kB]
Get:13 http://archive.ubuntu.com maverick-security/main i386 Packages [157kB]
Get:14 http://archive.ubuntu.com maverick-security/restricted i386 Packages [14B]
Get:15 http://archive.ubuntu.com maverick-security/universe i386 Packages [77.9kB]
Fetched 8166kB in 4s (1724kB/s)
Reading package lists... Done

如果看到如下的提示
W: GPG 错误:http://security.ubuntu.com trusty-security Release: 由于没有公钥,无法验证下列签名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
W: GPG 错误:http://archive.canonical.com trusty Release: 由于没有公钥,无法验证下列签名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
W: GPG 错误:http://archive.ubuntu.com trusty Release: 由于没有公钥,无法验证下列签名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
W: GPG 错误:http://archive.ubuntu.com trusty-updates Release: 由于没有公钥,无法验证下列签名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
请执行以下代码,导入秘钥,重新执行更新软件源:
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 40976EAF437D05B5
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 3B4FE6ACC0B21F32
apt-get update

如果VPS有启用IPv6,有可能长时间执行这个没有反应,请输入 Ctrl + C 中断上面的命令。先执行如下命令,使IPV4优先:
全部关闭 IPv6:
echo "precedence ::ffff:0:0/96  100">> /etc/gai.conf
仅仅针对 apt-get 关闭IPv6,仅 Ubuntu 14.04 以上版本有效:
echo "Acquire::ForceIPv4 true;"> /etc/apt/apt.conf.d/99force-ipv4
执行完毕上面的命令后,重新运行 apt-get update 来更新软件源即可。

安装常用软件 (不可跳过)

VPS里面缺乏一些常用工具软件,一次安装好:
输入如下命令安装解压缩、下载和数据同步以及系统日志软件:
apt-get install unzip zip wget rsync
如果提示如下命令,表示之前已经安装好:
root@241541:~# apt-get install unzip zip wget rsync 
Reading package lists... Done
Building dependency tree
Reading state information... Done
unzip is already the newest version.
wget is already the newest version.
rsync is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 26 not upgraded.
如果之前没有安装会提示如下命令,表示已经安装好
root@241541:~# apt-get install unzip zip wget rsync
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
rsync unzip wget zip
0 upgraded, 4 newly installed, 0 to remove and 26 not upgraded.
Need to get 319kB/1125kB of archives.
After this operation, 2314kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ maverick/main zip i386 3.0-3 [319kB]
Fetched 319kB in 0s (417kB/s)
Selecting previously deselected package wget.
(Reading database ... 22549 files and directories currently installed.)
Unpacking wget (from .../wget_1.12-1.1ubuntu3_i386.deb) ...
Selecting previously deselected package rsync.
Unpacking rsync (from .../rsync_3.0.7-2ubuntu1.1_i386.deb) ...
Selecting previously deselected package unzip.
Unpacking unzip (from .../archives/unzip_6.0-4_i386.deb) ...
Selecting previously deselected package zip.
Unpacking zip (from .../archives/zip_3.0-3_i386.deb) ...
Setting up wget (1.12-1.1ubuntu3) ...
Setting up rsync (3.0.7-2ubuntu1.1) ...
Setting up unzip (6.0-4) ...
Setting up zip (3.0-3) ...

使用 Apache 搭建站点

Apache 是最常见的 Web 服务器,功能强大。如果希望使用轻量级的 Nginx ,可以跳过此部分,直接转到指南的 nginx 部分来安装。

安装 Apache2 Web 服务

VPS 默认有安装Apache2,但如果你删除了,就需要重新安装;如果没有删除,执行下面的命令会退出来,不会对系统产生任何影响。
输入如下命令安装
apt-get install apache2
正常情况下会给出如下提示,说明Apache2默认已经安装好了:
root@241541:~# apt-get install apache2
Reading package lists... Done
Building dependency tree... Done
apache2 is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

开启 Apache2 的伪静态

如果希望开启Apache2 伪静态 rewrite 支持,输入如下命令安装
a2enmod rewrite
正常情况下会给出如下提示,说明已经安装成功:
root@241541:~# a2enmod rewrite
Module rewrite installed; run /etc/init.d/apache2 force-reload to enable.
提示需要重新加载Apache2的配置,由于下一步是安装mysql,所以暂时不用重启。
或出现如下提示,表示已经开启了 rewrite
root@241541:~# a2enmod rewrite
Mudule rewrite already enabled

安装 mysql 数据库服务

MySQL 是 Linux 下最常用的开源数据库。
输入如下命令安装mysql
apt-get install mysql-server
如果输入正确,会提示如下信息,
root@241541:~# apt-get install mysql-server
Reading package lists... Done
Building dependency tree... Done
The following extra packages will be installed:
libdbd-mysql-perl libdbi-perl libhtml-template-perl libmysqlclient16
libnet-daemon-perl libplrpc-perl mysql-client-5.1 mysql-client-core-5.1
mysql-common mysql-server-5.1 mysql-server-core-5.1
Suggested packages:
libipc-sharedcache-perl libterm-readkey-perl tinyca
The following NEW packages will be installed:
libdbd-mysql-perl libdbi-perl libhtml-template-perl libmysqlclient16
libnet-daemon-perl libplrpc-perl mysql-client-5.1 mysql-client-core-5.1
mysql-common mysql-server mysql-server-5.1 mysql-server-core-5.1
0 upgraded, 12 newly installed, 0 to remove and 26 not upgraded.
Need to get 22.9MB of archives.
After this operation, 54.4MB of additional disk space will be used.
Do you want to continue[Y/n]?
输入 Y 回车,继续安装 会提示输入 mysql 的 root 用户密码,你可以输入密码后回车,也可以不输入任何密码直接回车。 (不输入密码不会影响到Mysql的安全性,因为Mysql仅仅用于本地监听,但不输入密码会导致后续phpmyadmin无法运行)
Vps Mysql1.png
需要重新输入一遍密码,如下图所示:
Vps Mysql2.png
最后提示如下界面,表示mysql安装成功。
Vps Mysql3.png

mysql 数据库管理

对于mysql数据库维护可以使用下面指南中安装的 phpmyadmin 进行维护,或直接在 putty 中输入 mysql -p 进行管理如图所示:
Vps mysql1.png
在 mysql> 的提示符下输入 quit 回车,将退出 mysql 命令,返回到正常操作提示符。

mysql 数据库优化

如果你的VPS的内存只有512M,请按如下步骤进行优化,如果是1G或以上可以忽略本步骤。执行本步骤可以将Mysql的占用内存由150M降到100M。
输入如下命令配置 Mysql
cp /etc/mysql/my.cnf /etc/mysql/my.cnf.`date +%s`
find /usr/share/doc/mysql* -name my-small.cnf -exec cp {} /etc/mysql/my.cnf \;
sed -i 's/\[mysqld\]/&\nuser = mysql\n/' /etc/mysql/my.cnf
执行结果如下所示:
root@241541:~# cp /etc/mysql/my.cnf /etc/mysql/my.cnf.`date +%s`
root@241541:~# find /usr/share/doc/mysql* -name my-small.cnf -exec cp {} /etc/mysql/my.cnf \;
root@241541:~# sed -i 's/\[mysqld\]/&\nuser = mysql\n/' /etc/mysql/my.cnf
重启下 Mysql服务:
service mysql restart
执行结果如下所示:

root@241541:~# service mysql restart
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service mysql restart

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the restart(8) utility, e.g. restart mysql
mysql start/running, process 9886

安装php环境

执行如下命令安装apache2的php5扩展和php的mysql扩展
apt-get install libapache2-mod-php5 php5-gd php5-mysql php5-curl php5-mcrypt php5-common php-apc
php5enmod mcrypt
如下提示:
root@241541:~# apt-get install libapache2-mod-php5 php5-gd php5-mysql php5-mcrypt php5-common php-apc
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
libgd2-xpm libjpeg62 libt1-5 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6
libxpm4 php5-cli php5-common php-apc
Suggested packages:
php-pear libgd-tools
The following NEW packages will be installed:
libapache2-mod-php5 libgd2-xpm libjpeg62 libt1-5 libx11-6 libx11-data
libxau6 libxcb1 libxdmcp6 libxpm4 php5-cli php5-common php5-gd php5-mysql php5-mcrypt
0 upgraded, 15 newly installed, 0 to remove and 26 not upgraded.
Need to get 8128kB of archives.
After this operation, 22.7MB of additional disk space will be used.
Do you want to continue[Y/n]?
输入 Y,回车继续,以下表示安装完成。
Vps php1.png
重新启动apache2, 输入如下命令:
service apache2 restart
提示如下,表示启动成功:
root@241541:~# service apache2 restart
* Restarting web server apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 0.3.175.133 for ServerName
[ OK ]

测试站点

以上命令已经完整安装好一台Web服务器所具有的环境,以下来搭建一个最简单的站点。
web 的根目录位于 /var/www/html 你可以将自己的程序直接放到此目录。

安装 phpsysinfo

使用putty登录到服务器,依次执行如下命令安装phpsysinfo:
cd /var/www/html
wget http://sourceforge.net/projects/phpsysinfo/files/phpsysinfo/3.0.13/phpsysinfo-3.0.13.tar.gz/download -O phpsysinfo-3.0.13.tar.gz
tar xzvf phpsysinfo-3.0.13.tar.gz
cd phpsysinfo
mv config.php.new config.php
执行完毕后,在浏览器的地址输入: http://184.82.9.30/phpsysinfo/ 查看,显示如下:
Vps phpsysinfo.png

安装 php 探针

使用putty登录到服务器,依次执行如下命令安装:
cd /var/www/html
wget http://www.yahei.net/tz/tz.zip
unzip tz.zip
运行结果如下所示:
root@241541:~# cd /var/www/html
root@241541:/var/www/html# wget http://www.yahei.net/tz/tz.zip
--2011-08-13 09:18:40-- http://www.yahei.net/tz/tz.zip
Resolving www.yahei.net... 110.34.192.14
Connecting to www.yahei.net|110.34.192.14|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16087(16K)[application/zip]
Saving to: `tz.zip'

100%[======================================>] 16,087 --.-K/s in 0.07s

2011-08-13 09:18:41 (152 KB/s) - `tz.zip' saved [16,087/16,087]

root@241541:/var/www/html# unzip tz.zip
Archive: tz.zip
inflating: tz.php
执行完毕后,在浏览器的地址输入: http://184.82.9.30/tz.php 查看,显示如下:
Vps tz1.png

安装 phpmyadmin

安装phpmyadmin,需要mysql事先配置好root的密码。
使用putty登录到服务器,执行下面安装
apt-get install phpmyadmin
提示如下:
root@241541:~# apt-get install phpmyadmin
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
dbconfig-common javascript-common libjs-mootools libmcrypt4 php5-mcrypt
wwwconfig-common
Suggested packages:
libmcrypt-dev mcrypt postgresql-client apache apache-ssl
The following NEW packages will be installed:
dbconfig-common javascript-common libjs-mootools libmcrypt4 php5-mcrypt
phpmyadmin wwwconfig-common
0 upgraded, 7 newly installed, 0 to remove and 26 not upgraded.
Need to get 5184kB of archives.
After this operation, 21.3MB of additional disk space will be used.
Do you want to continue[Y/n]?
输入 Y, 回车继续。
Attention niels epting.svg 按 空格键 选择 Apche2 如下图:
Vps phpmyadmin1.png
选择完毕后,回车继续,提示如下图,是否需要创建phpmyadmin数据库,
Vps phpmyadmin2.png
直接回车继续,提示输入mysql的管理员密码,输入后如下所示:
Vps phpmyadmin3.png
回车继续后,如下图,提示输入phpmyadmin连接数据的密码,直接回车由系统随机产生一个即可。
Vps phpmyadmin4.png
完成安装提示如下:
Vps phpmyadmin5.png
现在访问如下地址测试: http://184.82.9.30/phpmyadmin/
如果打开提示 404 错误,即 Not Found ,在putty里面执行如下命令:
ln -s /usr/share/phpmyadmin /var/www/html/
然后再访问,如下:
Vps phpmyadmin6.png
输入mysql的root帐号和mysql的密码,点击 执行 进行登录,进行正常访问如下:
Vps phpmyadmin7.png

配置虚拟站点

假设前提: 你有一个域名 test.com ,你希望搭建两个站点,第一个站点是 www.test.com 和 test.com 为主页,同时希望提供 bbs.test.com 为论坛。
注意,下面的文档对多个不同的域名也是适用的。

配置域名

去域名商提供的面板将 test.com 域名的 A 记录修改为 VPS 的 IP.

上传程序

约定两个站点的目录如下,为了方便备份,站点的目录最好集中存放在 /var/www/html 目录。
www.test.com(test.com) 对应目录: /var/www/html/test
bbs.test.com 对应目录: /var/www/html/bbs
假设主站点安装帝国的CMS程序,论坛采用DZ的论坛,程序需要下载UTF-8的版本。
Vps ApacheSite1.png
使用前面提到的上传方法,利用 FileZilla 连接服务器,创建这两个目录。
Vps ApacheSite2.png
如果找不到如上图的目录,请点击 / 即可看到了。
Vps ApacheSiteFile4.png
创建目录后,分别上传程序,如下:
Vps ApacheSite3.png

多域名配置

这里推荐编辑器直接使用记事本,不要使用其他的高级编辑器。
注意下面的 DocumentRoot /var/www/html/test/ 中的 /var/www/html/test/ 应该修改为你上传站点的文件目录。
编辑www.test.com的站点配置文件test.com.txt ,其中站点 http://www.test.com 和 http://test.com 的网站目录为 /var/www/html/test/
<VirtualHost *:80>
ServerName www.test.com
ServerAlias test.com
DocumentRoot /var/www/html/test/
</VirtualHost>
编辑bbs.test.com的站点配置文件 bbs.test.com.txt , 其中站点 bbs.test.com 的网站目录为 /var/www/html/bbs/
<VirtualHost *:80>
ServerName bbs.test.com
DocumentRoot /var/www/html/bbs/
</VirtualHost>
如图所示:
Vps ApacheSite4.png
将这两个文件上传到 /etc/apache2/sites-enabled/ 目录
如图所示:
Vps ApacheSite5.png

Apache2 伪静态

有两种方法做伪静态,一种是用 .htaccess 文件。 例如将上面的 bbs.test.com 的站点配置文件编辑为如下:
<VirtualHost *:80>
ServerName bbs.test.com
DocumentRoot /var/www/html/bbs/
<Directory /var/www/html/bbs/>
AllowOverride AuthConfig
</Directory>
</VirtualHost>
重新上传,重启 apache2 后, 然后将准备好的 .htaccess 文件放到对应的 /var/www/html/bbs/ 网站根目录即可。
另外一种是直接加入到配置文件,如下:
<VirtualHost *:80>
ServerName bbs.test.com
DocumentRoot /var/www/html/bbs/
#伪静态代码段开始
<Directory /var/www/html/bbs/>
...............................
</Directory>
#伪静态代码段结束
</VirtualHost>
下面是常用的一些伪静态配置,复制出来,保存为 .htaccess 文件,或 插入到站点的配置文件最后一行 <Directory> 和 </Directory> 之间。
Discuz!X 在 Apche2 下的伪静态配置如下:
          RewriteEngine On
RewriteRule ^forum-(\w+)-([0-9]+)\.html$ forum.php?mod=forumdisplay&fid=$1&page=$2
RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ forum.php?mod=viewthread&tid=$1&extra=page\%3D$3&page=$2
RewriteRule ^topic-(.+)\.html$ portal.php?mod=topic&topic=$1
RewriteRule ^article-([0-9]+)\.html$ portal.php?mod=article&articleid=$1
RewriteRule ^group-([0-9]+)-([0-9]+)\.html$ forum.php?mod=group&fid=$1&page=$2
RewriteRule ^space-(username|uid)-(.+)\.html$ home.php?mod=space&$1=$2
RewriteRule ^([a-z]+)-(.+)\.html$ $1.php?rewrite=$2

将这一段代码加入到上面的站点配置文件中,如下:
<VirtualHost *:80>
ServerName bbs.test.com
DocumentRoot /var/www/html/bbs/
<Directory /var/www/html/bbs/>
RewriteEngine On
RewriteRule ^forum-(\w+)-([0-9]+)\.html$ forum.php?mod=forumdisplay&fid=$1&page=$2
RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ forum.php?mod=viewthread&tid=$1&extra=page\%3D$3&page=$2
RewriteRule ^topic-(.+)\.html$ portal.php?mod=topic&topic=$1
RewriteRule ^article-([0-9]+)\.html$ portal.php?mod=article&articleid=$1
RewriteRule ^group-([0-9]+)-([0-9]+)\.html$ forum.php?mod=group&fid=$1&page=$2
RewriteRule ^space-(username|uid)-(.+)\.html$ home.php?mod=space&$1=$2
RewriteRule ^([a-z]+)-(.+)\.html$ $1.php?rewrite=$2
</Directory>
</VirtualHost>
WordPress 在 Apache2 下的伪静态配置如下:
<Directory />
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>

ECShop 在 Apache2 下的伪静态配置如下:
<Directory />
RewriteEngine On
RewriteRule ^(.*)/index.html$ $1/index\.php [I]
RewriteRule ^(.*)/category$ $1/index\.php [I]
RewriteRule ^(.*)/feed-c([0-9]+).xml$ $1/feed\.php\?cat=$2 [I]
RewriteRule ^(.*)/feed-b([0-9]+).xml$ $1/feed\.php\?brand=$2 [I]
RewriteRule ^(.*)/feed-type([^-]+)\.xml$ $1/feed\.php\?type=$2 [I]
RewriteRule ^(.*)/feed.xml$ $1/feed\.php [I]
RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$ $1/category\.php\?id=$2&brand=$3&price_min=$4&price_max=$5&filter_attr=$6&page=$7&sort=$8&order=$9 [I]
RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)\.html$ $1/category\.php\?id=$2&brand=$3&price_min=$4&price_max=$5&filter_attr=$6 [I]
RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$ $1/category\.php\?id=$2&brand=$3&page=$4&sort=$5&order=$6 [I]
RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)-([0-9]+)(.*)\.html$ $1/category\.php\?id=$2&brand=$3&page=$4 [I]
RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)(.*)\.html$ $1/category\.php\?id=$2&brand=$3 [I]
RewriteRule ^(.*)/category-([0-9]+)(.*)\.html$ $1/category\.php\?id=$2 [I]
RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)\.html(.*)$ $1/category\.php\?$4&id=$2&brand=$3
RewriteRule ^(.*)/goods-([0-9]+)(.*)\.html$ $1/goods\.php\?id=$2 [I]
RewriteRule ^(.*)/article_cat-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$ $1/article_cat\.php\?id=$2&page=$3&sort=$4&order=$5 [I]
RewriteRule ^(.*)/article_cat-([0-9]+)-([0-9]+)(.*)\.html$ $1/article_cat\.php\?id=$2&page=$3 [I]
RewriteRule ^(.*)/article_cat-([0-9]+)(.*)\.html$ $1/article_cat\.php\?id=$2 [I]
RewriteRule ^(.*)/article-([0-9]+)(.*)\.html$ $1/article\.php\?id=$2 [I]
RewriteRule ^(.*)/brand-([0-9]+)-c([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)\.html $1/brand\.php\?id=$2&cat=$3&page=$4&sort=$5&order=$6 [I]
RewriteRule ^(.*)/brand-([0-9]+)-c([0-9]+)-([0-9]+)(.*)\.html $1/brand\.php\?id=$2&cat=$3&page=$4 [I]
RewriteRule ^(.*)/brand-([0-9]+)-c([0-9]+)\.html(.*)$ $1/brand\.php\?$4&id=$2&cat=$3 [I]
RewriteRule ^(.*)/brand-([0-9]+)-c([0-9]+)(.*)\.html $1/brand\.php\?id=$2&cat=$3 [I]
RewriteRule ^(.*)/brand-([0-9]+)(.*)\.html $1/brand\.php\?id=$2 [I]
RewriteRule ^(.*)/tag-(.*)\.html $1/search\.php\?keywords=$2 [I]
RewriteRule ^(.*)/snatch-([0-9]+)\.html$ $1/snatch\.php\?id=$2 [I]
RewriteRule ^(.*)/group_buy-([0-9]+)\.html$ $1/group_buy\.php\?act=view&id=$2 [I]
RewriteRule ^(.*)/auction-([0-9]+)\.html$ $1/auction\.php\?act=view&id=$2 [I]
RewriteRule ^(.*)/exchange-id([0-9]+)(.*)\.html$ $1/exchange\.php\?id=$2&act=view [I]
RewriteRule ^(.*)/exchange-([0-9]+)-min([0-9]+)-max([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$ $1/exchange\.php\?cat_id=$2&integral_min=$3&integral_max=$4&page=$5&sort=$6&order=$7 [I]
RewriteRule ^(.*)/exchange-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$ $1/exchange\.php\?cat_id=$2&page=$3&sort=$4&order=$5 [I]
RewriteRule ^(.*)/exchange-([0-9]+)-([0-9]+)(.*)\.html$ $1/exchange\.php\?cat_id=$2&page=$3 [I]
RewriteRule ^(.*)/exchange-([0-9]+)(.*)\.html$ $1/exchange\.php\?cat_id=$2 [I]
</Directory>

修改上传文件权限

由于上传的文件的所有者为 root ,Apache 无法正常写入,所以需要设置上传文件的宿主为 www-data。
使用putty登录vps执行如下命令,设置 /var/www下的所有文件的宿主都是 www-data,这样apache2就可以正常读写:
chown -R www-data:www-data /var/www
service apache2 restart
执行结果如下所示:
root@241541:~# chown -R www-data:www-data /var/www
root@241541:~# service apache2 restart
* Restarting web server apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 0.3.175.133 for ServerName
... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 0.3.175.133 for ServerName
[ OK ]

安装配置

主站点程序访问 http://www.test.com 如下图所示,进一步安装:
Vps ApacheSite8.png
论坛程序访问 http://bbs.test.com 如下图所示,进一步安装:
Vps ApacheSite7.png
以上就是完成多域名的配置。

Apache2 301 跳转

如果希望将 test.com 跳转到 www.test.com ,如下配置 test.com.txt 上传到 /etc/apache2/sites-enabled/ 目录即可。
<VirtualHost *:80>
ServerName test.com
RewriteCond %{HTTP_HOST} ^test\.com [NC]
RewriteRule ^(.*)$ http://www.test.com/$1[L,R=301]
</VirtualHost>
当然你也可以去 test.com 的域名那里设置 301 跳转。

Apache2 优化

请一定要执行本步骤,不要认为小站,访问的人数少,有时候蜘蛛会按照超过20个以上的并发抓取数据,直接爆掉vps。表现为:可以ping,但网站打不开、数据库连不上或无法ssh。
为了防止Vps被大的访问量爆掉,需要限制并发数,这里#1 VPS 调整为10, #2可以将下面的10修改为20,#3为30,以此类推。
也可以根据指南最后的压力测试来确定最大并发数,确定后,将下面的命令中的 10 改为你确定的并发数即可,其它数值如 5 不要修改。
请复制命令后到putty直接按鼠标右键粘贴执行:
sed -i -e "s/^[[:blank:]]*StartServers[[:blank:]]*.*/StartServers       5/"\
-e "s/^[[:blank:]]*MinSpareServers[[:blank:]]*.*/MinSpareServers 5/"\
-e "s/^[[:blank:]]*MaxSpareServers[[:blank:]]*.*/MaxSpareServers 10/"\
-e "s/^[[:blank:]]*ServerLimit[[:blank:]]*.*/ServerLimit 10/"\
-e "s/^[[:blank:]]*MaxClients[[:blank:]]*.*/MaxClients 10/"\
-e "s/^[[:blank:]]*MinSpareThreads[[:blank:]]*.*/MinSpareThreads 5/"\
-e "s/^[[:blank:]]*MaxSpareThreads[[:blank:]]*.*/MaxSpareThreads 10/" /etc/apache2/apache2.conf
执行完毕后后,再执行以下命令,重启下apache2。
service apache2 restart
执行结果如下所示:
root@241541:~# sed -i -e "s/^[[:blank:]]*StartServers[[:blank:]]*.*/StartServers       5/"\
> -e "s/^[[:blank:]]*MinSpareServers[[:blank:]]*.*/MinSpareServers 5/" \
> -e "s/^[[:blank:]]*MaxSpareServers[[:blank:]]*.*/MaxSpareServers 10/" \
> -e "s/^[[:blank:]]*ServerLimit[[:blank:]]*.*/ServerLimit 10/" \
> -e "s/^[[:blank:]]*MaxClients[[:blank:]]*.*/MaxClients 10/" \
> -e "s/^[[:blank:]]*MinSpareThreads[[:blank:]]*.*/MinSpareThreads 5/" \
> -e "s/^[[:blank:]]*MaxSpareThreads[[:blank:]]*.*/MaxSpareThreads 10/" /etc/apache2/apache2.conf
root@241541:~# service apache2 restart
* Restarting web server apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 0.4.54.225 for ServerName
... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 0.4.54.225 for ServerName
[ OK ]

查看 Apache2 日志

Apache2的日志放在 /var/log/apache2/ 目录下,可以直接使用filezilla去下载下来看。

使用 Nginx 搭建站点

为什要使用 nginx?因为 apache 太耗内存了,使用 nginx 可以节约内存。
采用 nginx + php-fpm + mysql 搭建。

删除 apache2

使用putty登录vps,执行如下命令:
输入如下命令关闭 apache2
service apache2 stop
如果输入正确,会提示如下信息,表示apache2已经停止
root@241541:~# service apache2 stop
* Stopping web server apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 0.3.175.133 for ServerName
... waiting [ OK ]
输入如下命令删除 apache2
apt-get remove apache2 apache2.2-common
出现类似如下提示时,输入 Y 并回车。
0 upgraded, 1 newly installed, 7 to remove and 26 not upgraded.
Need to get 5837kB of archives.
After this operation, 14.5MB disk space will be freed.
Do you want to continue [Y/n]?
最后会出现如下提示,表示已经删除 apache2
Removing libapache2-mod-php5 ...
Module php5 disabled.
Run '/etc/init.d/apache2 restart' to activate new configuration!
Removing apache2-mpm-prefork ...
* Stopping web server apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 0.3.175.133 for ServerName
... waiting [ OK ]
Removing apache2.2-common ...
Removing apache2-utils ...
Removing apache2.2-bin ...

安装 php5-fpm php5-cgi

安装 php5-fpm 执行如下命令:
apt-get install php5-cgi php5-fpm php5-gd php5-mysql php5-curl php5-mcrypt php5-common php-apc
php5enmod mcrypt
出现下面的提示表示安装成功
root@241541:~# apt-get install php5-cgi php5-fpm php5-gd php5-mysql php5-mcrypt php5-common php-apc
Reading package lists... Done
Building dependency tree
Reading state information... Done
php5-cgi is already the newest version.
php5-cgi set to manually installed.
Suggested packages:
php-pear
The following NEW packages will be installed:
libevent-1.4-2 php5-fpm
0 upgraded, 2 newly installed, 0 to remove and 26 not upgraded.
Need to get 3002kB of archives.
After this operation, 7967kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ maverick/main libevent-1.4-2 i386 1.4.13-stable-1 [56.2kB]
Get:2 http://archive.ubuntu.com/ubuntu/ maverick-updates/universe php5-fpm i386 5.3.3-1ubuntu9.5 [2946kB]
Fetched 3002kB in 1s (2181kB/s)
Selecting previously deselected package libevent-1.4-2.
(Reading database ... 21902 files and directories currently installed.)
Unpacking libevent-1.4-2 (from .../libevent-1.4-2_1.4.13-stable-1_i386.deb) ...
Selecting previously deselected package php5-fpm.
Unpacking php5-fpm (from .../php5-fpm_5.3.3-1ubuntu9.5_i386.deb) ...
Setting up libevent-1.4-2 (1.4.13-stable-1) ...
Setting up php5-fpm (5.3.3-1ubuntu9.5) ...
update-rc.d: warning: php5-fpm stop runlevel arguments (01 6)do not match LSB Default-Stop values (none)
* Starting PHP5 FPM... Aug 13 06:25:50.352643 [WARNING][pool www] pm.start_servers is not set. It's been set to 20.
[ OK ]

Creating config file /etc/php5/fpm/php.ini with new version
Processing triggers for libc-bin ...
ldconfig deferred processing now taking place
安装完毕后,我们调整下 php5-fpm 使其采用 127.0.0.1:9000 进行监听,执行如下命令:
sed -i -e 's/listen =.*$/listen = 127.0.0.1:9000/' `grep -R -l listen /etc/php5/fpm`
完毕后,重启下 php5-fpm,执行如下命令重启
service php5-fpm restart 
出现如下提示,表示重启成功
root@241541:~# service php5-fpm restart
php5-fpm stop/waiting
php5-fpm start/running, process 6899

安装 mysql

安装 nginx

使用putty登录vps,执行如下命令:
apt-get install nginx
出现如下提示,表示已经安装完毕:
root@241541:~# apt-get install nginx
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
ufw
The following NEW packages will be installed:
nginx
0 upgraded, 1 newly installed, 0 to remove and 26 not upgraded.
Need to get 341kB of archives.
After this operation, 827kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ maverick/universe nginx i386 0.7.67-3ubuntu1 [341kB]
Fetched 341kB in 0s (437kB/s)
Selecting previously deselected package nginx.
(Reading database ... 21918 files and directories currently installed.)
Unpacking nginx (from .../nginx_0.7.67-3ubuntu1_i386.deb) ...
Setting up nginx (0.7.67-3ubuntu1) ...
再执行下面的命令启动nginx服务:
service nginx start
结果如下所示,表示nginx顺利启动:
root@241541:~# service nginx start
Starting nginx: nginx.

测试站点

由于nginx默认的站点不支持php,所以需要修改默认站点。
编辑文件名为 default.txt ,注意下面的 server_name 修改为你的vps的ip地址,可以写一个IP,也可以都写上,IP和IP之间有空格。
配置文件中的 root 就是站点的目录了,可以更改为你的站点的路径。
server	{
listen 80;
server_name 184.82.9.30 184.82.9.31;
index index.html index.htm index.php;
root /var/www/;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}

将 default.txt 文件使用 filezilla 上传到 /etc/nginx/sites-enabled 目录下
使用 putty 登录vps,输入如下命令重启 nginx 服务
service nginx restart
重启结果如下所示:
root@241541:~# service nginx restart
Restarting nginx: nginx.

安装phpsysinfo

按照前面apache2讲述的安装

安装 php 探针

安装 phpmyadmin

照前面 Apache2 安装 phpmyadmin, 注意第二步不要再按空格选择 apache2 , 直接回车下一步。
如果已经之前已经安装过 phpmyadmin ,不需要删除,继续使用。
安装完毕 phpmyadmin 后, 继续在 putty 里面执行如下命令即可:
cd /var/www
ln -s /usr/share/phpmyadmin .
执行情况如下所示:
root@241541:~# cd /var/www
root@241541:/var/www# ln -s /usr/share/phpmyadmin .
root@241541:/var/www#
然后就可以在浏览器里面访问 phpmyadmin 了。 访问地址: http://184.82.9.30/phpmyadmin/

配置虚拟站点

以上运行环境均已经安装完毕,下面讲如何配置 nginx 的多域名。
假设前提: 你有一个域名 test.com ,你希望搭建两个站点,第一个站点是 www.test.com 和 test.com 为主页,同时希望提供 bbs.test.com 为论坛。
下面的文档对多个不同的域名也是适用的。

配置域名

参考上面 apache2 的配置域名部分。

上传程序

参考上面 apache2 的上传程序部分。

多域名配置

这里推荐编辑器直接使用记事本,不要使用其他的高级编辑器。
编辑www.test.com的站点配置文件 test.com.txt
server	{
listen 80;
server_name www.test.com test.com;
index index.html index.htm index.php;
root /var/www/test/;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}

编辑bbs.test.com的站点配置文件 bbs.test.com.txt
server	{
listen 80;
server_name bbs.test.com;
index index.html index.htm index.php;
root /var/www/bbs/;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}

将这两个文件使用 filezilla 上传到 /etc/nginx/sites-enabled/ 目录

Nginx 伪静态

下面是常用的一些伪静态配置,复制出来,插入到站点的配置文件最后一个 } 号之前,如下:
server	{
listen 80;
server_name bbs.test.com;
index index.html index.htm index.php;
root /var/www/bbs/;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
#伪静态代码段开始
location / {
...............................
}
#伪静态代码段结束
}
Discuz!X 在 Nginx 下的伪静态配置如下:
location / {
rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last;
}
将这一段代码加入到上面的站点配置文件中,例如:
server	{
listen 80;
server_name bbs.test.com;
index index.html index.htm index.php;
root /var/www/bbs/;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
location / {
rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last;
}
}
WordPress 在 Nginx 下的伪静态配置如下:
location / {
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}

ECShop 在 Nginx 下的伪静态配置如下:
location / {
if (!-e $request_filename) {
rewrite "^/index\.html" /index.php last;
rewrite "^/category$" /index.php last;
rewrite "^/feed-c([0-9]+)\.xml$" /feed.php?cat=$1 last;
rewrite "^/feed-b([0-9]+)\.xml$" /feed.php?brand=$1 last;
rewrite "^/feed\.xml$" /feed.php last;
rewrite "^/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8 last;
rewrite "^/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)(.*)\.html$" /category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5 last;
rewrite "^/category-([0-9]+)-b([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /category.php?id=$1&brand=$2&page=$3&sort=$4&order=$5 last;
rewrite "^/category-([0-9]+)-b([0-9]+)-([0-9]+)(.*)\.html$" /category.php?id=$1&brand=$2&page=$3 last;
rewrite "^/category-([0-9]+)-b([0-9]+)(.*)\.html$" /category.php?id=$1&brand=$2 last;
rewrite "^/category-([0-9]+)(.*)\.html$" /category.php?id=$1 last;
rewrite "^/goods-([0-9]+)(.*)\.html" /goods.php?id=$1 last;
rewrite "^/article_cat-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /article_cat.php?id=$1&page=$2&sort=$3&order=$4 last;
rewrite "^/article_cat-([0-9]+)-([0-9]+)(.*)\.html$" /article_cat.php?id=$1&page=$2 last;
rewrite "^/article_cat-([0-9]+)(.*)\.html$" /article_cat.php?id=$1 last;
rewrite "^/article-([0-9]+)(.*)\.html$" /article.php?id=$1 last;
rewrite "^/brand-([0-9]+)-c([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)\.html" /brand.php?id=$1&cat=$2&page=$3&sort=$4&order=$5 last;
rewrite "^/brand-([0-9]+)-c([0-9]+)-([0-9]+)(.*)\.html" /brand.php?id=$1&cat=$2&page=$3 last;
rewrite "^/brand-([0-9]+)-c([0-9]+)(.*)\.html" /brand.php?id=$1&cat=$2 last;
rewrite "^/brand-([0-9]+)(.*)\.html" /brand.php?id=$1 last;
rewrite "^/tag-(.*)\.html" /search.php?keywords=$1 last;
rewrite "^/snatch-([0-9]+)\.html$" /snatch.php?id=$1 last;
rewrite "^/group_buy-([0-9]+)\.html$" /group_buy.php?act=view&id=$1 last;
rewrite "^/auction-([0-9]+)\.html$" /auction.php?act=view&id=$1 last;
rewrite "^/exchange-id([0-9]+)(.*)\.html$" /exchange.php?id=$1&act=view last;
rewrite "^/exchange-([0-9]+)-min([0-9]+)-max([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /exchange.php?cat_id=$1&integral_min=$2&integral_max=$3&page=$4&sort=$5&order=$6 last;
rewrite "^/exchange-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /exchange.php?cat_id=$1&page=$2&sort=$3&order=$4 last;
rewrite "^/exchange-([0-9]+)-([0-9]+)(.*)\.html$" /exchange.php?cat_id=$1&page=$2 last;
rewrite "^/exchange-([0-9]+)(.*)\.html$" /exchange.php?cat_id=$1 last;
}
}

修改上传文件权限

由于上传的文件的所有者为 root ,Nginx 无法正常写入,所以需要设置上传文件的宿主为 www-data。
使用putty登录vps执行如下命令,设置 /var/www下的所有文件的宿主都是 www-data,这样nginx就可以正常读写:
chown -R www-data:www-data /var/www
service nginx restart
执行结果如下所示:
root@241541:~# chown -R www-data:www-data /var/www
root@195669:~# service nginx restart
Restarting nginx: nginx.

安装配置

见 apache2 的安装配置部分

nginx 301 跳转

如果希望将 test.com 跳转到 www.test.com ,如下配置 test.com.txt 上传到 /etc/nginx/sites-enabled/ 目录即可。
server {
listen 80;
server_name test.com;
rewrite ^/(.*) http://www.test.com/$1 permanent;
}
当然你也可以去 test.com 的域名那里设置 301 跳转。

nginx 优化

请一定要执行本步骤,不要认为小站,访问的人数少,有时候蜘蛛会按照超过20个以上的并发抓取数据,直接爆掉vps。表现为:可以ping,但网站打不开、数据库连不上或无法ssh。
为了防止Vps被大的访问量爆掉,需要限制并发数,这里#1 VPS 调整为10, #2可以将下面的10修改为20,#3为30,以此类推。
也可以根据指南最后的压力测试来确定最大并发数,确定后,将下面的命令中的 10 改为你确定的并发数即可,其它数值如 5 不要修改。
因为命令中包括了 ` 号,所以请复制命令后到putty直接按鼠标右键粘贴执行:
sed -i -e 's/pm.max_children =.*$/pm.max_children = 10/' `grep -R -l pm.max_children /etc/php5/fpm`
sed -i -e 's/pm.start_servers =.*$/pm.start_servers = 5/' `grep -R -l pm.max_children /etc/php5/fpm`
sed -i -e 's/pm.max_spare_servers =.*$/pm.max_spare_servers = 10/' `grep -R -l pm.max_children /etc/php5/fpm`
执行完毕后,重启下 php-fpm 服务:
service php5-fpm restart

nginx 限制同一IP的并发数和连接流量

在终端执行下面语句开启nginx并发支持:
echo "limit_conn_zone \$binary_remote_addr zone=one:10m;"> /etc/nginx/conf.d/limitconn.conf
然后打开虚拟站点配置文件,如编辑上面例子中的 bbs.test.com 站点配置文件 bbs.test.com.txt,
在 server_name bbs.test.com; 这一行下面插入如下:
 limit_conn one 20;
limit_rate 200k;
上面的20,标示同一IP的最大并发数为20。200k为连接的最大速度为200k。
注意,这里控制的流量是针对单一连接的,并不是同一IP的最大速度,其最大速度为200k*20=4000k。
最终修改后的结果如下所示:
server	{
listen 80;
server_name bbs.test.com;
limit_conn one 20;
limit_rate 200k;
index index.html index.htm index.php;
root /var/www/bbs/;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}
将上面的配置文件重新使用 filezilla 上传到 /etc/nginx/sites-enabled/ 目录,覆盖后,执行以下命令重启 nginx 使配置生效:
service nginx restart

查看 nginx 日志

Nginx的日志放在 /var/log/nginx/ 目录下,可以使用 filezilla 下载下来查看。

配置CDN或反向代理

我们需要将 www.test.com 或 test.com 的访问反向代理到 192.168.1.1 地址上。
1 执行如下命令来建立缓存目录和临时目录,这里默认为最大20g的缓存空间,可以根据你的实际情况增加或减小,修改地方为 max_size=20g;
mkdir /var/www/cache
mkdir /var/www/temp
chown -R www-data:www-data /var/www
echo "proxy_cache_path /var/www/cache levels=1:2 keys_zone=cache_one:100m inactive=7d max_size=20g;"> /etc/nginx/conf.d/cdn.conf
echo "proxy_temp_path /var/www/temp;">> /etc/nginx/conf.d/cdn.conf
2 编辑 www.test.com 站点的反向代理配置文件 test.com.txt 如下:
server	{
listen 80;
server_name www.test.com test.com;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Server;
proxy_pass http://192.168.1.1;
}
location ~ .*\.(gif|png|jpg|jpeg|swf|zip|gz|tar|bz2|rar|doc|txt|ico|cur)$ {
proxy_cache cache_one;
proxy_cache_valid 30d;
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_pass http://192.168.1.1;
}
location ~ .*\.(css|js)?$ {
proxy_cache cache_one;
proxy_cache_valid 1h;
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_pass http://192.168.1.1;
}
}
上面的配置中 "gif|png|jpg|jpeg|swf|zip|gz|tar|bz2|rar|doc|txt|ico|cur"的后缀缓存设置的为30天,css|js 后缀的为1小时,你可以根据实际需求调整 proxy_cache_valid 30d; 行最后的 30d 为其它的值,如缓存1天为: proxy_cache_valid 1d;
如果不需要缓存,直接设置为如下:
server	{
listen 80;
server_name www.test.com test.com;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Server;
proxy_pass http://192.168.1.1;
}
}
3 将这个文件使用 filezilla 上传到 /etc/nginx/sites-enabled/ 目录
4 执行下面的重启 nginx 命令,使配置生效。
service nginx restart
5 然后就可以去域名管理那里将 www.test.com test.com 的IP设置为VPS的IP即可。

反向代理 Google

由于谷歌需要 https 才可以访问,所以反向代理谷歌需要占用服务器的 https 443 端口。
1 产生 https 证书
apt-get install openssl
cd /etc/nginx/
openssl genrsa -out google.key 1024
openssl req -new -key google.key -out google.csr
openssl x509 -req -days 3650 -in google.csr -signkey google.key -out google.crt
2 建立配置文件 google.test.com.txt 这里用 google.test.com 来反向代理 google.com 如下:
server {
listen 80;
server_name google.test.com;
rewrite ^(.*) https://google.test.com$1 permanent;
}

server {
listen 443;
server_name google.test.com;
ssl on;
ssl_certificate /etc/nginx/google.crt;
ssl_certificate_key /etc/nginx/google.key;
location / {
proxy_redirect https://www.google.com.hk/ /;
proxy_cookie_domain google.com.hk google.test.com;
proxy_set_header Host www.google.com.hk;
proxy_pass https://www.google.com.hk;
}
}
3 将这个文件使用 filezilla 上传到 /etc/nginx/sites-enabled/ 目录
4 执行下面的重启 nginx 命令,使配置生效。
service nginx restart
5 然后就可以去域名管理那里将 google.test.com 的IP设置为VPS的IP即可。
6 完成,可以通过访问 https://google.test.com 来访问google了。

安装邮件服务器

注意:官方对架设邮件服务器非常限制,担心对外发垃圾邮件,一旦被举报,就直接封VPS,所以下面的配置中,我们将邮件通过 Gmail 的账号转发出去。
在 Putty 使用如下命令,安装 postfix,替换下面命令中的第一行 mydomain.com 为 你VPS上绑定的域名,如果有多个域名,选择其中一个即可。
hostname mydomain.com
apt-get -y install postfix mailutils libsasl2-2 ca-certificates libsasl2-modules
在弹出的对话框中,如果你的邮件服务器仅仅为你本地的程序使用,可以直接选择 Local only ,否则请选择其它选项。
安装完成后,请运行如下命令限制 postfix 为 10 个并发:
postconf -e default_process_limit=10
将邮件服务器采用gmail账号做邮件中转,首先你需要先有一个gmail的账号: USERNAME@gmail.com PASSWORD ,为了避免出现Gmail的图形验证登陆,你可以开启Gmail的账号的二次验证,然后创建一个应用密码,这样你可以采用应用密码来配置。
postconf -e relayhost=smtp.gmail.com:587
postconf -e smtp_sasl_auth_enable=yes
postconf -e smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd
postconf -e smtp_sasl_security_options=noanonymous
postconf -e smtp_tls_CAfile=/etc/ssl/certs/ca-certificates.crt
postconf -e smtp_use_tls=yes
下面的脚本中的 USERNAME 和 PASSWORD 单词请改为你正确的用户名和密码,
echo "smtp.gmail.com:587    USERNAME@gmail.com:PASSWORD"> /etc/postfix/sasl_passwd
chmod 400 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd
service postfix restart
完成了本地邮件服务器的搭建。
测试下:
echo "Test mail" | mail -s "Test" you@example.com
查看邮件投递日志:
tail /var/log/mail.log
这样你的程序就可以直接使用本地的SMTP服务对外发邮件了。

搭建临时的FTP服务

前面已经提到了可以直接使用 Sftp 来访问 Vps,如果需要临时的搭建Ftp,则按下面的指南进行。

下载 pyftpdlib 库

在 Putty 使用如下命令,下载 pyftpdlib 库并解压缩。
cd /root
wget https://pypi.python.org/packages/a8/f8/0f6db156898616dbcbd7bf865660295c81479071ab0fcd1898fe1b3a4fc4/pyftpdlib-1.5.1.tar.gz
tar xzvf pyftpdlib-1.5.1.tar.gz
解压缩完毕后,我们可以临时开启ftp了:

开启匿名ftp服务

开启匿名ftp服务,主目录为 /var/www ;默认是21端口;-d 是设置主目录。
cd /root/pyftpdlib-1.5.1/
python -m pyftpdlib -d /var/www
运行该命令后,客户端就可以使用 anonymous 帐号登录,下载了。
按 Ctrl+C 结束 Ftp 服务器。

开启允许写入ftp服务

添加 -w 参数即可允许写入,不可以长时间开,小心被其它人删除数据。
cd /root/pyftpdlib-1.5.1/
python -m pyftpdlib -w -d /var/www
运行该命令后,客户端就可以使用匿名帐号登录,下载和上传了。

登录ftp的账号

IP: VPS服务器的IP 用户名: anonymous 密码:随便输入一个邮箱即可。

关闭ftp服务

直接关闭终端就会退出ftp服务,如果不想关闭可以同时按下 ctrl+c 退出ftp服务。

VPS 自我监控

监控内存和负载

为了防止VPS的内存超过,或系统负载过重,建议采用如下监控脚本:
规则:当剩余内存小于1M或当前负载大于3时,系统重启。
在 Putty 里面执行下面的语句,创建 /usr/bin/vpscheck.sh 脚本,
cat << "EOF"> /usr/bin/vpscheck.sh
#!/bin/bash
free_mem=$(grep MemFree /proc/meminfo | awk '{print $2}')
echo 'Free Memory:'$free_mem
if [ $free_mem -lt 1000 ];then
shutdown -r now
fi
load=$(awk '$1 > 3 {print $1}' /proc/loadavg)
echo "Load:"$load
if [ -n "$load" ];then
shutdown -r now
fi
EOF
再配置定时器,让上面的脚本可以每5分钟运行一次检查,继续在putty里面执行如下命令:
chmod +x /usr/bin/vpscheck.sh
echo "*/5 * * * * root /usr/bin/vpscheck.sh"> /etc/cron.d/vpscheck
service cron restart
完成性能监控。

监控网站并发数

为了防止网站无法访问,做如下检测:
规则:当访问的并发数超过100,系统重启。
在 Putty 里面执行下面的语句,创建 /usr/bin/wwwcheck.sh 脚本,
cat << "EOF"> /usr/bin/wwwcheck.sh
#!/bin/bash
count=`netstat -na|grep :80|wc -l`
echo 'Count:'$count
if [ $count -gt 100 ];then
shutdown -r now
fi
EOF
再配置定时器,让上面的脚本可以每5分钟运行一次检查,继续在putty里面执行如下命令:
chmod +x /usr/bin/wwwcheck.sh
echo "*/5 * * * * root /usr/bin/wwwcheck.sh"> /etc/cron.d/wwwcheck
service cron restart
完成网站并发监控。

安全相关事项

防止扫描

vps的root密码不要设置的太简单,这样很容易被攻破,你可以安装如下软件来降低vps被攻破的机会。
输入如下命令:
apt-get install fail2ban
提示如下表示安装完成:
root@241541:/# ~# apt-get install fail2ban
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
python-pyinotify
Suggested packages:
python-gamin python-pyinotify-doc
The following NEW packages will be installed:
fail2ban python-pyinotify
0 upgraded, 2 newly installed, 0 to remove and 62 not upgraded.
Need to get 154 kB of archives.
After this operation, 763 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/universe fail2ban all 0.8.11-1 [129 kB]
Get:2 http://archive.ubuntu.com/ubuntu/ trusty/main python-pyinotify all 0.9.4-1build1 [24.5 kB]
Fetched 154 kB in 0s (213 kB/s)
Selecting previously unselected package fail2ban.
(Reading database ... 28959 files and directories currently installed.)
Preparing to unpack .../fail2ban_0.8.11-1_all.deb ...
Unpacking fail2ban (0.8.11-1) ...
Selecting previously unselected package python-pyinotify.
Preparing to unpack .../python-pyinotify_0.9.4-1build1_all.deb ...
Unpacking python-pyinotify (0.9.4-1build1) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
fopen: Permission denied
Setting up fail2ban (0.8.11-1) ...
* Starting authentication failure monitor fail2ban [ OK ]
Setting up python-pyinotify (0.9.4-1build1) ...
这样如果用户5次密码输入错误,将会自动将其IP加到黑名单,禁止登录10分钟,10分钟后才可以再登录。

防止php木马

Attention niels epting.svg 通过设置限制php的 eval 函数来防止木马,可能会导致某些程序无法正常运行,目前在 Ubuntu 14.04 版本上测试通过。
编辑 /etc/php5/conf.d/suhosin.ini 文件,如果找不到这个文件,执行如下命令安装 php5-suhosin 模块
sudo apt-get install php5-suhosin
打开此文件后,找到行:
;suhosin.executor.eval.blacklist =
修改为:
suhosin.executor.eval.blacklist = include,include_once,require,require_once,curl_init,fpassthru,file,base64_encode,base64_decode,mail,exec,system,proc_open,leak,syslog,pfsockopen,shell_exec,ini_restore,symlink,stream_socket_server,proc_nice,popen,proc_get_status,dl, pcntl_exec, pcntl_fork, pcntl_signal,pcntl_waitpid, pcntl_wexitstatus, pcntl_wifexited, pcntl_wifsignaled,pcntl_wifstopped, pcntl_wstopsig, pcntl_wtermsig, socket_accept,socket_bind, socket_connect, socket_create, socket_create_listen,socket_create_pair,link,register_shutdown_function,register_tick_function 
然后重启下 apache2 或 php5-fpm 即可

木马基本检查和手工清除

一般采用如下命令去检查有危险文件:
cd /var/www/
grep -R base64_decode *|more
如果看到类似这样的东西,就可以肯定中木马了:
eval(base64_decode("一大串无意义字母

eval(base64_decode($_POST["

eval(gzuncompress(base64_decode
最佳方案,重装系统,重新配置过。
也可以尝试使用下面的命令手工清除
find /var/www/ -name '*.php' -exec sed -i -r "s/eval.{0,10}\(.{0,10}base64_decode.*?\);//g" {} \;
find /var/www/ -name '*.php' -exec sed -i -r "s/eval.{0,10}\(.{0,10}gzuncompress.{0,10}\(.{0,10}base64_decode.*?\);//g" {} \;
find /var/www/ -name '*.php' -exec sed -i -r "s/eval.{0,10}\(.{0,10}stripslashes.*?\);//g" {} \;
然后继续检查有没有群发邮件的木马:
grep -R -E 'POST.*pfsockopen.*EHLO' /var/www/
发现后,如果确定是木马,采用如下命令批量删除木马文件:
grep -R -l -E 'POST.*pfsockopen.*EHLO' /var/www/ | xargs rm -f
查查 eval 和 fwrite 函数
grep -R -E 'REQUEST.*eval.*fwrite' /var/www/
发现后,如果确认是木马,采用如下命令批量删除木马文件:
grep -R -l -E 'REQUEST.*eval.*fwrite' /var/www/  | xargs rm -f
最后重点检查 包含 eval 函数的 php 文件
 find . -name "*.php" -exec grep -l eval {} \;
如果发现有无意义的单词,多半也是中木马了,不过这种需要手工删除相关被感染代码。

根据访问日志批量封IP

有时候,我们可以去检查 HTTP 的访问日志发现异常,然后根据这些异常来封 IP。
首先检查异常, 关键词:xmlrpc.php ,下面的命令可以根据你的需求来调整关键词,其中 access.log 为你的 HTTP 的访问日志文件,可以根据实际情况修改。
执行下面的命令,可以显示所有的 IP 地址,来进行查看:
cat access.log | grep "xmlrpc.php" | awk '{print $1}' | sort | uniq
确认无误后,执行下面的命令进行封禁:
cat access.log | grep "xmlrpc.php" | awk '{print $1}' | sort | uniq | xargs -n1 -I {} iptables -A INPUT -p tcp --dport 80 -s {}/32 -j DROP
执行完毕后,可以使用如下命令查看封禁结果:
iptables -L
注意,上面只是临时封禁,如果重启VPS,将会清空规则。

关闭邮件服务

由于国外对发垃圾邮件的处罚很重,会导致 VPS 被终止,所以为了防止误发邮件或被木马、黑客利用,如果你不需要发送邮件,则关闭邮件服务:
1 删除邮件服务 执行如下命令删除服务器的邮件程序:
apt-get remove postfix* sendmail* procmail*
2 防火墙屏蔽邮件转发 执行如下命令屏蔽邮件端口转发:
iptables -I FORWARD -p tcp --dport 25 -j DROP
sed -i '$i\iptables -I FORWARD -p tcp --dport 25 -j DROP' /etc/rc.local

备份站点

将 vps 成功安装好软件后,面临的第二大的事情是如何备份现有的东西?
你需要备份 3 个方面的内容: 1 站点配置文件 2 站点文件 3 数据库, 分别讲解如下:

备份站点配置文件

看前面的设置,一般情况,我们需要备份Apache或Nginx,如果你修改了Mysql的配置,则需要备份Mysql的配置。
注意在使用 tar 备份时,推荐使用 “tar czf 备份文件名 需要备份的路径” 来备份,你也可以使用 “tar czvf ..."来显示备份详细的进度;但当备份文件很多时,显示中间的备份过程会很花时间和带宽,所以并不建议使用。
备份完毕后,就可以直接使用 filezilla 到 /root 目录去下载你备份的文件了。

备份Apache配置文件

执行如下命令备份Apache的配置到 /root 下 :
cd
tar czf apache2.tar.gz /etc/apache2
备份的文件名叫 apache2.tar.gz ,执行结果如下:
root@241541:~# cd
root@241541:~# tar czf apache2.tar.gz /etc/apache2
tar: Removing leading `/' from member names
检查下备份的文件大小,输入
 ls -l apache2.tar.gz
结果显示如下,表示备份成功
root@241541:~# ls -l apache2.tar.gz
-rw-r--r-- 1 root root 31021 Aug 13 18:32 apache2.tar.gz

备份Nginx配置文件

执行如下命令备份Nginx的配置到 /root 下 :
cd
tar czf nginx.tar.gz /etc/nginx
备份的文件名叫 nginx.tar.gz ,执行结果如下:
root@241541:~# cd
root@241541:~# tar czf nginx.tar.gz /etc/nginx
tar: Removing leading `/' from member names
检查下
root@241541:~# ls -l nginx.tar.gz
-rw-r--r-- 1 root root 5179 Aug 13 18:21 nginx.tar.gz

备份Mysql配置文件

执行如下命令备份Mysql的配置到 /root 下 :
cd
tar czf mysql.tar.gz /etc/mysql
备份的文件名叫 mysql.tar.gz ,执行结果如下:
root@241541:~# cd
root@241541:~# tar czf mysql.tar.gz /etc/mysql
tar: Removing leading `/' from member names
检查下
root@241541:~# ls -l mysql.tar.gz
-rw-r--r-- 1 root root 2639 Aug 13 18:25 mysql.tar.gz

备份站点文件

执行如下命令备份 /var/www 的配置到 /root 下 :
cd
tar czf www.tar.gz /var/www
备份的文件名叫 www.tar.gz ,执行结果如下:
root@241541:~# cd
root@241541:~# tar czf www.tar.gz /var/www
tar: Removing leading `/' from member names
检查如下
root@241541:~# ls -l www.tar.gz
-rw-r--r-- 1 root root 12042534 Aug 13 18:43 www.tar.gz

备份数据库

由于数据库本身包含了帐号和权限信息,所以我们完整备份整个数据库。
执行以下命令备份数据库到 /root 目录
cd
mysqldump -p --all-databases |gzip > mysql.sql.gz
会提示输入密码,输入mysql的密码后回车完成备份,如下所示。
root@241541:~# mysqldump -p --all-databases |gzip > mysql.sql.gz
Enter password:
备份的文件名为 mysql.sql.gz ,检查一下备份的时间和大小
root@241541:~# ls -l mysql.sql.gz
-rw-r--r-- 1 root root 133351 Aug 13 19:01 mysql.sql.gz

恢复站点

当 vps 出现故障后如何恢复?
首先你需要重新去reload系统到原来的系统,然后再按照前面的指南,安装好和之前一样的运行环境。
然后将你备份的所有文件使用 filezilla 上传到 vps 的 /root 目录下。
最后需要恢复 3 个方面的内容: 1 站点配置文件 2 站点文件 3 数据库, 分别讲解如下:

恢复站点配置文件

恢复Apache配置文件

假设 apache 的备份文件名为 apache2.tar.gz ,使用 putty 登录 vps ,执行如下命令恢复:
cd
tar xzf apache2.tar.gz
cp -a etc/apache2 /etc/apache2
执行结果如下,不会有任何回应:
root@241541:~# cd
root@241541:~# tar xzf apache2.tar.gz
root@241541:~# cp -a etc/apache2 /etc/
使用如下命令重启 Apache2 :
service apache2 restart

恢复Nginx配置文件

假设 nginx 的备份文件名为 nginx.tar.gz ,使用 putty 登录 vps ,执行如下命令恢复:
cd
tar xzf nginx.tar.gz
cp -a etc/nginx /etc/nginx
执行结果如下,不会有任何回应:
root@241541:~# cd
root@241541:~# tar xzf nginx.tar.gz
root@241541:~# cp -a etc/nginx /etc/
使用如下命令重启 nginx :
service nginx restart

恢复Mysql配置文件

假设 mysql 的备份文件名为 mysql.tar.gz ,使用 putty 登录 vps ,执行如下命令恢复:
cd
tar xzf mysql.tar.gz
cp -a etc/mysql /etc/
执行结果如下,不会有任何回应:
root@241541:~# cd
root@241541:~# tar xzf mysql.tar.gz
root@241541:~# cp -a etc/mysql /etc/mysql

恢复站点文件

由于站点占用的空间比较大,所有我们不复制过去,解压缩后直接移动过去。
假设站点的备份文件名为 www.tar.gz ,使用 putty 登录 vps ,执行如下命令恢复:
cd
tar xzf www.tar.gz
rm -fr /var/www/*
mv var/www/* /var/www/
执行结果如下,不会有任何回应:
root@241541:~# cd
root@241541:~# tar xzf www.tar.gz
root@241541:~# rm -fr /var/www/*
root@241541:~# mv var/www/* /var/www/

恢复数据库

假设 mysql 的备份文件名为 mysql.sql.gz ,使用 putty 登录 vps ,执行如下命令恢复:
cd
gunzip < mysql.sql.gz | mysql -p
会提示输入当前新安装的mysql密码,输入密码后回车继续。
执行结果如下:
root@241541:~# cd
root@241541:~# gunzip < mysql.sql.gz | mysql -p
Enter password:

使用 Dropbox 每天自动备份

注册 Dropbox

Dropbox 是一个美国的在线网盘,默认提供了2G的空间,同时可以通过邀请其他朋友使用的手段增加容量。
为什么使用这个,主要是 VPS 到 Dropbox 备份可以到 1M 的真实传输速度,加上可以加容量,所以是非常理想的备份方式。
点击 注册 Dropbox 并登录到 Dropbox 网页。
BTW:淘宝上也有人提供扩容到20G的服务,风险自行承担。
Dropbox 将申请150M内存,实际消耗17M内存,所以请注意控制内存。
Vps dropbox.png

安装 Dropbox 客户端

打开 putty 执行如下命令安装,如果是32位的系统,采用如下命令。执行完毕后,请不要再执行下面给64位系统执行的命令:
cd ~ && wget -O - https://www.dropbox.com/download?plat=lnx.x86 | tar xzf -
64位系统的采用如下命令,
cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64"| tar xzf -
执行结果如下所示:
root@241541:~# cd ~ && wget -O - https://www.dropbox.com/download?plat=lnx.x86 | tar xzf -
--2012-02-22 06:44:40-- https://www.dropbox.com/download?plat=lnx.x86
Resolving www.dropbox.com... 199.47.217.171, 199.47.216.170, 199.47.216.171, ...
Connecting to www.dropbox.com|199.47.217.171|:80... connected.
HTTP request sent, awaiting response... 302 FOUND
Location: https://dl-web.dropbox.com/u/17/dropbox-lnx.x86-1.2.52.tar.gz [following]
--2012-02-22 06:44:40-- https://dl-web.dropbox.com/u/17/dropbox-lnx.x86-1.2.52.tar.gz
Resolving dl-web.dropbox.com... 107.20.132.92, 107.20.138.135, 107.20.170.126, ...
Connecting to dl-web.dropbox.com|107.20.132.92|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 15794278(15M)[application/x-tar]
Saving to: `STDOUT'

100%[======================================>] 15,794,278 893K/s in 15s

2012-02-22 06:44:57 (1.01 MB/s) - written to stdout [15794278/15794278]
看到类似信息,表示安装完成。

设置帐号

执行如下命令开始设置帐号
~/.dropbox-dist/dropboxd
当看到
Please visit https://www.dropbox.com/cli_link?host_id=xxx&cl=en_US to link this machine.
的提示时,复制里面https的链接地址使用浏览器打开,会出现Dropbox的密码框,输入你刚刚注册的密码,等到 putty 里面出现
Client successfully linked, Welcome xxx! 
的提示即可完成设置。完成后,使用 Ctrl+C 键中断运行。
完整如下所示:
root@241541:~# ~/.dropbox-dist/dropboxd 
This client is not linked to any account...
Please visit https://www.dropbox.com/cli_link?host_id=db0a5acabdf1fba62f360ffb8ebe910e&cl=en_US to link this machine.
This client is not linked to any account...
Please visit https://www.dropbox.com/cli_link?host_id=db0a5acabdf1fba62f360ffb8ebe910e&cl=en_US to link this machine.
This client is not linked to any account...
Please visit https://www.dropbox.com/cli_link?host_id=db0a5acabdf1fba62f360ffb8ebe910e&cl=en_US to link this machine.
This client is not linked to any account...
Please visit https://www.dropbox.com/cli_link?host_id=db0a5acabdf1fba62f360ffb8ebe910e&cl=en_US to link this machine.
Client successfully linked, Welcome guest!

开始使用

完成以上设置后,会在当然的目录下出现 Dropbox 目录,这个目录就是同步目录,当在这个目录下放置的任何文件都会同步到 Dropbox 网盘上。
root@241541:~# ls
Dropbox
root@241541:~# cd Dropbox/
root@241541:~/Dropbox# ls
Getting Started.pdf Photos Public
第一次测试: 在Dropbox目录下创建一个内容为 Hello 的 a.txt 文件。
root@241541:~/Dropbox# echo "Hello"> a.txt
运行同步程序
root@241541:~/Dropbox# ~/.dropbox-dist/dropboxd 
打开Dropbox网页的 Files ,就会看到你的文件了。 输入 Ctrl+C 中断同步,下面开始讲如何配置自动运行同步。

自动运行 Dropbox

512M内存的VPS请不要自动启动服务,需要时,手工运行即可,启动后会太占内存。
直接复制下面的命令到Putty并执行,以下为创建 dropbox 的自动启动文件,命令内容如下:
cat << "EOF"> /etc/init.d/dropbox
#!/bin/bash
# dropbox service
DAEMON=.dropbox-dist/dropboxd

start(){
echo"Starting dropbox..."
if[ -x /root/$DAEMON];then
HOME="/root" start-stop-daemon -b -o -c root -S -u root -x /root/$DAEMON
fi
}

stop(){
echo"Stopping dropbox..."
if[ -x /root/$DAEMON];then
start-stop-daemon -o -c root -K -u root -x /root/$DAEMON
fi
}

status(){
dbpid=`pgrep -u root dropboxd`
if[ -z $dbpid];then
echo"dropboxd not running."
else
echo"dropboxd running (pid $dbpid)"
fi
}


case"$1" in
start)
start
;;

stop)
stop
;;

restart|reload|force-reload)
stop
start
;;

status)
status
;;

*)
echo"Usage: /etc/init.d/dropbox {start|stop|reload|force-reload|restart|status}"
exit 1

esac

exit 0
EOF
然后继续执行如下命令,设置自动启动 dropbox 同步服务:
chmod +x /etc/init.d/dropbox
update-rc.d dropbox defaults
/etc/init.d/dropbox start
执行命令的结果如下所示:
root@241541:~/Dropbox# sed -i "s/\r//" /etc/init.d/dropbox 
root@241541:~/Dropbox# chmod +x /etc/init.d/dropbox
root@241541:~/Dropbox# update-rc.d dropbox defaults
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE=(unset),
LC_ALL=(unset),
LANG="zh_CN.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
update-rc.d: warning: /etc/init.d/dropbox missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
Adding system startup for /etc/init.d/dropbox ...
/etc/rc0.d/K20dropbox -> ../init.d/dropbox
/etc/rc1.d/K20dropbox -> ../init.d/dropbox
/etc/rc6.d/K20dropbox -> ../init.d/dropbox
/etc/rc2.d/S20dropbox -> ../init.d/dropbox
/etc/rc3.d/S20dropbox -> ../init.d/dropbox
/etc/rc4.d/S20dropbox -> ../init.d/dropbox
/etc/rc5.d/S20dropbox -> ../init.d/dropbox
root@241541:~/Dropbox# /etc/init.d/dropbox start
Starting dropbox...
现在你的VPS已经可以自动同步 /root/Dropbox 目录下的所有文件了。

自动每天备份数据库和站点

输入如下命令,创建自动备份脚本,注意脚本中的“数据库密码”需要换成你自己的Mysql数据库密码:
echo '#!/bin/bash'> /etc/cron.daily/dropboxbackup
echo 'tar czf /root/Dropbox/www.tar.gz /var/www'>>/etc/cron.daily/dropboxbackup
echo 'mysqldump -p数据库密码 --all-databases |gzip > /root/Dropbox/mysql.sql.gz'>>/etc/cron.daily/dropboxbackup
chmod +x /etc/cron.daily/dropboxbackup
service cron restart
执行结果如下
root@241541:~# echo '#!/bin/bash'> /etc/cron.daily/dropboxbackup
root@241541:~# echo 'tar czf /root/Dropbox/www.tar.gz /var/www'>>/etc/cron.daily/dropboxbackup
root@241541:~# echo 'mysqldump -p123456 --all-databases |gzip > /root/Dropbox/mysql.sql.gz'>>/etc/cron.daily/dropboxbackup
root@241541:~# chmod +x /etc/cron.daily/dropboxbackup
root@241541:~# service cron restart
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service cron restart

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the restart(8) utility, e.g. restart cron
cron start/running, process 3094
看到上面的提示,表示自动备份设置完成,然后你可以手工执行下 /etc/cron.daily/dropboxbackup 看看效果。

使用 BitTorrent Sync 备份系统

说明

这个是 BitTorrent 公司写的一个非开源备份系统,具体请自行 Google,这里直接讲如何安装和使用。
使用这个好处有两点,第一:占用内存非常少,不到20M;第二:不限空间,可以直接备份到你的本地电脑。

安装

在 Putty 里面,依次执行如下命令安装,安装过程中在提示输入[Y]或[ENTER]的地方,直接回车即可:
apt-get install python-software-properties
add-apt-repository ppa:tuxpoldo/btsync
apt-get update
apt-get install btsync
当出现 “The password for accessing the web interface:” 提示输入密码时,输入你的管理密码;其余默认,直接回车即可。
安装完毕后,btsync 的配置文件在 /etc/btsync/debconf-default.conf ,你可以去修改这个文件,配置新的密码。
修改密码后,需要重启 btsync 服务:
service btsync restart

使用

打开浏览器访问 http://VPSIP:8888 ,在本例中如下: http://184.82.9.30:8888
登录默认账号: admin ,密码是你前面输入的。
好了,然后 点击 Add Folder 按钮选择需要备份的目录(推荐备份 /var 目录),并产生一个随机安全 Secret 号。

客户端安装

访问 http://labs.bittorrent.com/experiments/sync.html ,点击红色的 Download 按钮,再点击 Windows 按钮,下载并安装
打开程序,输入前面得到的随机安全 Secret 号,选择一个下载的目录,你会看到,备份开始了。
大功告成。

安装 Zend Guard Loader

一般情况我们推荐直接安装 Zend Guard Loader 来代替 Zend Optimizer,因为 Zend Optimizer 已经过时,并且不被支持。
cd ~
wget http://phpcj.googlecode.com/files/ZendGuardLoader.so
mkdir -p /usr/local/zend/
cp ZendGuardLoader.so /usr/local/zend/ZendGuardLoader.so
echo"zend_extension=/usr/local/zend/ZendGuardLoader.so"> /etc/php5/conf.d/zend.ini
echo"zend_loader.enable=1">> /etc/php5/conf.d/zend.ini
然后重启下php即可。

关于Zend Optimizer

如果已经安装了上面的 Zend Guard Loader,请忽略执行本段。
关于Zend,我们推荐安装上面的 Zend Guard Loader ,Zend Optimizer 已经被官方放弃,如果一定需要,请看本段。
由于Zend Optimizer 不支持 php 5.3.x ,如果必须要使用,则需要降级:
注意不要去尝试安装 ZendServer-CE 的 optimizerplus 或 Zend Guard Loader,因为,php 5.3.x 上的解密都不支持 php5.2.x 上的加密,除非你手头上的加密程序可以重新针对 php 5.3.x 重新加密,所以必须降级 php 的版本为 5.2.x 。
并且仅仅支持 Apache , 不支持 Nginx (问题是降级后不再支持 php5-fpm,当然有能力者,可以采用 spawn-fcgi 来代替)。
如果是Nginx用户,请还原到 Apache 环境,并且参考上面步骤事先安装好Apache和php,并测试php正常运行。

php 降级

依次逐行输入如下命令:
apt-get install aptitude lsb-release
php_installed=`dpkg -l | grep php| awk '{print $2}'|tr "\n"""`
aptitude purge $php_installed
echo -e "Package: php5\nPin: release a=karmic\nPin-Priority: 991\n"> /etc/apt/preferences.d/php
apt-cache search php5-|grep php5-|awk '{print "Package:", $1,"\nPin: release a=karmic\nPin-Priority: 991\n"}'>> /etc/apt/preferences.d/php
apt-cache search -n libapache2-mod-php5 |awk '{print "Package:", $1,"\nPin: release a=karmic\nPin-Priority: 991\n"}'>> /etc/apt/preferences.d/php
echo -e "Package: php-pear\nPin: release a=karmic\nPin-Priority: 991\n">> /etc/apt/preferences.d/php
egrep '(main restricted|universe|multiverse)' /etc/apt/sources.list|grep -v "#"| sed s/`lsb_release -s -c`/karmic/g | sed s/'http:\/\/.*\/'/'http:\/\/old-releases.ubuntu.com\/'/g > /etc/apt/sources.list.d/karmic.list
apt-get update
apt-get install $php_installed
aptitude hold `dpkg -l | grep php5| awk '{print $2}'|tr "\n"""`
如果碰到如下:
Do you want to continue? [Y/n/?] 
请出入 y 回车继续

php 高级安装技巧

如果需要支持nginx或采用fastcgi来运行php,在执行完毕上面的步骤后,参考如下命令安装(注意,Apache环境不需要执行):
采用fastcgi,即用于spawn-fcgi:
aptitude install -t karmic php5-cli php5-cgi 
返回到Apache:
apt-get install -t karmic  libapache2-mod-php5

安装 Zend Optimizer

cd ~
wget http://downloads.zend.com/optimizer/3.3.3/ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz
tar zxvf ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz
mkdir -p /usr/local/zend/
cp ZendOptimizer-3.3.3-linux-glibc23-i386/data/5_2_x_comp/ZendOptimizer.so /usr/local/zend/
echo"zend_extension=/usr/local/zend/ZendOptimizer.so"> /etc/php5/conf.d/zend.ini

安装成功验证

运行:
php -v
返回如下提示:
root@241541:~# php -v
PHP 5.2.10-2ubuntu6 with Suhosin-Patch 0.9.7 (cli) (built: Oct 23 2009 16:30:10)

Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies
显示成功安装 Zend Optimizer。

重启 Web 服务

如果是 apache :
service apache2 restart
如果是Nginx:
service php5-fpm restart

额外支持

XEN VPS 增加交换分区大小

XEN VPS 专用,OPEN VZ的请忽略。
增加之前:
root@289085:~# free
total used free shared buffers cached
Mem: 5060884600846008003624 21944
-/+ buffers/cache: 20440 485648
Swap: 2621400 262140
运行如下命令增加256M交换内存
dd if=/dev/zero of=/mnt/256M.swap bs=1M count=256
chmod 600 /mnt/256M.swap
mkswap /mnt/256M.swap
swapon /mnt/256M.swap
echo '/mnt/256M.swap none swap sw 0 0'>> /etc/fstab
增加之后:
root@289085:~# free
total used free shared buffers cached
Mem: 50608831274019334803952 284180
-/+ buffers/cache: 24608 481480
Swap: 5242800 524280

配置 php 加速器

如果你 VPS 的内存大于或等于 1G,可以考虑开启 php 的 apc 加速,否则请忽略本步骤。
echo "extension=apc.so"> /etc/php5/conf.d/apc.ini
echo "apc.enabled=1">> /etc/php5/conf.d/apc.ini
echo "apc.shm_size=64M">> /etc/php5/conf.d/apc.ini
echo "apc.ttl=7200">> /etc/php5/conf.d/apc.ini
如果你安装的是apache2,执行下面命令重启下:
service apache2 restart
如果你安装的是nginx,执行下面命令重启下:
service php5-fpm restart

安装 JAVA

由于 java 非常消耗内存,1G以下的 VPS 请不要考虑使用 java,java 理想的内存在2G以上。
采用如下命令安装JAVA JDK 1.7:
apt-get install openjdk-7-jdk
验证如下:
$ java -version
java version "1.7.0_25"
OpenJDK Runtime Environment (IcedTea 2.3.12) (7u25-2.3.12-4ubuntu3)
OpenJDK Client VM (build 23.7-b01, mixed mode, sharing)
如果你安装了多个版本的JDK,需要配置默认的JDK,采用如下命令:
update-alternatives --config java

日常维护

查看硬盘剩余空间大小

df
显示
root@241541:/# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/simfs 20971520 583508 20388012 3% /

查看硬盘可用文件数

df -i
显示
root@241541:/# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/simfs 400000 26568 373432 7% /

查看内存剩余大小

free
显示
root@241541:/# free
total used free shared buffers cached
Mem: 524800 245240 279560 0 0 0
-/+ buffers/cache: 245240 279560
Swap: 0 0 0

如何从其他网站上下载文件

wget "下载文件的链接地址"
如下所示下载 DZ 论坛的最新版:
wget http://download.comsenz.com/DiscuzX/2.0/Discuz_X2_SC_UTF8.zip
你也可以指定需要保存的文件名为 dz.zip 如下:
wget http://download.comsenz.com/DiscuzX/2.0/Discuz_X2_SC_UTF8.zip -O dz.zip
如果对方有防盗链可以这样下:
wget http://download.comsenz.com/DiscuzX/2.0/Discuz_X2_SC_UTF8.zip --referer=http://download.comsenz.com/

常用服务重启

重启 Apache2
service apache2 restart
重启 Mysql
service mysql restart
重启 Nginx
service nginx restart
重启 php
service php5-fpm restart

查看内存被什么消耗

ps -eo vsz,rss,pid,cmd --sort -vsz|head -n 20
显示:
root@241541:~#  ps -eo vsz,rss,pid,cmd --sort -vsz|head -n 20
VSZ RSS PID CMD
146384368601629 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --port=3306 --socket=/var/run/mysqld/mysqld.sock
6290836768026 nginx: worker process
6266028848027 nginx: cache manager process
62660340417440 nginx: master process /usr/sbin/nginx
50380111601517 /usr/sbin/named -u bind
339481307632345 /usr/bin/php-cgi
337961291232344 /usr/bin/php-cgi
337641282832351 /usr/bin/php-cgi
336841280432350 /usr/bin/php-cgi
328921201232346 /usr/bin/php-cgi
328921198432349 /usr/bin/php-cgi
28864795232347 /usr/bin/php-cgi
28864795632348 /usr/bin/php-cgi
27708562432342 /usr/bin/php-cgi
868819243089 sendmail: MTA: accepting connections
8136292432338 /usr/sbin/sendmail -i -FCronDaemon -oem root
8096280420387 sshd: root@pts/0
8096275623759 sshd: root@pts/1
530410841547 /usr/sbin/sshd

动态显示系统程序情况

top
显示 Vps top.png

mysql 常用命令

mysql 创建数据库
mysqladmin -u root -p create 数据库名
mysql 删除数据库
mysqladmin -u root -p drop 数据库名
mysql 创建用户
mysql> GRANT ALL PRIVILEGES ON 数据库名.* TO '用户名'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
mysql 修复表
mysqlcheck -A --auto-repair -p
mysql 手工恢复 phpmyadmin 备份的 sql 文件 xxxx.sql 是你备份的sql文件名。
 mysql -p 数据库名 < xxxx.sql
手工备份单个 mysql 数据库 xxxx.sql 是你备份的sql文件名。
mysqldump -p 数据库名 > xxxx.sql
修改mysql的root的密码
mysqladmin -u root password '新密码'
mysql 无法启动的处理
运行 mysqld_safe --user=mysql
然后 tail -n 50 /var/log/syslog 看日志,根据错误来判断
如果提示日志不存在,运行: apt-get install rsyslog 安装日志服务。

在线解压缩

解压缩 xxx.zip
unzip xxx.zip
解压缩 xxx.tar.gz
tar -xzvf xxx.tar.gz
解压缩 xxx.tar.bz2
tar -xjvf xxx.tar.bz2
压缩aaa bbb目录为xxx.tar.gz
tar -zcvf xxx.tar.gz aaa bbb
压缩aaa bbb目录为xxx.tar.bz2
tar -jcvf xxx.tar.bz2 aaa bbb

封掉某个IP或IP段

只是运行后封掉,由于未保存所以重启后失效,对 192.168.2.0 或 192.168.2.23 进行封掉:
iptables -t filter -I INPUT -s 192.168.2.0/24 -p tcp -j DROP
iptables -t filter -I INPUT -s 192.168.2.23 -p tcp -j DROP

查看日志

如果需要查看访问日志,请查看 /var/log/ 文件夹,所有的日志都在这个目录下。

查看网络流量

执行如下命令安装nload
apt-get install nload
安装完毕后,xen的直接运行nload,即可查看,openvz的运行 nload venet0 查看带宽。

更多命令参考

点击查看 Ubuntu 技巧

根据压力测试来调整最大并发数

因为VPS的内存是有限的,如果不限制最大并发数,会照成内存爆掉或负载过高。内存爆掉,对于openvz的管理会kill掉最耗内存的程序,这样很可能杀掉web服务和sshd服务,表现形式为,vps可以ping通,但网站打不开,也无法登录,需要到面板重启vps才正常;如果负载大于3则会导致VPS由于滥用被官方冻结。如果已经发生了上述现象,请尽快按如下步骤进行调整。

测试内存的使用情况

使用 putty 登录到到 vps 输入命令 free 即可看到当前内存的使用情况,如下所示:
root@241541:~# free
total used free shared buffers cached
Mem: 524800 296004 228796 0 0 0
-/+ buffers/cache: 296004 228796
Swap: 0 0 0
全部内存为 524800 K,已经使用 296004 K 剩余 228796 K,也就是还剩余 228 M的内存。
如果需要长时间监控,使用如下命令:
watch -n 1 free

安装压力测试软件

我们这里使用 ab 软件,作为我们的压力测试软件。
使用 apache2的 vps 已经自带了,如果使用nginx的vps,需要安装 apache2-utils 包,使用如下命令安装。
apt-get install apache2-utils

开始压力测试

你的站点都已经配置完整,需要找一个动态页面,最好内容多一点的,这里采用 http://www.test.com/index.php 作为测试页面。
在 putty 里面输入如下,将每秒刷新一次显示内存情况:
watch -n 1 free
重点在于观察位于 free 单词下面的数字。
再开一个putty,输入我们要进行的压力测试命令如下,其中测试网址修改为你自己的测试网址:
ab -n 100 -c 5 http://www.test.com/index.php
这个命令是按 5 个并发,做100次请求 ,注意看内存情况,如果出现内存小于50M的情况,表示非常危险了。
执行完毕的结果如下:
[root@241541 ~]# ab -n 100 -c 5 http://www.test.com/index.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking www.test.com (be patient).....done


Server Software: Apache/2.2.16
Server Hostname: www.test.com
Server Port: 80

Document Path: /index.php
Document Length: 56446 bytes

Concurrency Level: 5
Time taken for tests: 53.147069 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 5721547 bytes
HTML transferred: 5695792 bytes
Requests per second: 1.88 [#/sec] (mean)
Time per request: 2657.354 [ms](mean)
Time per request: 531.471 [ms](mean, across all concurrent requests)
Transfer rate: 105.12 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 218219 2.9 218 230
Processing: 14632407 258.5 2429 3126
Waiting: 4501280 217.7 1291 1832
Total: 16812627 258.6 2648 3344

Percentage of the requests served within a certain time(ms)
50% 2648
66% 2691
75% 2759
80% 2818
90% 2885
95% 3093
98% 3339
99% 3344
100% 3344(longest request)
这个结果中需要掌握的有:
成功完成的请求数: Complete requests: 100
失败的请求数: Failed requests: 0
每秒完成的请求数: Requests per second: 1.88 [#/sec] (mean)
执行每个请求需要的时间(也就是用户打开这个页面的最快时间): Time per request: 2657.354 [ms] (mean)

进一步压力测试

在内存还有剩余的情况下,我们继续增加压力测试的并发数,可以慢慢增加,
当这边的内存监控窗口出现低于50M的时候,就表示这个数值为这个vps可以承受的最大并发数。
出现低于50M可以内存的情况如下,表示这个站只能支撑8个并发访问不会挂掉:
[root@241541 ~]# ab -n 100 -c 8 http://www.test.com/index.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking www.test.com (be patient).....done


Server Software: Apache/2.2.16
Server Hostname: www.test.com
Server Port: 80

Document Path: /index.php
Document Length: 56446 bytes

Concurrency Level: 8
Time taken for tests: 41.779898 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 5670100 bytes
HTML transferred: 5644600 bytes
Requests per second: 2.39 [#/sec] (mean)
Time per request: 3342.392 [ms](mean)
Time per request: 417.799 [ms](mean, across all concurrent requests)
Transfer rate: 132.53 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 218218 0.9 218 223
Processing: 16843021 461.5 3087 4525
Waiting: 4951820 418.3 1927 3165
Total: 19033239 461.6 3307 4744

Percentage of the requests served within a certain time(ms)
50% 3307
66% 3384
75% 3452
80% 3521
90% 3654
95% 3763
98% 4695
99% 4744
100% 4744(longest request)
在8个并发的情况下,用户打开这个网页最快也需要3.3秒。

配置并发参数

根据上面的压力测试情况去配置相应最大的并发为当前测试的值,上例中,我们测试出的最大并发为 8.
Apache2 参考:
Nginx 参考:

常见故障

"Temporary failure resolving"或 正在解析主机...失败,未知的名称或服务

使用 wget 或 apt-get 时出现上面的提示,是官方的dns服务器出现故障了,采用如下命令修复:
echo nameserver 208.67.222.222 > /etc/resolv.conf
或者
echo dns-nameservers 208.67.222.222 >> /etc/network/interfaces

"locale: Cannot set LC_ALL to default locale: No such file or directory"

如果出现如下故障提示:
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE=(unset),
LC_ALL=(unset),
LANG="zh_CN.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
虽然不影响使用,可以使用下面的命令解决:
locale-gen --lang zh_CN.UTF-8
dpkg-reconfigure locales

修正时区

使用如下命令调整本地的系统的时区为上海。
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

开启 GBK/GB2312 支持

使用如下命令在 local 文件中增加 GBK/GB2312:
echo "zh_CN.GBK GBK">> /var/lib/locales/supported.d/local 
echo "zh_CN.GB2312 GB2312">> /var/lib/locales/supported.d/local
然后运行:
dpkg-reconfigure --force locales  
即可支持了。

修复cron问题

#检查cron的任务文件名是否包括 . ,如果有扩展名会导致无法运行,
#可以使用如下命令检查 run-parts --test /etc/cron.daily
apt-get remove anacron
service cron restart

禁止执行的命令

以下命令是严格禁止的,运行后直接导致数据丢失或vps无法正常启动,如果遇到有人建议你运行如下命令,请停止。
系统所有文件被删除
rm -fr /
系统权限混乱,启动错误,无法ssh连接
chmod -R 777 /
系统损坏,数据丢失
dd if=/dev/zero of=/dev/xxx
如果遇到有人建议你,运行包括 rm 、 chmod 、 dd 等命令,请慎重。

使用 mtr 检测网络丢包

有时我们发现 ping 丢包,因此需要通过 mtr 来定位故障的位置,使用 mtr 需要双向运行,才可以比较准确的发现故障点。
VPS上安装 mtr :
  • Ubuntu Linux
apt-get install mtr
  • Centos Linux
yum install mtr
访问 http://ip.cn 获得本地的公网地址,从VPS执行如下命令:
mtr -n --report 本地公网地址
获得路由的丢包位置。
然后本地 Windows 上安装 mtr:
下载运行后,直接输入VPS的IP进行测试。
最后两边对比结果,就可以准确的找到出问题的路由地址。
找到丢包路由器的IP后,通过 http://ip.cn 去查询该路由器IP的所在地。如果该IP在国内,只能等待了;如果在国外,可以尝试去报障,要求官方协调解决。

VPS之间备份、下载、上传需要限速

由于美国VPS之间的速度是200M共享,所以很容易达到满速,这样会导致带宽滥用封掉,所以必须限速,以下按1M限速:

常用软件限速

wget/scp/rsync/lftp 等常用客户端下载限速如下。
wget --limit-rate=1024k ......
scp -l 8196 ......
rsync -auvzP --bwlimit=1024 --size-only ......
lftp :~> set net:limit-rate 1024000,1024000

采用 trickle 限速

也可以使用 trickle 来限速,安装 trickle 使用如下命令
apt-get install trickle
运行如下命令,限制 wget 的上传速度和下载速度为1M,其中 -d 后面是下载速度,-u 后面是上传速度,以K为单位:
trickle -d 1024 -u 1024 wget ....
Dropbox 限速:
trickle -d 1024 -u 1024 ~/.dropbox-dist/dropboxd

快速安装配置lnmp的命令

删除Apache2:
service apache2 stop
apt-get update
apt-get -y remove apache2 apache2.2-common
安装 php nginx
apt-get -y install php5-cgi php5-fpm php5-gd php5-mysql php5-curl php5-mcrypt php5-common php-apc mysql-server nginx

from http://wiki.ubuntu.com.cn/Vps

博客程序Paper

$
0
0
Feel free about writing blog. This is a simple blog system, Just bloging, Implemented on bottle.
This is a simple blog system based on Bottle, Jinja2, SQLalchemy.
White blog with Markdown.

Demo

  • Not avaliable

Quick Start

details see Deploy
git clone https://github.com/yueyoum/paper.git
cd paper

cp settings.py.example settings.py
vim settings.py
echo "this is me"> templates/me.html

make init
make database
make key
make run
Then you can visit the demo at http://127.0.0.1:8999 (static file will not be served)
For static files, you need nignx, or set DEBUG = True in settings.py

Deploy

  1. using git or download paper directly.
  2. settings
    cp settings.py.example settings.py
    your should modify the settings with your needs
  3. set up a html page for /about link
    create a me.html file in templates folder. this page will show in /about link
  4. paper use virtualenv to running in a independent python environments. run this commands below:
    make init
  5. paper use sqlalchemy as ORM, so sync table metadata to DB
    make database
  6. generate the key for post blog.
    you will using paper-client to post blog. so, this key is used for security.
    make key
  7. start the web
    gunicorn with gevent_pywsgi workers will serve the web at 127.0.0.1:8999
    make run
  8. config nginx
    there is a nginx config file located at deploy folder, copy and modify it to make nginx serve paper

How to post blog

paper is designed for writing markdown at local, you need paper-client to post markdown.
At the step 5 above, we make the security key via make key. the key file is located at src/ folder.
cat src/_key, and you will get the security key, copy it. It will be used for paper_client.conf.
details see paper-client

from https://github.com/yueyoum/paper
------

Paper-Client

this is the client of paper, used for post markdown.

How to use

git clone https://github.com/yueyoum/paper-client.git
cd /usr/local/bin
sudo ln -s YOUR_PATH/paper-client/paper_publish.sh paper_publish
cd ~
cp paper-client/config ~/.paper-client.conf
vim ~/.paper-client.conf

paper-client YOUR_POST.md
.paper-client.conf now needs two variable:
  • key: the security key for post. see paper
  • url: your domain

Format

Just markdown, but you should care about the code area. see the example.md
  • File name of markdown file will be the post's title
  • Markdown file must contains Tags: line at the top of file
  • Post date is in paper settings
from https://github.com/yueyoum/paper-client
Viewing all 20465 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>