







分享个人经验,保留阅读记录,做时间的朋友
为什么全世界几乎都躺平了,中国还是这么倔强?奥密克戎做梦都没想到,会遇到这样子一个杠精。
2022年3月14日清晨上班途中,看到张文宏医生发布的微博,貌似这也是他最后一次对于上海疫情长篇大论的发表自己的看法。
从此以后,噤若寒蝉。
跟张医生一起消失在记者发布会和公众视线的还有吴凡女士,复旦大学上海医学院副院长,上海市重大传染病和生物安全研究院院长。
“上海绝对不能封城,三天也不行。”这句话出自吴院长之口,以至于抖音和快手现在还在滚动播放这条三个月之前的采访视频。
“上海,是全国人民的上海……”。三个月河东,三个月河西。今天是2022年4月26日,整个上海6340.5平方公里,已经实施全面封控27天。
吴博士接受十八路记者采访的时候,字正腔圆,掷地有声,丝毫没有苏北盐城的口音,一度我以为她是土生土长的上海本地人。每次出席新闻发布会直播,她的耳钉特别精致,忽闪忽闪。
当时我就是替她暗暗捏把汗的,谁给了她这么大的勇气是梁静茹吗?作为一名卫生专业科班出身勤奋好学拾阶而上的公共卫生和疾控管理领域的干部,对不起,你越界了。
用封控前一天陆家嘴滨江师兄弟聚餐时我师兄的原话来说,你有点膨胀了。师兄位高权不重,不过就是提醒我:拎着壶满桌敬酒就是膨胀。就你这个小身板,你是靠脑子吃饭的,又不是靠酱香型白酒咯?
无论如何,专业的人,做专业的事情,仅限于在专业的领域内,发出自己的声音。
有句话怎么说来着:其实坦诚,即说出自己内心最真实的想法,可以解决90%以上的问题。剩余的10%,如果你不想撒谎,那就用沉默来解决。
在贾雷德·戴蒙德编著的《枪炮、病菌与钢铁:人类社会的命运》一书中,疫情至少涉及:生物学、免疫学、生理学、病理学、诊断学、环境学、营养学、卫生学、人口学、社会学、传播学、政治学、经济学等多个学科。
在全球互联网的浪潮和民粹主义的趋势下,甚至还要考历史沿革、文化传统、意识形态、宗教因素差异和国际地缘政治等一系列影响因子。
疫情肆虐的三年多来,各路人马、精英和政客,各抒己见,大有你刚唱罢我登场的态势。其实各个学科的专业人士发表一些专业意见和观点,有争议、甚至有斗争都很正常。
因为大家都在盲人摸象,无一例外。
但有一个前提:这些观点也好、建议也好、论文也好,都必须基于自身对于科学和专业的尊重、对于道德和常识的敬畏、和对于真相和真理的追求。
基于上述这样一个基本前提:其实很多的想法、说法或者做法,都有合理的一面,但同时又会在时间的动态演变过程中,不断的被重组、被整合、被批评、被撕裂甚至被攻击。当然,被绑架不在我们讨论的范畴。
这件事情,就关乎到习总书记执政理念的两个关键词:最大公约数,命运共同体。大家伙沉住气:少用脑,多用心,耐心的琢磨一下这两个关键词,所有的答案,没错,他会自动浮出社会的水平面。
其实从心理学和认识行为学的视角来剖析:前期的反复、摇摆和纠结,还有大量的沉没成本和心理成本,都是最终科学、理性决策的必不可少的一个环节,一个部分。
国家和城市尚且如此,我们个人在处理学业、家庭、婚姻、事业的过程中更是不能例外。所以也没啥愤怒、懊恼和后悔的。
可以负责任的说:这件事情也不能全赖政府。现在大众舆论一边倒的黑管理当局,其实是一种噪声和羊群效应。基层部分老百姓的素质也委实堪忧,因为本来部署的无症状感染者、轻微症状的一律居家隔离的,这是一个既定的策略和战术。
几乎接近产生舆情事件:部分居民表示非理性的抵制和反对,呼吁有关部门把这个群体运出去。闹,使劲的闹。这种举报和搞事情的精神,或多或少有点那个那个传承基因的。
哀其不幸,怒其不争。结果搬起石头砸了自己的脚不算,全上海2700万民众跟着一起买单。
这一小撮的群体,迫使既定的防疫抗疫政策瞬间转向。完全背离前期专家达成的共识和路径。前段时间刷屏的疾控中心那位女士的公开音频可以佐证:接下来发生的一切不足为奇。据说有plan b和 plan c, 但均不是应对目前这种极端情况。
用交大同窗的话来说:危机关头,其实最考验的、最本质和最关键的,决战的胜负还是依赖于社会民众的人文素质和科学素养。人无远虑,必有近忧。
这些年习总书记反复强调的四个自信,高瞻远瞩,字字珠玑。但是地方政府在中观管理的层面,必须落实另外四个自信:专业自信、战略自信、决策自信和执行力自信,否则真的辜负我党和习总书记的一片丹心和期待。
现在目前这种情况,上海的老百姓很难受,貌似地方主政各个条线、各个区块的官员更难受。这是历史上很少有发生的,用当年李敖先生竞选台湾议员时的誓言和抱负来形容:我要让台湾的政坛“官不聊生“。
可惜先生壮志未酬,驾鹤西去。
早在半年前,南方医科大学的郑磊教授说:试错本身就有两种可能——对或错。错了,证明这条路走不通,甚至于以前有些判断是理想化的——也是有价值的。承认就行。我们都误判过。需要求助的时候就要求助,该感谢就感谢,该改进就改进,也没什么拉不下面子的。海纳百川不是顾影自怜,众志成城也不是只有一座城。
郑教授直抒胸臆的时候,其实上海还在沉醉于“20平米中风险区域提示”的高峰体验中。我现在就特别心疼在人民大道上班的同学和朋友,以后走在大街上怎么见人?因为小区里也有体制内的正级处级个别局级在做志愿者,压根儿就不敢暴露自己的真实身份。
中国历来有句古话:人在衙门好修行。怎么修行?
王阳明的方法论说的是:怀菩萨心肠,行霹雳手段。“慎言笃行”是老祖宗传下来的智慧。
目前这个节点我们比任何时候都需要:摸着良心说话,摸着石头过河。
老庄就一直提醒后人:卦不能算尽,畏天道无常;言不可至满,恐大梦一场。
从心理学的视角来看:前期的反复、摇摆和纠结,包括大量的沉没成本和心理成本,都是最终科学、理性决策的必不可少的一个环节,一个部分。
国家和城市尚且如此,我们个人在处理学业、家庭、婚姻、事业的过程中更是不能例外。所以也没啥好愤怒、指责或者后悔的。
执业医生或科研工作者,凭其专业性在城市公共政策制定方面的影响力是有的,而且历来是上海城市治理的一个优良传统和特色之一。
但是需要保持最低限度的清醒;这种影响力是很有限的。 所以我一看到某些教授名片上印着政府决策咨询专家等字眼,我就不对付,好像他们真能怎么滴似的。恩,啥职业都能飘,唯独学者不能飘。
学而优则仕,这个大家都知道,说的是学习好、专业好的人可以从政以达济天下。
但上一句其实更重要、更关键:仕而优则学。
所以,问题的关键就在于:决策者需要将各种专业的建议整合吸收,形成自己的想法。用教育学和心理学的术语来说就是“内化”。
敲黑板,重点来了:以后要提升的绝对不是自信二字,而是自信后面的两个字:专业、战略、决策及执行。艺高人才胆大,否则瞻前顾后,首鼠两端,如何心有猛虎,细嗅蔷薇?
我们对自己最大的误解,就是我们习惯性对于自己的认知、专业、视野、判断和经验深信不疑。当遇到和自己信念相违背的事件时,往往就会产生认知阻碍,进而形成一种内心冲突,外化出来就是“固执”、“我执”。
恰好早上老姐发来两段话:“凡是你排斥的都是你应该学习的,这被称之为认知边界,而边界就是用来突破的。”
“面对认知不及我的,当包容与慈悲;横向拓展,当尊重与谦卑;对于优秀的,被吸引与去追随。”
古希腊哲学家爱比克泰德早在2000多年前就说过类似的桥段:对于可控的事情,要保持谨慎。对于不可控的事情,要保持乐观。人只能做能力范围内的事情。你要接受或者学会这个事实,并且以乐观的心,来应对这一切。
朋友圈也并非没有高人。行云流水,格物致知,好在教授的字里行间,谨慎乐观。
事实上,人类对新冠病毒的了解是非常浅显的。
科学结论也随时会被反转的,如果大家记忆力好的话,三年来科学界到底被啪啪啪打脸多少回,无论国内还是国外。“人民的希望”反复破灭。
目前,仍然是这样。
比尔盖茨三月初的时候宣称奥密克戎是天然疫苗,今年会结束;而12日美国《科学时报》则表明即便最轻微的新冠肺炎大脑也会受到损害,英国牛津大学在《自然》杂志上的论文也验证了新冠对大脑的影响。
香港儿科医学会会长、港大医学院儿童及青少年科学系副教授叶柏强在表示,奥密克戎变种病毒对儿童的杀伤力大。
也就是说,即便你在上海亲身得了这病,感觉没事,所以得出结论是:新冠没那么严重,根本就是个谎言。这个结论本身,既是正确的也是不正确的。
正确的是你个人的体验是真实的,不正确的是,中国那么大,样本那么复杂,医疗资源分布那么不均,你的结论,代替不了整个中国的决策。
更何况,我们还不知道未来这病毒朝哪个方向变异,饶毅说了一段话,大家可以再去看看病毒变异的规律,完全不一定就是“温和”的。
4月15日,美国“钟南山”福奇撰文表示,“传统的群体免疫概念可能不适用于新冠病毒”,并表示“这意味着相当长一段时间内,新冠病毒不会在人群中消失”。
流行病学家曾光说的很好:让子弹飞一会儿,让国外先开放,我们看看开放的结果,坚持动态清零,静观其变,当清零红利没有的时候,自然会有更优的选择。
我历来喜欢专治各种不服,但是这一次,我就特别欣赏这位专家也是临床教授的观点。
我们不妨再假设一下:除了奥密克戎,我们还有什么更重要的事情去操心,去思考,去探索,去推动,去落实?与其说这是一道选择题,不如说是一道思考题。两岸关系,国际局势,鸟乌战争,粮食危机,金融安全,政府负债,科技攻关,社会治理….哪一件事情不比奥密克戎重要性、紧迫性、战略性高出百倍?
这次上海滩,成为“上海瘫”,不是偶然的,也有必然性。党媒两周前就发出“国家行政有效,基层治理无效”的警告和声音。关于疫苗、核酸和抗原检测后面的阴谋论和故事更是风云变化扑朔迷离。
天下难治,一般都以为人民难治,殊不知真正难治的,不是人民,而是官吏。五千年的中华文明历来有种提法:明主治吏不治民。举个例子,故宫养心殿至今仍然保留着雍正手书自勉的对联:惟以一人治天下,岂为天下奉一人?
后来有学者考证:这句话的原始知识产权出自隋炀帝之手,这个暂且不表。问题是作为“军机处”的发明专利人:天下最缺乏安全感的一个人,能给芸芸众生带来安全感吗?
权力越大越任性,也越缺乏安全感。这点几乎是一个常识,因为有太多人觊觎这个位置了。甚至知乎宇宙上有过这样一个梗:你尝试过被一只蜗牛的追杀吗?不管你在哪个地方,该蜗牛都会慢腾腾向你所在的方向靠近。
“明主治吏不治民”的治吏思想,在“礼法并用,综合为治”的框架体系内不断完善,这个归结于历朝历代诸子百家的努力。如今关于国家治理、社会治理乃至企业治理的提法不绝于耳,那么问题来了:究竟是治理还是治吏?这似乎不是二选一,而是一个优先劣后的范畴。
同样的,关于“把权力关进制度的笼子里”这件事情,我们就必须要先弄明白 “为什么关”和“怎么关”这两个问题。从政治学和公共管理的角度来拆解,并非本人专业或所长。不过基于数字化、数据挖掘、人工智能、数字孪生等技术的视角,可能会有一些意外的心得和收获。
我始终认为:坏的算法利用人性,消费人性,放大人性的自然属性,而好的算法可以控制人性的弱点、个体乃至群体的非理性行为。
技术导向的社会治理,有的学者喜欢造字曰“社会智理”暂且不管,其最大的精妙之处在于:外在的约束和激励机制,本质可以对个体、群体进行刻意的训练、引导和驯化,甚至可以形成肌肉记忆。这个具有神经脑科学、认知行为学和心理学的理论基础。
重要的事情再说一遍:上述这个提法,具备的是自然科学理论基础,不是唾沫星子横飞的社会科学。如此安排,新兴技术能否从一个单纯推动经济发展的要素和内生变量,逐步转变为可以同时为改善个体、群体和社会内在的契约和人文精神而效力?
黄仁宇博士,不过据说这位学者的有些表述和提法最近比较敏感。不过先生的《万历十五年》书里有个表述我印象特别深:凡能先用法律及技术解决的问题,不要先就扯上了一个道德问题。因为道德是一切意义的根源,不能分割,也不便妥协。如果道德上的争执持久不能解决,双方的距离越来越远,则迟早必导致于战争。
这段话应用于当下疫情防控和社会治理状况,十分应景。
这几天还有个流传甚广的段子,讲的是抗疫救灾如何科学组织、如何精准处置、甚至如何五一调休(一想到这件事情我就来气),有一个网友就怯怯的提问:你们做了这么多精心的部署,人家奥密克戎知道吗?
我现在则想理直气壮的提问:我们的顶层设计、发展纲要、实施策略,具备这些政策传导、工具组合、信号触达、良性博弈的民众基础吗?
最近外部环境一直很动荡,为我们的生活增添了更多不确定性。在这样的背景下,很多人会问,“面对无常,我们究竟该如何自处,如何思考?”
其实,当你问出这样的问题,恭喜你!这意味着你已经伸手触碰到了:一个通往真相、通往更广阔天地的机会。
世界并没有变,从来就没有变过。它始终都是有好有坏,有黑暗有光明,有欢喜有悲伤的。你之所以会有很 强烈 的感觉变化,是因为,之前的你体验的现实太狭隘片面。事与愿违,其实是再正常不过的了。
用新生代心理学者周小宽的描述:你可以想象任何美好的愿望,并怀抱这样的愿望,你也可以去 “投射” 结局,但现实不会接受你的所有投射。愿望再强烈和坚定,你也无法把结局 “投射” 成你要的样子。
无常并不只是意味着不好的事情会突然发生。你沿着好的期待走下去,可能遇见幻灭和悲伤,但你沿着坏的轨迹走下去,也可能遇见惊喜。
很多时候,我们不是在掌控事情或者掌控关系,我们只是被 “掌控的错觉” 给掌控了。因为我们太需要可以掌控一切的错觉,以逃避未来的一切其实都不可掌控的真实。
之所以没有用太多的温柔去写我们如何面对无常,是因为,面对无常光靠温柔和共情,远远不够。无常有时候带来的摧毁是剧烈的,黑暗是可怖的,席卷而来,这时候最需要的是,稳定和力量。
也许在你身边,你会发现那种稳定而有力量的人——他们不是活在全部的光明里,他们是在黑暗中守着最后一束光的人。他们是那种面对了生活本身,承担了责任,认清了无常,不虚幻未来,却每一天都战斗在平凡生活中的普通人。
他们真实,强大,在今天的不容易和明天的不如意中活着,守护着黑暗中的光,坚持着自己的坚持。这才是生命和正念的奇迹。
对躁郁症做出了重要研究的全球顶尖权威、医界英雄杰米森,以自己三十年和躁郁症相伴的人生写出了著作《躁郁之心》。
在其中她写道:因为哭得更多,所以欢笑也更多;因为经历过所有的冬日,所以更能欣赏春天;因为死亡如紧身衣一般,所以更了解生命的意义;因为看到人性最善良和丑陋的部分,所以慢慢了解关心、忠诚和豁达的价值。
我们无法掌控人生。是的,我们甚至无法掌控我们自己,状态、情绪、潜意识。我们能做的很有限,那就在很有限中去尽情地挥洒你自己。“以最卑微的梦,致那黑夜中的呜咽和怒吼,谁说站在光里的,才算英雄。”
无论如何,身心和谐,言行一致,知行合一,才是我们生活的基本盘和压舱石。
还有点时间,我再引申一下“人定胜天”这件事情,它的常规汉语解释为:人的智慧和力量一定能够战胜自然。一点毛病都没有,很长的一段时间我们甚至提倡:与天奋斗,与地奋斗,改天换地,热情高涨,其乐无穷。
但我们回过神来,仔细想一想:自然界一个地震,一个洪水,一个小小的传染病毒,我们就无能为力,手足无措了。我们怎么能够胜天呢?还一定能,这是一种唯心还是唯物?再深究就涉及意识形态了,暂且不表。
那么这个定是什么意思呢?这个定,本质上可能是《大学》上所说的:知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。
这个定,可能就是佛法所指的,“戒定慧”的定:因戒得定,因定开慧。而按老子道德经的说法则是:人不定天亦不定,人定天亦定也。
讲到这里,我们大概均以或多或少的明了:“人定胜天”的本意是,人的内心安定下来,才有可能战胜自然。但也不能这么说的这么刚,貌似是才有可能与自然和平共处、和睦相处。
归根到底,夫唯不争,故天下莫能与之争。说的就是浩如烟海儒释道最精髓的三个关键词:慈悲,智慧和宽容。
行文至此,我特别要强调的一件事情是:无论何时,无论何地,无论是居庙堂之高,还是处江湖之远,宽容始终是一件双向的事:自上而下的宽容是修养,自下而上的宽容是修行。
酷似当下的一个热词“双向奔赴”的既视感有没有?
最后,祝大家安住当下,安顿好自己和家人。心有余力,力所能及,顺便照顾一下身边的人和事情。
转自:https://mp.weixin.qq.com/s/ENv1GCr-ESZy7ojYzPQkdA
Django在生产环境的部署还是比较复杂的, 令很多新手望而生畏, 幸运的是使用Docker容器化技术可以大大简化我们Django在生产环境的部署并提升我们应用的可移植性。Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux机器上。
前文我们介绍了如何使用docker-compose八步部署Django + Uwsgi + Nginx + MySQL + Redis (多容器组合),但该教程里有很多值得改进的地方,比如:
本文将是docker-compose部署Django + Uwsgi + Nginx + MySQL + Redis教程的升级版,将完善前面教程不足的地方,很多配置文件将会有非常大的参考价值,建议先收藏再阅读。
注意:本文侧重于Docker技术在部署Django时的实际应用,而不是Docker基础教程。对Docker命令不熟悉的读者们建议先学习下Docker及Docker-compose基础命令。
Docker-compose是一个用来定义和运行复杂应用的 Docker 工具。使用 docker-compose 后不再需要使用 shell 脚本来逐一创建和启动容器,还可以通过 docker-compose.yml 文件构建和管理复杂多容器组合。
Docker-compose的下载和安装很简单,网上有很多教程,我就不再详述了。这里只记录下ubuntu系统下docker-compose的安装过程。
# Step 1: 以ubuntu为例,下载docker-compose
$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# Step 2: 给予docker-compose可执行权限
$ sudo chmod +x /usr/local/bin/docker-compose
# Step 3: 查看docker-compose版本
$ docker-compose --version
注意:安装docker-compose前必需先安装好docker。
本例中我们将使用docker-compose编排并启动4个容器,这更接近于实际生成环境下的部署。
Django + Uwsgi容器:核心应用程序,处理动态请求
MySQL 容器:数据库服务
Redis 容器:缓存服务
Nginx容器:反向代理服务并处理静态资源请求
这四个容器的依赖关系是:Django+Uwsgi 容器依赖 Redis 容器和 MySQL 容器,Nginx 容器依赖Django+Uwsgi容器。为了方便容器间的相互访问和通信,我们使用docker-compose时可以给每个容器取个别名,这样访问容器时就可以直接使用别名访问,而不使用Docker临时给容器分配的IP了。
这四个容器的别名及通信端口如下图所示:
我们新建了一个compose文件夹,专门存放用于构建其它容器镜像的Dockerfile及配置文件。compose文件夹与django项目的根目录myproject同级。这样做的好处是不同的django项目可以共享compose文件夹。
myproject_docker # 项目根目录
├── compose # 存放各项容器服务的Dockerfile和配置文件
│ ├── mysql
│ │ ├── conf
│ │ │ └── my.cnf # MySQL配置文件
│ │ └── init
│ │ └── init.sql # MySQL启动脚本
│ ├── nginx
│ │ ├── Dockerfile # 构建Nginx镜像所的Dockerfile
│ │ ├── log # 挂载保存nginx容器内日志log目录
│ │ ├── nginx.conf # Nginx配置文件
│ │ └── ssl # 如果需要配置https需要用到
│ ├── redis
│ │ └── redis.conf # redis配置文件
│ └── uwsgi # 挂载保存django+uwsgi容器内uwsgi日志
├── docker-compose.yml # 核心编排文件
└── myproject # 常规Django项目目录
├── Dockerfile # 构建Django+Uwsgi镜像的Dockerfile
├── apps # 存放Django项目的各个apps
├── manage.py
├── myproject # Django项目配置文件
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── pip.conf # 非必需。pypi源设置成国内,加速pip安装
├── requirements.txt # Django项目依赖文件
├── .env # 环境变量文件
├── start.sh # 启动Django+Uwsgi容器后要执行的脚本
├── media # 用户上传的媒体资源,如果没有需手动创建
├── static #搜集项目的静态文件夹,如果没有需手动创建
└── uwsgi.ini # uwsgi配置文件
下面我们开始正式部署。
修改过的docker-compose.yml的核心内容如下。我们定义了4个数据卷,用于挂载各个容器内动态生成的数据,比如MySQL的存储数据,redis生成的快照、django+uwsgi容器中收集的静态文件以及用户上传的媒体资源。这样即使删除容器,容器内产生的数据也不会丢失。
我们还定义了3个网络,分别为nginx_network
(用于nginx和web容器间的通信),db_network
(用于db和web容器间的通信)和redis_network
(用于redis和web容器间的通信)。
整个编排里包含4项容器服务,别名分别为redis
, db
, nginx
和web
,接下来我们将依次看看各个容器的Dockerfile和配置文件。
version: "3"
volumes: # 自定义数据卷
db_vol: #定义数据卷同步存放容器内mysql数据
redis_vol: #定义数据卷同步存放redis数据
media_vol: #定义数据卷同步存放web项目用户上传到media文件夹的数据
static_vol: #定义数据卷同步存放web项目static文件夹的数据
networks: # 自定义网络(默认桥接), 不使用links通信
nginx_network:
driver: bridge
db_network:
driver: bridge
redis_network:
driver: bridge
services:
redis:
image: redis:latest
command: redis-server /etc/redis/redis.conf # 容器启动后启动redis服务器
networks:
- redis_network
volumes:
- redis_vol:/data # 通过挂载给redis数据备份
- ./compose/redis/redis.conf:/etc/redis/redis.conf # 挂载redis配置文件
ports:
- "6379:6379"
restart: always # always表容器运行发生错误时一直重启
db:
image: mysql
env_file:
- ./myproject/.env # 使用了环境变量文件
networks:
- db_network
volumes:
- db_vol:/var/lib/mysql:rw # 挂载数据库数据, 可读可写
- ./compose/mysql/conf/my.cnf:/etc/mysql/my.cnf # 挂载配置文件
- ./compose/mysql/init:/docker-entrypoint-initdb.d/ # 挂载数据初始化sql脚本
ports:
- "3306:3306" # 与配置文件保持一致
restart: always
web:
build: ./myproject
expose:
- "8000"
volumes:
- ./myproject:/var/www/html/myproject # 挂载项目代码
- static_vol:/var/www/html/myproject/static # 以数据卷挂载容器内static文件
- media_vol:/var/www/html/myproject/media # 以数据卷挂载容器内用户上传媒体文件
- ./compose/uwsgi:/tmp # 挂载uwsgi日志
networks:
- nginx_network
- db_network
- redis_network
depends_on:
- db
- redis
restart: always
tty: true
stdin_open: true
nginx:
build: ./compose/nginx
ports:
- "80:80"
- "443:443"
expose:
- "80"
volumes:
- ./compose/nginx/nginx.conf:/etc/nginx/conf.d/nginx.conf # 挂载nginx配置文件
- ./compose/nginx/ssl:/usr/share/nginx/ssl # 挂载ssl证书目录
- ./compose/nginx/log:/var/log/nginx # 挂载日志
- static_vol:/usr/share/nginx/html/static # 挂载静态文件
- media_vol:/usr/share/nginx/html/media # 挂载用户上传媒体文件
networks:
- nginx_network
depends_on:
- web
restart: always
构建Web镜像(Django+Uwsgi)的所使用的Dockerfile如下所示:
# 建立 python 3.9环境
FROM python:3.9
# 安装netcat
RUN apt-get update && apt install -y netcat
# 镜像作者大江狗
MAINTAINER DJG
# 设置 python 环境变量
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# 可选:设置镜像源为国内
COPY pip.conf /root/.pip/pip.conf
# 容器内创建 myproject 文件夹
ENV APP_HOME=/var/www/html/myproject
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
# 将当前目录加入到工作目录中(. 表示当前目录)
ADD . $APP_HOME
# 更新pip版本
RUN /usr/local/bin/python -m pip install --upgrade pip
# 安装项目依赖
RUN pip install -r requirements/production.txt
# 移除r in windows
RUN sed -i 's/r//' ./start.sh
# 给start.sh可执行权限
RUN chmod +x ./start.sh
# 数据迁移,并使用uwsgi启动服务
ENTRYPOINT /bin/bash ./start.sh
本Django项目所依赖的requirements.txt
内容如下所示:
# django
django==3.2
# uwsgi
uwsgi==2.0.18
# mysql
mysqlclient==1.4.6
# redis
django-redis==4.12.1
redis==3.5.3
# for images
Pillow==8.2.0
start.sh
脚本文件内容如下所示。最重要的是最后一句,使用uwsgi.ini配置文件启动Django服务。
#!/bin/bash
# 从第一行到最后一行分别表示:
# 1. 等待MySQL服务启动后再进行数据迁移。nc即netcat缩写
# 2. 收集静态文件到根目录static文件夹,
# 3. 生成数据库可执行文件,
# 4. 根据数据库可执行文件来修改数据库
# 5. 用 uwsgi启动 django 服务
# 6. tail空命令防止web容器执行脚本后退出
while ! nc -z db 3306 ; do
echo "Waiting for the MySQL Server"
sleep 3
done
python manage.py collectstatic --noinput&&
python manage.py makemigrations&&
python manage.py migrate&&
uwsgi --ini /var/www/html/myproject/uwsgi.ini&&
tail -f /dev/null
exec "$@"
uwsgi.ini
配置文件如下所示:
[uwsgi]
project=myproject
uid=www-data
gid=www-data
base=/var/www/html
chdir=%(base)/%(project)
module=%(project).wsgi:application
master=True
processes=2
socket=0.0.0.0:8000
chown-socket=%(uid):www-data
chmod-socket=664
vacuum=True
max-requests=5000
pidfile=/tmp/%(project)-master.pid
daemonize=/tmp/%(project)-uwsgi.log
#设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri = 60
post buffering = 8192
buffer-size= 65535
#当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose = true
#开启内存使用情况报告
memory-report = true
#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy = 10
#设置工作进程使用虚拟内存超过N MB就回收重启
reload-on-as= 1024
构建Nginx镜像所使用的Dockerfile如下所示:
# nginx镜像compose/nginx/Dockerfile
FROM nginx:latest
# 删除原有配置文件,创建静态资源文件夹和ssl证书保存文件夹
RUN rm /etc/nginx/conf.d/default.conf
&& mkdir -p /usr/share/nginx/html/static
&& mkdir -p /usr/share/nginx/html/media
&& mkdir -p /usr/share/nginx/ssl
# 设置Media文件夹用户和用户组为Linux默认www-data, 并给予可读和可执行权限,
# 否则用户上传的图片无法正确显示。
RUN chown -R www-data:www-data /usr/share/nginx/html/media
&& chmod -R 775 /usr/share/nginx/html/media
# 添加配置文件
ADD ./nginx.conf /etc/nginx/conf.d/
# 关闭守护模式
CMD ["nginx", "-g", "daemon off;"]
Nginx的配置文件如下所示
# nginx配置文件
# compose/nginx/nginx.conf
upstream django {
ip_hash;
server web:8000; # Docker-compose web服务端口
}
# 配置http请求,80端口
server {
listen 80; # 监听80端口
server_name 127.0.0.1; # 可以是nginx容器所在ip地址或127.0.0.1,不能写宿主机外网ip地址
charset utf-8;
client_max_body_size 10M; # 限制用户上传文件大小
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
location /static {
alias /usr/share/nginx/html/static; # 静态资源路径
}
location /media {
alias /usr/share/nginx/html/media; # 媒体资源,用户上传文件路径
}
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass django;
uwsgi_read_timeout 600;
uwsgi_connect_timeout 600;
uwsgi_send_timeout 600;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
# proxy_pass http://django; # 使用uwsgi通信,而不是http,所以不使用proxy_pass。
}
}
启动MySQL容器我们直接使用官方镜像即可,不过我们需要给MySQL增加配置文件。
# compose/mysql/conf/my.cnf
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
secure-file-priv=NULL # mysql 8 新增这行配置
default-authentication-plugin=mysql_native_password # mysql 8 新增这行配置
port = 3306 # 端口与docker-compose里映射端口保持一致
#bind-address= localhost #一定要注释掉,mysql所在容器和django所在容器不同IP
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
skip-name-resolve # 这个参数是禁止域名解析的,远程访问推荐开启skip_name_resolve。
[client]
port = 3306
default-character-set=utf8
[mysql]
no-auto-rehash
default-character-set=utf8
我们还需设置MySQL服务启动时需要执行的脚本命令, 注意这里的用户名和password必需和docker-compose.yml里与MySQL相关的环境变量(.env)保持一致。
# compose/mysql/init/init.sql
Alter user 'dbuser'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT ALL PRIVILEGES ON myproject.* TO 'dbuser'@'%';
FLUSH PRIVILEGES;
.env
文件内容如下所示:MYSQL_ROOT_PASSWORD=123456
MYSQL_USER=dbuser
MYSQL_DATABASE=myproject
MYSQL_PASSWORD=password
启动redis容器我们直接使用官方镜像即可,不过我们需要给redis增加配置文件。大部分情况下采用默认配置就好了,这里我们只做出了如下几条核心改动:
# compose/redis/redis.conf
# Redis 5配置文件下载地址
# https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf
# 请注释掉下面一行,变成#bind 127.0.0.1,这样其它机器或容器也可访问
bind 127.0.0.1
# 取消下行注释,给redis设置登录密码。这个密码django settings.py会用到。
requirepass yourpassword
在你准备好docker-compose.yml并编排好各容器的Dockerfile及配置文件后,请先不要急于使用Docker-compose命令构建镜像和启动容器。这时还有一件非常重要的事情要做,那就是修改Django的settings.py, 提供mysql和redis服务的配置信息。最重要的几项配置如下所示:
# 生产环境设置 Debug = False
Debug = False
# 设置ALLOWED HOSTS
ALLOWED_HOSTS = ['your_server_IP', 'your_domain_name']
# 设置STATIC ROOT 和 STATIC URL
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = "/static/"
# 设置MEDIA ROOT 和 MEDIA URL
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = "/media/"
# 设置数据库。这里用户名和密码必需和docker-compose.yml里mysql环境变量保持一致
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myproject', # 数据库名
'USER':'dbuser', # 你设置的用户名 - 非root用户
'PASSWORD':'password', # # 换成你自己密码
'HOST': 'db', # 注意:这里使用的是db别名,docker会自动解析成ip
'PORT':'3306', # 端口
}
}
# 设置redis缓存。这里密码为redis.conf里设置的密码
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://redis:6379/1", #这里直接使用redis别名作为host ip地址
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "yourpassword", # 换成你自己密码
},
}
}
现在我们可以使用docker-compose命名构建镜像并启动容器组了。
# 进入docker-compose.yml所在文件夹,输入以下命令构建镜像
sudo docker-compose build
# 启动容器组服务
sudo docker-compose up
如果一切顺利,此时你应该可以看到四个容器都已经成功运行了。
此时打开你的浏览器,输入你服务器的ip地址或域名指向地址,你就应该可以看到网站已经上线啦。
初学者使用Docker或Docker-compose部署会出现各种各样的错误,本文教你如何排错。
容器已启动运行,网站打不开,最有用的是查看Nginx的错误日志error.log。由于我们对容器内Nginx的log进行了挂载,你在宿主机的/compose/nginx/log目录里即可查看相关日志。
# 进入nginx日志目录,一个access.log, 一个error.log
cd compose/nginx/log
# 查看日志文件
sudo cat error.log
绝大部分网站打不开,Nginx日志显示nginx: connect() failed (111: Connection refused) while connecting to upstream或Nginx 502 gateway的错误都不是因为nginx自身的原因,而是Web容器中Django程序有问题或则uwsgi配置文件有问题。
在进入Web容器排错前,你首先要检查下Nginx转发请求的方式(proxy_pass和uwsgi_pass)以及转发端口与uwsgi里面的监听方式以及端口是否一致。
uWSGI和Nginx之间有3种通信方式unix socket,TCP socket和http如果Nginx以proxy_pass方式转发请求,uwsgi需要使用http协议进行通信。如果Nginx以uwsgi_pass转发请求,uwsgi建议配置socket进行通信。
更多关于Nginx和Uwsgi的配置介绍见个人博客:
https://pythondjango.cn/python/tools/6-uwsgi-configuration/
https://pythondjango.cn/python/tools/5-nginx-configuration/
Web容器也就是Django+UWSGI所在的容器,是最容易出现错误的容器。如果Nginx配置没问题,你应该进入web容器查看运行脚本命令时有没有报错,并检查uwsgi的运行日志。uwsgi的日志非常有用,它会记录Django程序运行时发生了哪些错误或异常。一旦发生了错误,uwsgi的进程虽然不会停止,但也无法正常工作,自然也就不能处理nginx转发的动态请求从而出现nginx报错了。
# 查看web容器日志
$ docker-compose logs web
# 进入web容器执行启动命令,查看有无报错
$ docker-compose exec web /bin/bash start.sh
# 或则进入web柔情其,逐一执行python manage.py命令
$ docker-compose exec web /bin/bash
# 进入web容器,查看uwsgi是否正常启动
$ ps aux | grep uwsgi
# 进入uwsgi日志所在目录,查看Django项目是否有报错
cd /tmp
另外一个常发生的错误是 docker-compose生成的web容器执行脚本命令后立刻退出(exited with code 0), 这时的解决方案是在docker-compose.yml中包含以下2行, 另外脚本命令里加入tail -f /dev/null
是容器服务持续运行。
stdin_open: true
tty: true
有时web容器会出现不能连接到数据库的报错,这时需要检查settings.py
中的数据库配置信息是否正确(比如host为db),并检查web容器和db容器是否通过db_network
正常通信(比如进入db容器查看数据表是否已经生成)。在进行数据库迁移时web容器还会出现if table exists or failed to open the referenced table ‘users_user’, inconsistent migration history的错误, 可以删除migrations目录下文件并进入MySQL容器删除django_migrations
数据表即可。
我们还需要经常进入数据库容器查看数据表是否已生成并删除一些数据,这时可以使用如下命令:
$ docker-compose exec db /bin/bash
# 登录
mysql -u usernmae -p;
# 选择数据库
USE dbname;
# 显示数据表
SHOW tables;
# 清空数据表
DELETE from tablenames;
# 删除数据表,特别是Django migrationstable
DROP TABLE tablenames;
本文详细地介绍了如何使用docker-compose工具分七步在生成环境下部署Django + Uwsgi + Nginx + MySQL + Redis。过程看似很复杂,但很多Dockerfile,项目布局及docker-compose.yml都是可以复用的。花时间学习并练习本章内容是非常值得的,一但你学会了,基本上可以10分钟内完成一个正式Django项目的部署,而且可以保证在任何一台Linux机器上顺利地运行。本文最后的排错文章更会助你一臂之力。
注意:整个部署过程如果遇到问题,可以给我们留言或发信息,可以节省你的时间。
相关阅读
Docker部署Django由浅入深系列(下): 八步部署Django+Uwsgi+Nginx+MySQL+Redis
如何在阿里云Ubuntu服务器通过uWSGI和Nginx部署Django项目教程-大江狗原创出品
转自:https://mp.weixin.qq.com/s?__biz=MjM5OTMyODA4Nw==&mid=2247486903&idx=1&sn=5d2172f66c0357ffaefac7c783c80867&chksm=a73c6d8f904be4999d7844a7f70f9d3aa8cc460cd18089f13924711a3261cd4c69d1c7b6933e&scene=132#wechat_redirect
疫情真的是在瓷器店捉老鼠吗?为什么现在老鼠没捉到,上海却像瓷器一样摔了个稀碎呢?
(壹)
4月22日凌晨,上海静安区延长中路700号左右,临近久乐苑北门的地方,一个外卖小哥发生了车祸,他骑着电瓶车不小心撞向了路边,电瓶车摔倒在非机动车道上,他的头狠狠的撞向了路边的树干后倒在人行道上,鲜血不断的涌出来,流了一地。
(血流不止的小哥,图片来自微博网友@superpuer)
封城的夜里,路上人烟稀少,警察赶到了,后来小哥的妻子也赶到了,但唯独120迟迟未来,小哥的脑袋泡在一滩血中,鲜血还在不断的往外流,除了专业的抢救人员,没有人敢轻举妄动。随着时间的流逝,小哥和妻子还是迟迟看不到120的救护车,小哥身下的血越来越多,气息也越来越微弱,妻子开始绝望和崩溃。
(路人拍摄的视频截图,图片来自网络)
根据住在旁边被隔离在家的居民讲述,她听到了小区门口一个女声哭了快半小时,声音之凄惨绝望,一开始还以为是感染了但不愿意去方舱,后来看小区群里才知道是外卖小哥送外卖时撞到了树上,头部出血将近一个小时,整整一个小时血都快流干了也等不来一台120。
妻子在孤独和绝望中痛哭大喊”救救他吧”,在出事一个小时后,120终于来了,外卖小哥被宣告死亡。
(姗姗来迟的120,图片来自微博网友@假的庄Hlai)
有路人说120优先去接阳性病人去了,所以延误了一个小时才过来,但这个说法无法核实真伪,也不知道有没有机会核实真伪。
(贰)
荒谬的是,从外卖小哥出事的地方(延长中路700号)沿着延长中路向南北高架方向走700米,就是上海市第十人民医院(延长中路301号),一个北上海知名的大三甲。
(两者相距约700米,图片来自百度地图)
而就在几天前,十院刚刚发布了《十院医疗救治不断线》的公告,里面清晰写到了为保障市民群众在疫情期间的就医需求,首先急救绿色通道24小时开放,安排专业医护团队值守;其次不会因无核酸阴性报告而延误患者治疗,在诊治的同时做抗原和核酸检测即可;最后医院联络渠道畅通,会在第一时间内响应。
(上海十院官微公告截图)
你能想象吗?2022年,在上海,在一个人民医院为人民的大三甲附近,一个为生活奔波的普通人活活在自己的鲜血中等了1个小时,最后没有等来120,而是先等来了自己的死亡…我无法想象,但它就是活生生的发生了,发生在这片我们曾经骄傲的土地上。
凌晨1点,上海下了场大雨,现场的血迹被冲刷的一干二净,仿佛这场死亡从来没发生过一样。同样第二天也没有新闻报道这个事情,社交媒体上也看不到这个小哥的身影,零星有几个附近居民在网友发出一些现场照片,但基本都被删除完毕,点进去之后,黑色的提示框映出我面无表情的脸——有人会记得他吗?有人会为他的死感到负罪吗?有人会对此承担责任吗?难道一个鲜活生命就这么悄无声息的死在上海4月的春天里?
他是一个人,一个在此之前活生生的人,跟你我一样,他有自己的名字,有自己的家人,有自己在乎和被在乎的人,有自己的情感和生活,有自己的爱好甚至理想,他不是报表里的一个数字,不是政策文件中的代价,不是某种非必要就不要的东西。
一直以来,我觉得作为一个社会人应该明白一件事情,就是你听到的看到的发生在别人身上的事情,都有可能某天发生在自己身上。这位外卖小哥之死,每个人都不能觉得跟自己无关,这件事情能发生在这个外卖小哥身上,就有概率发生在你身上。
如果这件事真的发生在了你身上,此情此景下你有办法避免死亡吗?你扪心自问,真的有吗?
(叁)
这次上海封城,于我而言,最大的震撼在于一些一直以来约定俗成的机制、习以为常的认知全都崩塌了:
出了车祸一定有人来救你吗?不一定。即使你倒在一个大三甲附近,5分钟的路120也有可能走1小时,死神捷足先登,奇迹并不会虽迟但到;
急症复发去医院一定有办法吗?不一定。即使你侥幸活着等来了120,但拉了三个地方可能都没有医院会接收你,那个疼痛钻心难捱的夜晚,有人从高楼一跃而下;
饿了一定有东西吃吗?不一定。如果没有大量囤积食物,如果支付不起成倍高价求东问西的团购,那么你真的有可能在非战争时期中国最大的城市中挨饿,甚至可以说遭遇准饥荒;
生活离无政府状态很遥远吗?不一定。一座曾被评为全球最安全之一的样板间城市,一座“安全有序,已成为金字招牌”的国际大都市,几天之内就肉眼可见的陷入无序和混乱,而且这种混乱可以说是无处不在;
计划经济模式已成历史了吗?不一定。从市场经济回滚到计划时代仅需要短短一周,一个居委主任也能决定哪些人有饭吃哪些人要饿肚皮,哪些人可以吃到好东西哪些人只能收到过期烂货;
饿了无饭可食,病了无医可救,大小买办大发民难财无人监管,普通民众被无情剥削无路可走,部分社区成为孤岛无人管理,邻居一个个排着队变阳也无人问津,传说中的城市管理天花板一夜之间跌成地板,各种利益勾当以次充好趁火打劫一个不少,这就是疫情中的上海。
一种信任被彻底毁掉了,而且从最近其他城市的表现来看,这种不信任、恐慌已经在传染,风声鹤唳的不安全感会通过WiFi传递到每一个通网的地方。
我只是一个普通的底层小市民,但心中也有无穷的问号,回到我开头的疑问,在瓷器店里捉老鼠,没想到老鼠还没捉到,文明和秩序连同我们的生活和价值观就像瓷器一样破成千万块碎片——这到底是为什么?
缅怀这位在上海四月天雨夜去世的外卖小哥,希望大家记住他,世上没有白走的路,更不要有白走的人。
走好。
转自:https://mp.weixin.qq.com/s/mMKDL72bwcWicEwPIT9PJA
作者 | 魏晞 李强 胡紫纯(实习生)
编辑 | 从玉华
4月,上海交通大学医学院附属仁济医院东院区的急诊科每天要涌进两三百名病人,有一天仅救护车就开来114辆,是往常的两倍多。这是仁济东院急诊科没经历过的时刻。最多时,门口排队入院的救护车就有6辆。
在浦东新区的这家三甲医院里,急诊科的固定床位早已满员,大厅睡满了病人。新病人到来,护士用记号笔在纸板上写一个数字,挂在输液架上,就新增一张临时床位。4月初,护士们花时间画出急诊床位图——化验室门口睡了72、80、90号病人,抢救室后走廊睡了76、70、97号病人。
4月21日那天,新来的病人拿到的号码是351号,但床位图已经没时间画了,由于新冠“阳性病人”的陆续出现,其他病人四处挪动,护士找病人也成了新难题。她们有时急得“大吼大叫”,在急诊室内外到处寻找。
30余名急诊科医生、165名护士,以及30余名从其他科室临时调来的医生,极力支撑着这个已经处于“超饱和状态”的急诊科。干完一天工作,医护有时苦恼,明天再来病人,应该怎么“塞”?更何况,病人们多数是“在家扛到没法再拖”,不得已才来医院,病情近乎危重,不能不救。
撑着的急诊科医护人员
4月16日,上海浦东新区,一名脊柱外科医生在仁济东院急诊入口值班。中青报·中青网记者 李强/摄
急诊科副主任医师熊剑飞已经忙到没空去记住任何一个病人的脸。
他形容,以往接诊,看完一个病人,写好医嘱,再接着看下一个病人。但现在,病人实在太多了,一个接着一个,等他一股脑全看完,准备坐下来写医嘱时,又会听到叫声,“这个又气喘了,医生!”“医生,胸痛!”
有一天中午,急诊科来了一位胸痛病人。他辗转多家医院,跑了3个小时,才被仁济东院急诊科接收。刚准备做检查时,病人心跳突然停了。熊剑飞穿着笨重的防护服,为患者做心肺复苏按压近一个小时,但没能救回来。
同一时间,隔壁床又来了一个大面积心梗的病人,意识模糊,心律失常。熊剑飞刚抢救了一个病人,又转到隔壁床为病人做心肺复苏。
结束时,熊剑飞看了一眼表,晚上八点半,早已过了他的下班时间,防护服里的衣服湿透了。他清楚记得,那天夜里风有点凉,他没能从死神手里抢回这两个病人。
护士曹燕有时感觉,快要淹没在病人和家属的招呼声里。急诊大厅里那些临时设置的床位没有床头铃,只能依靠病人家属呼叫护士。她经常正忙着,同时能听到来自不同方位的病床的呼叫声。
病人多的时候,有医生着急得都要哭了,“没有那么多双手”。有护士说,恨不得有三头六臂。急诊科的工作向来争分夺秒,很多时候,私家车或救护车刚开到急诊楼前,医护人员就奔过去就地抢救。
一位待在急诊科的病人家属说,她每天听到医护人员说得最多的一句话是,“快,快,快!”
但穿上防护服,“就像背上一层盔甲”,他们的行动变得迟缓,灵敏度下降,视野与说话也受限,得扯着嗓子喊。有个老年人怕护士听不见,忍不住凑到跟前,扯下口罩说话。“快戴回去!”周围人马上提醒。后来,急诊科给护士配备了随身的麦克风。而原先八小时的一个班,现在干四个小时就容易累。于是,急诊科一个班的时间最短缩至4小时,这也是防护服的最佳使用时限。
此时,救治一位急危重病人,意味着医护人员要投入数倍的精力。而留守本院的急诊医护力量很难应付数量翻倍的急诊病人。
“我们原先一天救护车量是30至40辆,多的时候,会有50多辆。”仁济医院东院门急诊办公室主任张斌渊告诉中青报·中青网记者,“现在基本上每天八九十辆,厉害的时候要超过100辆。”
张斌渊说,以往,上海病人数量、医疗机构数量和120救护车数量,基本处于紧平衡的状态。但当越来越多医院改为定点医院以后,非定点医院急诊科的压力陡然变大。如今,他也一下子搞不清楚,在上海,有哪些医院的急诊科还是开着的,是可以接诊的。
不少病人向记者反映,当他们呼叫120救护车时,时常被告知,需要排队等待,有时排到的号是200多,有时排到的是500多。
急诊科副主任刘黎发现,“上海发布”(记者注:上海市政府新闻办公室社交账号)公布的医院开诊信息,有时是滞后的。她听到有病人说,根据这个开诊信息去某个医院后,发现医院正在消杀,无法接诊。
一位上海120救护车司机在接受媒体采访时也提过类似的事:运送病人时,他曾遇到医院上午还开着,下午却在消杀,只能跨区往其他医院转运。上海医疗急救中心组织了一个专班通过电话了解各医院收治的情况,但是信息变化快,很多时候他们无法实时跟医院互联互通。
据媒体报道,上海全市层面市级医院的门急诊业务量激增。相比4月初,36家市级医院的急诊量增长了65%。而上海市120急救业务量也大幅增长。
上海市医疗急救中心曾向媒体介绍,120调度指挥中心单日呼入电话数高达9.1万个,是去年日均来电量的12.3倍,日均派车近5000次,这突破了120业务历史峰值,处于超负荷运转状态。
仁济东院的医生们有时怀疑,急救中心的调配系统出了问题,尤其在4月初到4月中旬的半个月里,他们感觉,浦东新区的救护车似乎只往仁济东院的急诊科跑。
张斌渊有时还看到配药的志愿者,拿着装满一个小区慢性病人的病例卡的袋子到门诊开药,开完背着满满一蛇皮袋药回去。
这些原本在互联网医院、社区医院就能解决的诊疗问题,也在挤占这家三甲医院的医疗资源。张斌渊发现,推行多年的互联网医院与分级诊疗没能发挥更大的作用。许多肿瘤病人需要打皮下针,可以协调社区医生上门打针,“这种时候,能不来医院,最好不来。”
急诊团队很快发现,仅依靠本科室的医护力量,已经吃不消。新的人手临时抽调到急诊。呼吸科、消化科、心内科、肾内科等专科医生前来支援,然而面对急诊科的工作,有人哭了。有些护士得靠安眠药才能入睡,太累,头痛。
急诊科副主任刘黎说,由于疫情,她已经一个月没能回家,她问孩子,为什么极少联系她,是不是不想她?
孩子回答:“我还能和你说什么,你那么忙,谁让你是医生呢?”
拥挤的急诊大厅
4月18日,上海市浦东新区,仁济东院急诊科走廊里靠墙两侧都摆着病床,只留下供人行走的小道。中青报·中青网记者 李强/摄
2月26日以来,上海暴发新一轮本土新冠肺炎疫情,截至4月25日,上海累计报告本土感染者已超过50万例。上海的许多医院不得不关停,转为新冠肺炎定点医院,越来越多的方舱医院临时建起来,用于收治新冠肺炎感染者。
因疫情防控需要,仁济东院急诊于3月7日至3月9日8时、3月16日至3月23日8时闭环管理,共计闭环管理9天。自3月23日起至今,仁济医院东院急诊科就再没停过。
3月28日,上海市浦东新区开始“封控管理”。医院接到浦东“封控”的通知是3月27日晚上,正在值班的刘黎挨个给医生打电话,把家在浦西的连夜叫到医院来。“封了,万一不能从浦西到浦东来上班,怎么办?否则明天急诊不能正常运转了。急诊是关不了的。”那天晚上,许多医生拉着行李箱赶到医院,之后就再也没回过家。
与此同时,仁济医院也抽调许多医护力量支援新冠肺炎定点医院、方舱医院。由于许多医院转为“新冠肺炎定点医院”,大量的非新冠病人无处就医,一时间成为难题。医生们眼见着浦东新区的病人们,往仁济东院急诊科涌来。
张斌渊发现,最近来急诊的老人多了,慢性病患者也多了,比如癌症病人、血透病人、糖尿病病人,甚至包括肺癌晚期的病人,“很多就是屏(撑)不住送到我们急诊来的”。
急诊科14床住着一个99岁的老人,在家发烧半个月,进急诊科时已经意识昏迷。76床是一位56岁的慢性肾病患者,往常血透的医院改为“新冠肺炎定点医院”,他辗转了3家医院后,最终在仁济东院做上了透析,脸上才恢复血色。即便如此,由于血透资源紧张,他每周三次的透析,只能改为两次。
“最近,无论是救护车拉来的,还是自己过来的病人,病情都很重。”护士胡秋颖告诉记者,她常听到很多人跟她讲,“我们本来想扛一扛,等到解封再来看(病)。实在是扛不过去了。”
新病人接踵而至。护士曹燕最开始给病人找担架床当临时床位,后来找了许多轮椅当“病床”。最后,轮椅也用光了,只好给病人找张椅子坐。有家属则自己购买躺椅在一旁陪护,原价100多元的躺椅,被炒到近300元。还有一些独居老人,一个人孤零零地被救护车送来,护士还得联系警察,帮忙找家属。
在急诊科,欠费卡最近多了4张。4个欠费的病人,全是独居老人。一个90多岁的老年痴呆患者被救护车送来,说不清话,连警察也联系不上家属,只能由护士陪着做各项检查。还有个糖尿病患者,因并发症发作进了ICU,女儿不愿意缴费,也不愿意陪护,来医院后大吵大闹,还顺走了周围病床十几个充电器。
刘黎说,“社会的缩影其实在这里。”但他们也遇到过一个住在德州路的病人的儿子,病人可以出院了,但由于浦东新区交通尚未恢复,社区也没人来接,更打不到车,他走了五公里路,“背着他老爸回去的”。也有一位病人家属看到,一个女孩拿着厕所的公用拖把,拖完父亲的病床下方,顺手也把医院过道也拖了一遍。
夜晚,急诊科灯光不灭。蓝色的布屏风把急诊大厅分隔成一个个私密的空间。病人家属用脸盆接水,擦拭身体,把洗的衣服晾在急诊室外的树上。
即便住进急诊室,这群病人还面临着另一个问题,附近餐馆关门,很难买到盒饭。网上最近可以点到外卖,但大多数上了年纪的、不会使用智能手机的病人还是在吃泡面,有病人家属花5天时间托朋友筹集来一箱物资,有人饼干就水。
急诊科住得最久的一位病人,在14年前的一场自行车比赛中发生意外,导致高位截瘫,脖子以下无法动弹,要靠呼吸机维持生命。多年以来,他的父母都在病床边照顾。
他的父亲在这场疫情中感染了新冠病毒,被送去方舱医院隔离,母亲顶替了父亲照顾他的位置,不久母亲也“阳”了,相熟的护工也感染了。
这是14年来,他第一次离开父母,第一个晚上他偷偷掉了眼泪。
护士们和同病房的病人家属担起照顾他的任务——叫醒、喂饭、打开电脑和眼动仪、清理大便。
急诊科的“阳性病人”
4月18日,上海浦东新区,在仁济东院急诊科,一名病人在急诊留观,她白发苍苍的母亲牵着她的手陪床。她原本接受治疗的医院因疫情停诊,家属把她送到仁济东院急诊接受救治。中青报·中青网记者 李强/摄
在仁济东院的急诊科,C108室,是一个特殊的存在,专为“阳性”危重症患者进行治疗。
“即使他是阳性我们也会进行救治”。急诊科副主任医师熊剑飞说,他遇到一位尿毒症患者,已经意识模糊,出现心衰症状,且急需进行气管插管,但病人是密接者,家人有“阳性”。他们还是没犹豫,立即予以紧急插管抢救。后来,病人核酸检测结果确实呈“阳性”。
尽管这会增加医护人员的暴露风险,但疫情暴发以来,仁济医院急诊科有一个原则,“不能因为核酸耽误病人的病情。”仁济医院护理部主任奚慧琴说,“这个是我们的天性。”
护士胡秋颖经常遇到这样的情况,病人送来时已经心跳停止,她们会就地抢救,来不及考虑病人的核酸检测结果是阴是阳。她也曾在后半夜,站在急诊入口,为深夜就诊的患者提供问询服务。
站在门前,患者最爱问的是,“里面有没有阳性?”胡秋颖会根据当天的实际情况,如实作答。有病人得知“有”后,开始犹豫,也有人会冒着感染的风险继续就医,这时胡秋颖会提醒他们做好防护措施。
护士金莉听到病人讲得最多的是,“我的核酸报告是阴性”“我有居委会报告”“我可以看病”。有时,金莉只是循例问一句,有没有发烧?病人就马上掏出健康码、行程码。她只好耐心解释,只是登记,即使是阳性,急诊科也不会拒接。
起初,有48小时核酸检测结果的病人,走正常的入院通道。医院为没有48小时核酸检测的病人在急诊楼右侧设置了“危重症患者缓冲区”,并尽量安置在单人单间的环境下进行救治。在确定某位病人是阳性后,会对其停留接触过的地方进行彻底消杀。
但到了4月中旬,缓冲区已经起不上缓冲的作用。刘黎察觉到,来急诊科就诊的病人中,“阳性”越来越多。在缓冲区等待核酸报告结果的病人里,有时混杂着“阴”与“阳”。医院每天都会给病人进行核酸检测,但此前最多时,急诊科一天查出三四十个阳性病人。
医务处每天都要联系方舱或者新冠肺炎定点医院,把阳性病人转走。但很快新的问题又出现,方舱医院接收的病人以轻症、无症状感染者为主,不接收有基础疾病的病人,而许多定点医院床位爆满。4月19日,一位在医院住了4天的尿毒症患者“阳了”,4月21日晚,病人才被转运至定点医院接受治疗。
“我们不怕接诊阳性病人,就怕阳性病人转不走。”刘黎告诉记者,那些滞留在急诊科的阳性病人会增加医护人员和其他病人的暴露风险。
急诊室内,患者家属也表现出对于阳性病人的恐惧,有人穿着“二级防护”进入医院,被误认为是医护人员,有人穿着雨披、雨鞋、雨衣入院,口罩戴了双层,有人连防毒面罩也用上了。为了透透气,一些病人跑到外面,露天输液。
每天到下午,出核酸检测结果的时候,是急诊科医护人员最紧张的时刻。“开奖了,开奖了!”护士会互相半开玩笑地说道,只有结果是阴性,他们才会离开医院,回到住处休息。
张斌渊告诉记者,“医务人员的防护没什么问题”,但可能是初期在院外感染,“医务人员也是社会的一部分”,也可能是在极度疲劳状态下院内感染。这一定程度上造成了,急诊科医护的“非战斗减员”。
尽管如此,在有同事感染的情况下,那些作为密切接触者的医生们,选择穿着防护服继续战斗。后来,那些封控在家的医护人员,只要家中没有“阳性”也被召回,经在院隔离观察后返回岗位。医院在员工管理上开始变得“不讲人情”。奚慧琴说,“不管你家里有老有小,不能再流动了,全部在(医院)这里。吃饭间隔两米,吃完就走。”
最近,奚慧琴听到了一个好消息,早期在社区感染新冠肺炎的其他科室医护人员,已经有人重新回到医院上班了。
积压在急诊科的病人
4月18日,上海浦东新区,仁济东院急诊科一楼电梯口,一位患有免疫系统疾病的病人靠输液维持,等待更专业的治疗。病人家属告诉记者,病人血小板最低时达到个位数,由于原本想转去的医院转为新冠肺炎定点医院,病人只好在急诊室维持治疗,以免出现突发状况来不及抢救。中青报·中青网记者 李强/摄
在急诊科工作了15年的护士金莉明显感觉到,因各小区封闭管理,出车祸进急诊的人少了,被送来的醉酒者少了、打架斗殴受伤的人也少了。进入急诊室的,多是濒危或危重的“一二类病人”,急症、非急症病的“三四类病人”少了。
一些原本不常出现在急诊科的病人,如今正在急诊科等待着诊疗。
刘黎告诉记者,她遇到过一位心脏病病人,起初只是心绞痛、胸闷,由于封控管理,一直没能到医院看,“等到实在屏(撑)不住来看已经大面积心梗。”
许多人都在“屏”。
熊剑飞最近发现,来急诊科的糖尿病病人,有两个极端。“一个血糖很高,一个血糖很低。”前者是封控后,病人断药后一时间配不到药,停药多天后,血糖升高;后者是药没停,但食物短缺,吃的少了,血糖降低。还有一位女患者,因为买不到蔬菜,连吃了两顿肉,“进食油腻,胰腺炎发作”。
急诊科一楼电梯厅的墙边,住着一对年轻的夫妻,女人无力地躺在躺椅上。男人告诉记者,他的妻子患有免疫系统疾病,最糟糕的时候,妻子的血小板低至个位数。正常情况下,他们可以转移到仁济南院,在那里得到更专业的医生的会诊,但仁济南院如今转为新冠肺炎定点医院。他的妻子只好在仁济东院的急诊待着,以免出现突发出血感染状况,来不及抢救。但长期待在急诊室,他们存在感染新冠肺炎的可能性。
“我相信上海不止我们家有这个情况。”男人说。
“真正的重病人都在我们这边,需要抢救的,需要及时救治的。所以我们的压力可能更大。”张斌渊说,方舱医院面对的病人数量多,人群庞杂,“可能疏导,服务方面的工作多一些。”
还有许多事情,是急诊科解决不了的。
让刘黎印象深刻的是一位老先生,当他可以出院时,女儿也不希望他回家,因为家里有小孩,担心老人把病毒带回来。那时,这位老人的核酸检测结果一直是阴性,但他只好一直住在急诊科里,“直到4月10日转‘阳’了”。另一对早已康复的老夫妻原先住在养老院,但养老院封闭管理,他们也回不去。
那些已经康复却因各种原因滞留急诊科的病人,成了医生的心结。刘黎曾寄希望于二级医院、社区医院能接收一些康复的病人,但大多下级医院认为病人风险较高,无法接收。“进来的多,出去的少。”刘黎说,这就造成急诊病人积压在急诊室,而新的病人被120急救车送来很可能没有床睡,除非120把救护车上的床留在这里。
4月12日,急诊科医护人员收到了急诊病房11床的来信。11床住着一位71岁的老先生,陪伴他的是同龄的老伴,两人年轻时去安徽当知青,而后生活在上海。
老太太在信里表达了对“奥密克戎”的恐惧:看着急诊科的病房昨天转走一只“羊”,今天又转走一只“羊”,不知道哪天轮到她要被“牵走”。
于是,她和老先生商量决定,“无论我们夫妻双方有一方变‘羊’,能不能关在一起,我们永远不分开”。并且,为了感谢医护人员的照顾,两人决定把遗体捐献给医院,“如果这事办妥了,我也不害怕了,随时随地做好准备。”
刘黎看到这封信,哭了一场,但她知道,按照防疫规定,这个“‘阴’‘阳’不分离”的诉求很难实现——“如果转定点医院和方舱,只能阳性病人去”。
奥密克戎始终没有打扰这对恩爱的夫妻。但4月23日晚上快10点的时候,老先生因基础疾病,走了,“走得很平静”。病区医生联系了红十字会,对方回复:疫情期间暂不办理遗体捐献。
急诊科的大夫都没预想到,这场仗会持续到现在。张斌渊时常看到,那些从病区脱掉防护服走出来的医生、护士,“身上都湿透了”“大家还是咬着牙,硬顶着”。
“大家还在坚持。没人说不想干了,或者逃避。”刘黎说,有的医护孩子还很小,甚至刚刚断奶,有的孩子跟妈妈视频时,在手机那头哭着找妈妈,妈妈也在电话这头哭。急诊病房护士长的儿子今年夏天参加中考,但她现在完全顾不上孩子的学习。
如今,他们一边等待着这非常时期的急诊室回归日常,一边日复一日地在那24小时不灭灯的急诊室奔命。
医院里曾十分红火的咖啡馆已经关门许久,但大家偶尔还能听到从医院门诊楼传来的钢琴声。4月的一天傍晚,一名穿着白大褂的医务人员在此弹了一曲《River Flows In You》。
(中青报·中青网记者马志强对本文亦有贡献)