Total Pageviews

Saturday, 1 December 2018

明天会为未来很长一段时间的中美关系奠定基调吗

冬去春来,11月底,阿根廷已经开始入春。

G20峰会这时候在布宜诺斯艾利斯召开,阿根廷努力地装扮门面,迎接来自各个有钱国家的元首。

或许可以对他们继续从国际货币基金组织那里拿到贷款有帮助。

但是,地主家也没有剩粮啊。这是个剑拔弩张的时代。

来阿根廷之前,特朗普突然宣布取消"特普会",很大的原因是俄罗斯和乌克兰海军刚刚小干了一下,发生了流血冲突。那么剩下的另一场大戏"特习会"就变得更加引人注目。

在G20峰会前半个月,南太平洋的岛国巴布亚新几内刚刚主办了APEC峰会,令人惊讶的是这场峰会并没有按惯例发表联合声明。究竟发生了什么呢?

在这个首脑会议上,中美两国唇枪舌战。

中方表示,"全球发展深层次矛盾突出,保护主义、单边主义思潮抬头,多边贸易体制受到冲击,世界经济整体发展环境面临诸多风险和不确定性"。同时主张,"我们应坚定维护以规则为基础的多边贸易体制,旗帜鲜明抵制保护主义",批评了提出"美国优先主义"的美国。 

那边厢白头鹰彭斯批评"一带一路"为"一条生锈的带,一条单向的路",说中国试图通过债务去控制参与"一带一路"的国家。

最后东道主只好发了个主席声明了事,为20年来第一次。

到了布宜诺斯艾利斯,两个老大吃一顿饭,分歧就能解决吗?

据了解,会面前,中国向美国政府提交了400多页的清单,把谈判标的分为三类:"同意接受"、"可以谈"、"绝不可谈"。

特朗普已经多次放风出来说很不满意。

但是让我们来看看中美贸易中,中国收获的是什么。

出口创汇是中国过去几十年奉行的基本国策,每一年政府都要拿出巨额财政资金补贴出口创汇,等于是把纳税人的血汗钱倒贴给境外市场。

这就不难理解,许多产自中国的产品包括生活必需品,在中国比美国还要贵几倍。

而美国人的平均收入比中国人至少高出8-10倍,美国社会过去几十年物价稳定货币坚挺,实际上也是十几亿中国人付出了代价做出的牺牲。

中国加入WTO之前,美国一直给予中国最恵国关税待遇,只是一年一审。

加入WTO之前的2001年,中国进出口贸易总额只有0.51万亿美元,2017年这一数字接近5万亿美元!

2001年,中国GDP对全球经济的贡献率仅为0.53%,2017年中国对全球经济增长的贡献率占了1/3!

在特朗普看来,中国外汇储备几乎都是美国的贡献。

中国没有对美国持续的贸易顺差,财力不可能如此雄厚,国力不可能如此强盛,对外援助也不可能如此慷慨!

但是,中国赚回来的美元哪里去了呢?

一部分又拿去购买美国国债。钱又回到美国手上。

出口创汇——美国国债——美国政府——购买产品

是的,美元在太平洋间打了个来回,又回到美国人手上去。美国政府需要做的就是不断扩大国债规模。

秦晖说,西方发达国家的左派政府最愿意在经济上和中国这种高效率的社会主义国家合作。因为中国不单可以高效优质低价地为西方发达国家提供商品,又可以完整地把美元拿回去购买发达国家的国债。通过宽松移民政策,吸纳移民以补充本国因低生育率缺失的劳动力。

2008年,奥巴马上台后,美国政府就是这样做的。

2008到2016年,也是中国制造业发展最为迅猛的八年。

奥巴马政府时期,美国制造业就业岗位减少了十万以上,主要是由于企业外迁。

同时美国国债规模由10万亿增长到20万亿——两个任期借的钱等于之前全部美国总统的。

在移民政策上,奥巴马特赦非法移民——给500万合资格非法移民居留权。

如果希拉里上台继续再这样搞八年,那么可能美国人口结构就会发生本质改变,不再以盎克撒白人为民族主体的美利坚,可能就不会是唯一超级大国。

可惜,美国政治体制具有超强的纠错性,美国人醒悟过来了,所以他们选出了特朗普。

特朗普新官上任三把火,招招管用。

首先,通过关税政策,重塑全球供应链,为美国中下阶层提供就业岗位。

其次,废除奥巴马移民特赦政策,稳住选票基本盘。

然后,外交上推行"美国优先主义",不去管跟自己无切身利益相关的国际事务。

而第一项,美国再工业化正是特朗普"让美国再次伟大"计划的基石。

作为上一轮全球化产业链转移中最大的受益国,中国无疑要付出代价。

所以特朗普关税政策的核心目标,并不是为了向中国商品征高关税,而是要逼迫全球,特别是美国企业重塑供应链——要么搬回美国,要么搬到美国的盟国。

所以不管明天的晚餐会议有什么结果,不管是谈崩,贸易战战全面升级,还是可以达成框架协议,美国暂缓加税,其实都不太重要。

中国要面对的是全面右转的美国社会,逆全球化的趋势,和正在变坏的世界。

中国有没有做好准备,除了外贸代工厂角色之外,能否找到新的经济增长手段,这才是我们要面对的核心问题。

毕竟全球化,通俗来说,就是出口赚外汇的时代,正在落幕。

巴黎凯旋门下,大批身穿黄衣的暴民集结成看不到尽头的涌动人群,不断冲击人数稀少警察形成的人墙,法国首都的骚乱已经持续半个月,至今看不到终结。

这样的情形在整个法国都在上演甚至蔓延到比利时。

此刻,远在阿根廷的法国总统马克龙只能进行有气无力的抵抗,这是法国最后一任的建制派领袖,他之后,法国和欧盟命运将完全不可测。

德国柏林,曾经不可撼动的欧洲女皇默克尔走下神坛,面对根本不可能解决之难民危机和极右翼崛起浪潮,德国政坛主流力量却开始陷入混乱的互相残杀,欧洲的稳定器即将瘫痪。

英国伦敦,大不列颠与欧洲大陆正式切割,回到"光荣孤立"的传统中去。

毫无疑问,过去统治世界之力量和价值观,正在从其内部开始崩塌,这加剧了世界其他各地的无序。

在土耳其、在沙特,在巴基斯坦,在南非,一系列新兴国家的内外政策正在向不可控的混乱快速推进。

政局不稳,经济低迷,欧洲和新兴国家加在一起,也不能提供像美国市场这样庞大的需求。

而在美国,中国的"敌人"已被唤醒,并且从各个方面开始向中国发难,对中国构成了巨大的压力。

不过,这里的问题是,这场贸易战能够唤醒中国本身吗?

如果只唤醒了"敌人"而不能"唤醒"自己,未来的前景只有更坏,没有最坏。

但如果在唤醒"敌人"的同时也"唤醒"了自己,便是进步的动力。

面对正在变坏的世界,中国所需要的既非像一些人那样毫无自信而"乞求"外力,更非像另一些人那样盲目自大而走向"义和团主义",而是在摸清楚自己的家底之后,理性应对贸易战,以人民的福祉为依归,进一步推动改革开放,用改革重新配置国内资源,用开放团结自己的盟友。
锦麟煮酒
jinlinzhujiu

文贯中:我对中美关系未来走向的看法


1. 为什么APEC变成了中美斗争的平台?这对APEC的未来意味着什么?

这次APEC正好是中美贸易摩擦升级后召开的第一个亚太高峰会议。中美对涉及世界走向的一系列基本概念和原则有重大分歧,又分别为世界的老大和老二,有获取国际舞台的话语权和落实自己理念的强大经济实力。鉴于这种态势,美国两党已达共识,大幅修改对华政策,将中国视为争夺世界领导权的最大竞争对手。美国修改对华政策,针对的就是中国现有的以国家主导的贸易和经济体制,认为这种体制是造成美中贸易巨额逆差的根源。这次以APEC为舞台,中美斗智斗法是必然的,而且只是刚开一个头。今后,各种国际经济、政治的场合都会成为中美斗智斗法的场所。即使中美两国对一系列的经济-贸易分歧的解决之道达成妥协,休战也是暂时的。要指出的是,美国,欧盟,和日本早在半年前已形成共识,认为中国现行经济体制乃非市场属性,和美国一手缔造的基于市场经济原则的现行国际秩序在长期内是无法相容的。这种共识在美国对华政策作出重大修正后,今后只会加速发酵,使中国在国际市场上不可能再象过去那样自由驰骋,如入无人之境。

对此,中国千万不可再我行我素,熟视无睹,继续以各种理由拒不落实加入WTO时的开放承诺,以及18大,19大作出的改革承诺。所谓非市场经济体制,是指生产要素的配置主要不由市场起决定性的作用,而由政府主导决定。由于中国政府事实上可以动用国库和央行,资助国有企业做大做强,这种国策不但使中国国内得不到国家同等待遇的民营企业受到不公平竞争的压力,也使国际上无法亨受这种待遇的外国同行受到同样的压力。这种通过补贴,或通过关闭自己的国内市场向国企提供非关税保护,使国有企业能不惜代价做优做强的作法,也使外国同行怀疑中国的国企是否在国际市场上只是为了落实中国政府和党的政治目标而存在,并非为了实现商业利益,这显然不仅有违公平竞争的原则,也引起市场经济国家日益提高的警惕,并必然遭到市场经济领头羊的美国的强烈反对。在中美对很多问题存在深刻分歧的前提下,中国能在过去四十年间,在没有根本改革自己的国家主义的政经体制的情况下,竟能迅速上升为世界第二大经济体,并正在问鼎世界老大的宝座这一事实,反衬出现行国际秩序对中国这种特色的体制的无能为力,因而美日欧正在寻找新的途径应对中国这种体制带来的严峻挑战。

由此可知,今后中美关系不会回到以前的状态中去,除非中国落实开放和改革的承诺,使自己的体制真正做到和基于市场原则的现行国际秩序相容,不然今后中国与美国及其盟国的各种摩擦必然有增无减。即使中美在G20出现某种妥协,美国多次声明,它只看重结果,所以随时可宣布休兵协议的失效。中国如果不改变说得多,说得好听,但做得少,做得慢的形象,今后与美国的摩擦无法减少。


2. 如果中美在G20上继续斗,是否意味两国关系全面恶化?您怎么看待中美在G20上的妥协前景?

假设中美在G20上继续斗,两国关系必然全面恶化。当然,两国的许多企业和机构这么多年来已发展出高度依赖对方的关系。所以,在短期内要使两国经济全面脱钩,是不可能的。阶段性地休战,以缓冲这种切割带来的阵痛和痉挛是可能的。但除非中国彻底完成所承诺的政治和经济改革,这种切割在最要害的领域,例如高科技、军民两用产品的进出口,金融,投资,特殊人才的来往、交流等,会变得日益严峻。取决于中国改革,开放的幅度和速度,如果过慢,甚至倒退的话,不排除要求全面切割的强硬派在美国获得更大的话语权,中美关系全面恶化并不是不可想象。

3. 彭斯副总统连续几次公开对华喊话警告意味非常明显,这是美中谈判策略而玩胆小鬼游戏,还是美国的国策已经决定,只能中国让步?

我无从猜测彭斯的内心活动。但从他的几次讲话来看,他对中国的批评比川普还要强硬和全面,已超越经贸范围,但与美国国防部的安全报告、国家安全委员会的安全报告以及川普最近在联合国的发言精神是一脉相承的。不排除两人有默契以扮演不同角色的可能;也不排除他在为今后竞选总统奠基自己的民意基础。对中国的怨恨和不满在民间已十分普遍,民主和共和两党的精英已意识到这股强大民意,因为要当选任何政治职位,不能无视这股民意。

要避免中美对抗,中国必须和美国谈判,所以G20提供难得的机会。中国需要说清自己对未来世界的设想和蓝图究竟是什么;在哪些地方中国自己的设想和蓝图是和美国的设想和蓝图是相容的,那些地方是不相容的,理由是什么,如何和平解决这些根本的分歧。中国自己的宪法和党纲所体现的革命精神,对守成的世界现有老大美国来说,是十分咄咄逼人的。中国必须意识到这一问题。中美在世界观上的分歧实际上是当今世界面临的一个根本问题。对此的回答已被拖延几十年。中国上升到世界老二,不久的将来也许成为老大的这种前景下,中国究竟要将世界引领到何方,已是无法回避的问题。反过来,美国已经引导世界将近百年,大家对此已经习惯,没有悬念。这是由中国还是由美国来引领今后的世界,世界各国面临的最大的不同。美国既然成功引领世界近百年,自然会坚持自己的民主加市场这一套作法。中国将提出什么应对呢?说实在的,世界至今不清楚,因为中国自称一直在改革之中。

作者系美国三一学院经济学教授

思想控制在中国由来已久

一个长期以来界定中国政府与公众关系的熟悉逻辑:把偏离常规的思想和行为病态化,然后试图强行改变它们的家长式做法。今天,政府在新疆搞的这场运动的规模和速度可能令人惊奇,但这种做法及其采用的手段一点也不奇怪。
早在公元前3世纪,哲学家荀子就认为,人性如"枸木"(弯曲的木头),在追求社会和谐的过程中,人的性格缺陷需要加以磨砺或矫正。孟子是与荀子观点对立的思想家,孟子认为人性本善,但他也强调自我完善的重要性。
与西方的自由主义截然不同的是,儒家思想——以及更广泛的中国政治文化不是有赖于个人的权利,而是有赖于对社会等级制度的接受,有赖于人可以变得完美的信念。在中国人的思想中,人不是生来平等的;人的"素质"或品质不同。例如,南疆一个贫穷的维吾尔族农民处于进化阶梯的底部;一名占人口绝大多数的汉族的官员则接近这个阶梯的顶部。

但人是可塑的,如果说素质一定程度上是先天的话,素质也是一个人的物质环境和养育的产物。正如错误的环境可能导致堕落一样,正确的环境也可以改变一个人。因此,听从被认为拥有更高素质的人——孔子称这些人为"君子"、如今共产党称之为"领导干部"——的指导很重要。
因此,即使是一个地位低下的维吾尔族农民,也可以通过教育、培训、体育锻炼,或者可能通过移居到别的地方,来提高其素质。积极帮助臣民进步,或者用中国学者迪莉娅·林(Delia Lin)的话说,把"原来有缺陷的人改造为成熟的、有能力的、负责任的公民",是一个开明、仁慈政府的道德责任。在执政的70年里,中国共产党多次试图改造不服从指挥的学生、政治对手、妓女和农民。
在中国皇权统治的许多世纪里,家庭是社会秩序的孵化器,父亲指导儿子,丈夫按照一套严格的仪式指导妻子。如果家庭和睦,整个社区也会和睦。另一方面,恶行的惩罚可以是殴打、奴役、流放,或用绞刑、斩首或凌迟处死。
如今,还有感化,也就是通过道德高尚的榜样来改进邪恶的性格特征。感化改变性格的逻辑支撑着中国的教育体制、监禁理论,甚至支撑着统一战线工作。统一战线是中共的神秘影响机构,其代理人试图争取或拉拢无党派人士和海外华人。
例如,犯人刚入狱时往往遭到孤立,然后逐渐重新融入群体。他们慢慢地被迫服从监狱人员、暴徒式的牢房头目和已经改造好了的囚犯。各种各样的手段都是了为这个目的,包括引诱(更多的食物、睡眠或人际接触)和惩罚(剥夺、酷刑、排挤)。耻辱、内疚、懊悔和认罪的经历,理应带来囚犯的悔过自新。这个过程有意地造成破坏:用当代哲学家杜维明的说法,这是在追求人类进步过程中一个必然的"痛苦和磨难"历程。
从理论上讲,这个过程的严酷程度本应被自我提升的自主愿望,以及对达不到要求的人表达同情来加以缓和。但是,中国共产党的官僚们在追求专制的过程中,把这些缓和因素放到一站。他们的改造努力在很大程度上依靠的是高压手段,而不是道德说服,多年来,他们往往残酷的手段导致了数千万中国公民的死亡。
中共试图改造的很多人受到的是"行政处罚",而不是刑事诉讼。他们被送进拘留营接受"劳动教养"(劳教)。2013年,在被批评侵犯个人权利之后,劳教制度正式废除。然而,在强制性的法律和道德培训或监护的幌子下,这种再教育如今仍在继续——不仅是在新疆。普通人和名人都可能遭受这种处罚,他们往往是不情愿的,也不能求助于法律。
2014年,演员黄海波在嫖妓后经受了6个月的"收容教育"。今年,影星范冰冰失踪了好几个月,后来她公开承认自己犯有税务欺诈行为,并赞美中国共产党。
这也是一项基层工作。在"乡村振兴"的名义下,东北黑龙江省的中共官员呼吁"规范农民的思想和行为"。东北的项目只是中共中央委员会"提高农民思想道德素质,让淳朴民风重新回归"的三年行动计划的一部分。
这些做法用在新疆、西藏或其他边疆地区时,感化似乎等同于"开化工程",用人类学家郝瑞(Stevan Harrell )的话说,其目的是在单一的"中华民族"旗帜下创造一个统一的民众。但还不止这些。在20世纪60年代,精神病学家罗伯特·杰·利夫顿(Robert Jay Lifton)把中国式的思想控制——对绝对真理的教条信仰,以及对不可救药者的强制修理——称为"意识形态极权主义"。
正如利夫顿所指出的,中国的意识形态极权主义不是一个连续的过程,而是一个周期性的现象。它会引起各种各样的情绪。有些人顺从,有的人脱离;个别人一开始可能会很热情。但随着时间的推移,这种压制的窒息特征也会滋生怨恨和反抗,而这反过来又会带来更加压制的控制方法。
在毛泽东时代,由于被拘留者和他们的监管者都遭受了饥饿和筋疲力尽,各种各样的改造运动逐渐减弱。一轮镇压会减弱,但针对不同目标的又一轮镇压会出现:1959年毛泽东下令释放的所谓右派,在仅仅几年之后的文化大革命中,又被贴上了反革命的标签而遭到围剿。
从20世纪80年代开始,邓小平的经济改革议程帮助中国社会回归到了一个更平衡、更务实的状态——至少在天安门事件发生之前是这样。但现在,中国国家主席习近平好像再次加强了镇压,他的目标包括少数民族、知识分子、律师、基督徒、劳工活动人士,甚至毛派学生。
然而,意识形态极权主义似乎包含了自我毁灭的种子。它的成本高昂。它鼓励地方党政官员滥用权力,这些官员因维稳而得到回报。权力的滥用破坏了法治和社会对政府的信任。
随着时间的推移,意识形态极权主义带来了政府的合法性受侵蚀的威胁。"一旦民众对政府的信任感和认同感降低甚至丧失,"中国学者于建嵘写道,"必将引发民众的恐慌和社会秩序的全面混乱。"
正是这个政权最根本的不安全感——对叛乱的恐惧,以及对最终的中国解体的恐惧——在推动着它越来越深入地进入到公民的私人生活中,这只会与人民更加格格不入。对新疆维吾尔族的镇压只不过是中国共产党恶毒地——也是不可持续地——追求全面控制的极端表现而已。

冯仑:官不聊生的台湾


在台湾做官是一件非常痛苦的事情。我听说在台湾如果有一个人要去当部长,家里边得开会讨论,并且多数家庭成员都不赞成,因为是闹心的苦差事。
台湾选举

第一、财产要透明。不光是现在要透明,以前的一些家族的关联的人和事、生意都要透明。比如说我经常看到报道马英九老婆买了多少股票、有几处房产,连战有多少。最后我就发现马英九的钱还不如连战多,因为连战家族本来就有很多财富,他继承下来,也会打理。在这种情况下,如果你对你的财产来源坚信没有问题,家里人才能同意你去当官。如果有点小问题,家里人不会同意。

第二、任期有限。透明也不怕,如果能干一辈子,那总能帮家里做点事。但是任期很短,说是一届,中间还随时都可能下台,比如"行政院长"也就是一年。为了这么一点时间,我全家都抖搂出去,这事不值当。在台湾做到"部长",没有说能够干十年、二十年的,多数都是半届、一届就结束了,因为是选举,选举完了以后,政党重新组合,执政党去安排人事。比如国民党执政以后,民进党很多当"部长"的都歇了。

第三、不能谋私。因为不像集权社会的政府,又不能批地什么的。政府管制越多,权力越大。台湾是充分完全竞争的市场经济,政府不管什么,所以这个官员除了给大家服务,不能以权谋私。而且还必须面对媒体和反对党,拿着放大镜,天天盯着你,没事就在找碴,你再有点小事,基本就弄死你了。

所以基本只有两类人想去做官,一类是理想主义者,比如说一些学者,像现在台湾经建会主委刘毅儒,很清廉,也不做生意,他用专业知识、专业能力服务社会,也积累经验,哪怕回来再做学者都可以;另一类是有钱人,家里不差钱,出一个伟大的人物也不错,家族光荣。只有这两类人在台湾做官有积极性,凡是没有理想,家里还得做买卖的人,都不愿意搅和这事。日本也有这样的现象。

在台湾做官需要涵养特别好,因为到立法院,立法委员们会不断要修理你。内阁成员、部长都要到立法院去回答质询。如果你这个部长是国民党,那你到立法院,民进党就会随便收拾你,让你一上午站在那儿听人讲,给你画漫画丑化你。你稍微有点不能回答问题,对方就开始攻击你。这些议员都是名嘴,受教育水平也很好,你要到立法院能扛得住折腾,这本身需要好的涵养。
台湾立法院

另外媒体有时候无中生有、造谣、谩骂、批评,你要扛不住就做不了这个官。所以有的官员家里边就很憋屈,说受这气干吗,我又不缺钱,你在这儿天天待着,天天这么被糟蹋。

此外,还要到地方议会不断要去争取选民的支持,要服务于基层。你要态度好、身体好。我有次在一个会上,意外碰见"立法院长"王金平,他态度谦和,跟正常人一样。还有一次开会是马英九在台上跟大家聊,谦卑、温良,超乎我的想象,绝对让人肃然起敬。官场生态包括政党竞争,逐步使台湾的官员都具备了涵养、温和和耐心。(tnnd,这在大陆不可想像啊)
王金平

官场也还有风险,经常遭受暴力冲突和暗杀,比如最近一次五都选举当中连胜文受伤,被法院裁判是误伤,但连胜文不赞成,所以在台湾真是官不聊生,人民幸福。官员体系除了服务,不能索取;除了倾听,不能够训斥;除了检讨,不能牛逼。比如说台湾飓风之后,有个村庄被泥石流淹了,马英九不断鞠躬,在电视上道歉,这在威权社会是不能想象的一个事情。

我记得韩寒写过一篇微博,叫《未来最快乐的事》,就是有一天当我们把权力关进笼子里,而我们能够弹冠相庆,这就是节日。台湾就是把公权力管住了,公权力成了孙子,人民成了大爷,因为人民变成了公民,公民变成了选民,官员变成了公务员,公务员变成了服务员。

在台湾跟政府打交道,和我在纽约跟政府打交道,感觉是一样的。我在纽约做中国中心,纽约市政府的市长三次竞选,自己拿了3.2亿美金来选。选上以后,七年每天坐地铁上班,一年只拿一块钱工资。他手下招商局的局长,也是亿万富翁,给我们服务,最多喝过一杯啤酒,我们给他礼品,他都交回去,而且提醒我们下次不要拿了。但是所有事情尽心尽力负责,有一次嗓子都哑了,发着烧,还给我们讲。我很感动,哪来这么大干劲,他也不差钱,他工资也是一年拿一块钱,这是理想主义者、专业人才。在台湾也是,你只要约见任何政府服务人员、公务人员,非常顺利,而且谈得很清楚。这样的政府你才觉得是服务型政府。

主歌:中美摊牌时刻到了


NGINX as a SPDY load balancer for Node.js

Background

Recently we wanted to integrate SPDY into our stack at SocialRadar to make requests to our API a bit more speedy (hurr hurr). Particularly for multiple subsequent requests in rapid succession, avoiding that TCP handshake on every request would be quite nice.
Android has supported SPDY in its networking library for a little while and iOS added SPDY support in iOS 8 so we could get some nice performance boosts on our two most used platforms.
Previously, we had clients connecting via normal HTTPS on port 443 to an Elastic Load Balancer which would handle the SSL negotiation and proxy requests into our backend running Node.js over standard HTTP. This was working nicely for us and we didn’t have to handle any SSL certs in our Node.js codebase which was beneficial both for cleanliness and for performance.
However, when we wanted to enable SPDY, we discovered that
  1. AWS Elastic Load Balancers don’t support SPDY
  2. In order for SPDY to work optimally, it would need an end-to-end channel[1]
So, I set out to find alternatives.
Ultimately I settled on using NGINX as it had SPDY proxy support, it’s fast, and it’s relatively easy to configure. My configuration details follow, hopefully it’ll be helpful to others endeavoring to do the same.
We will assume for the purposes of this that you have a server, we’ll refer to as the Load Balancer in this article since that will be its primary purpose.

 Step 1: Configuring NGINX

So our first step is to configure NGINX. We want it to act like a load balancer, proxying requests to the Node.js instances in our cluster.
In order to do this, we’ll need a few core things, explained in greater detail below:
  • A recent version of NGINX which supports NPN (next protocol negotiation) which SPDY needs
  • The SSL cert on our NGINX servers so they can handle the incoming data
  • Configuration for acting as a proxy to our Node.js servers

 Grab the latest version of NGINX

First, ensure you have a recent version of NGINX installed on your Load Balancer server. The default version installed from apt-get on the latest version of Ubuntu (Trusty Tahr) is sadly too out of date to support NPN, the special sauce needed for NGINX to support SPDY. (I believe it is 1.4.x)
We use Chef to manage our deployments, so we added the following to our chef recipe to ensure we grabbed and installed the latest:
apt_repository "nginx" do
  uri "http://nginx.org/packages/ubuntu/"
  distribution node['lsb']['codename']
  components ['nginx']
  deb_src false
  key 'http://nginx.org/keys/nginx_signing.key'
  keyserver nil
  action 'add'
end

package "nginx"
As of this writing (October 2014), this installed version 1.6.2 of NGINX
If you’re not using Chef or Ubuntu, I suggest looking on the NGINX websitefor information on installing the latest stable version.

 Get your SSL certs on your Load Balancer server

SSL certs tend to be rather confusing, and it would be too much for us to cover in-depth for the purposes of this article, so we will assume you have gotten your SSL certs somehow. In our case, we have a wildcard cert for our domain which we used for this load balancer.
What worked for us was getting 2 files, the ssl certificate (file ending in .crt) and the ssl certificate key (file ending in .pem). We had some other files (such as one ending in .key) that we didn’t need.[2]
So anyway, get those 2 files (.crt and .pem) onto your server.

 Build your nginx.conf file

So now you’ve got NGINX installed on Load Balancer, we need to configure it.
We used the following configuration for ours (filled in with some dummy data):
error_log /srv/logs/loadbalancer/error.log;

events {
    worker_connections 1024;
    multi_accept on;
}

http {
    upstream nodejsservers {
        ip_hash;
        server server1.yourdomain.com:9081;
        server server2yourdomain.com:9081;
        server server3.yourdomain.com:9081;
        server server4.yourdomain.com:9081;
    }
    server {
        access_log      /srv/logs/loadbalancer/access.log;

        # Only requests to our Host are allowed
        if ($host !~ ^(api.yourdomain.com)$ ) {
           return 444;
        }

        listen 443 ssl spdy;

        ssl on;
        ssl_certificate     ssl/yourdomain.com.crt;
        ssl_certificate_key ssl/yourdomain.com.private.pem;

        location / {
            # Let the client know about spdy
            add_header        Alternate-Protocol  443:npn-spdy/2;

            proxy_pass https://nodejsservers;

            # Set headers
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}
I have a breakdown of some chunks below to help explain what different sections are doing:
upstream nodejsservers {
    ip_hash;
    server server1.yourdomain.com:9081;
    server server2yourdomain.com:9081;
    server server3.yourdomain.com:9081;
    server server4.yourdomain.com:9081;
}
Above we are specifying the list of servers for which our load balancer will route requests. In our case we have 4 different servers. In this example, it’s hard-coded, but in our real-world setup, we fill this list with Chef so we can add a server in one place and it’s updated here.
These are our Node.js servers. In our case they are each serving a SPDY server on port 9081. This was a rather arbitrary port selection, high enough in the range so we don’t need to run Node.js as root, but otherwise mostly historic internally.
We specify ip_hash because we want to use an ip hash for affinity so a given client will reliably connect to the same terminal server, thereby maximizing the benefit of using SPDY.[3]
# Only requests to our Host are allowed
if ($host !~ ^(api.yourdomain.com)$ ) {
    return 444;
}
This adds a tiny bit of added security, ensuring only requests to api.yourdomain.com are actually routed through this load balancer, returning the HTTP response code 444 otherwise.
listen 443 ssl spdy;

ssl on;
ssl_certificate     ssl/yourdomain.com.crt;
ssl_certificate_key ssl/yourdomain.com.private.pem;
We want our Load Balancer to listen on port 443 for SSL and SPDY traffic which of course it will forward along to our servers. It needs to hold our certs in order to pass on that traffic.
# Let the client know about spdy
add_header        Alternate-Protocol  443:npn-spdy/2;
As the comment suggests, we want to announce that we accept SPDY.
proxy_pass https://nodejsservers;
A key line, basically instructing NGINX that we want to proxy requests to our cluster above. Node we called it nodejsservers in our upstreamdefinition above. This is what allows us to refer to it here and have NGINX understand it.
# Set headers
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
We want to set some headers before forwarding it on so our terminal applications have the real ip of the requests. Without it, all requests will look as though they are coming from our load balancer.

 Step 2: Configuring our Node.js servers

So now we have NGINX operating as a proxy to spread load among our Node.js servers, we now need to update them to be able to handle SPDY requests.

 Get your SSL certs on your Node.js servers

Same as above, we want the .crt and .pem files. In our case we used the exact same 2 files on the load balancer as on our Node servers.

 Update Node.js code to accept SPDY

Now that we have the certs, let’s use ‘em!
Below is a simplified version of an app running Express. But the same technique would work for Koa, or anything else which builds upon Node’s baked in HTTP request as Express and Koa both do.
var express = require("express");
var spdy = require("spdy");

var app = module.exports = express();

// routes, middleware, etc. omitted

spdy.createServer({
    key: yourdomain.com.private.pem,
    cert: yourdomain.com.crt
}, app).listen(9081);
We used port 9081 as specified in our NGINX config above. Again, any port works, as long as NGINX is routing the SPDY traffic to a port open on your Node.js servers.

 Epilogue: Load balancing the load balancer

Doing things exactly as described above is awesome for allowing multiple Node.js servers to handle SPDY requests, however it introduces a single point of failure, namely the load balancer.
Of course this is not ideal! The AWS Elastic Load Balancer comes with some fault tolerance baked in. How can we get around this?
Well, in our case, we deployed multiple load balancers like this in multiple availability zones.
Using Route53, we can set up DNS with routing policies such as Latency, Geolocation, Failover, and more. Depending on your application, use the one fit for the job.
For example, if you just have multiple load balancers all in us-east-1, you may want to use simple failover. But if you have multiple data centers, say one in us-east-1 and one in eu-west-1, you can have requests route to the correct load balancer closest to the appropriate data center with Latency or Geolocation routing policies. Not only will this speed up performance (so a request from say, Russia doesn’t have to travel around the entire world to Virginia to then be load balanced back to the server in Europe) but also provide failover, so if one of the load balancers goes down, the other can continue servicing requests until a new one is brought online.
You should follow me on twitter here.
[1]: Why not terminate SPDY at the load balancer and just communicate via HTTP to the Node.js servers? Because then we are not eliminating the TCP handshake, just pushing it further into our system. We could take this approach, but then our load balancer will be doing the TCP handshake with our Node.js servers so we’re just pushing the problem down the line. Only ensuring the SPDY pipe is ending with a server will truly eliminate that.
[2]: YMMV, honestly I don’t feel comfortable enough with SSL certs to explain the difference, I did some trial and error to get it working. Searching the web for “which freaking SSL files do I need for this” or “I have a .crt, .pem and .key, which file is which and which goes where” didn’t yield much in the way of useful results.
[3]: I have read that ip_hash can be is suboptimal in many circumstances because it doesn’t evenly spread load, but we need some kind of affinity so a single client connecting to our API keeps connecting to the same server or a lot of the benefit of SPDY (avoiding the TCP handshake and the pipelining) goes out the window. Most of the other selections for affinity (such as sticky) use some sort of cookie based mechanism for ensuring a client hits the same server on a subsequent request, but since basically all of our requests are API calls made from mobile devices to our backend, cookie based affinity didn’t make much sense. For browser based traffic, this makes more sense, but our clients don’t use cookies for anything.
from http://blog.victorquinn.com/nginx-as-a-spdy-reverse-proxy-passthrough