{"id":489,"date":"2023-02-19T15:52:42","date_gmt":"2023-11-05T18:41:27","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/index.php\/2023\/11\/30\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/"},"modified":"2025-08-02T13:40:47","modified_gmt":"2025-08-02T05:40:47","slug":"%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/","title":{"rendered":"Node.js\u5b89\u5168\u914d\u7f6e\uff1a\u4f7f\u7528Nginx\u3001Let&#8217;s Encrypt\u548cDocker Compose\u4fdd\u62a4\u5bb9\u5668\u5316\u5e94\u7528"},"content":{"rendered":"<h3>\u7b80\u4ecb<\/h3>\n<p>\u6709\u591a\u79cd\u65b9\u6cd5\u53ef\u4ee5\u589e\u5f3a\u60a8\u7684Node.js\u5e94\u7528\u7a0b\u5e8f\u7684\u7075\u6d3b\u6027\u548c\u5b89\u5168\u6027\u3002\u4f7f\u7528\u50cfNginx\u8fd9\u6837\u7684\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u5668\u53ef\u4ee5\u5b9e\u73b0\u8bf7\u6c42\u8d1f\u8f7d\u5747\u8861\u3001\u7f13\u5b58\u9759\u6001\u5185\u5bb9\u548c\u5b9e\u73b0\u4f20\u8f93\u5c42\u5b89\u5168\uff08TLS\uff09\u3002\u5728\u670d\u52a1\u5668\u4e0a\u542f\u7528\u52a0\u5bc6\u7684HTTPS\u786e\u4fdd\u4e0e\u5e94\u7528\u7a0b\u5e8f\u4e4b\u95f4\u7684\u901a\u4fe1\u59cb\u7ec8\u4fdd\u6301\u5b89\u5168\u3002<\/p>\n<p>\u5728\u5bb9\u5668\u4e2d\u4f7f\u7528TLS\/SSL\u5b9e\u73b0\u53cd\u5411\u4ee3\u7406\u4e0e\u76f4\u63a5\u5728\u4e3b\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a\u5de5\u4f5c\u9700\u8981\u4e00\u5957\u4e0d\u540c\u7684\u6b65\u9aa4\u3002\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u5982\u679c\u4f60\u8981\u4e3a\u5728\u670d\u52a1\u5668\u4e0a\u8fd0\u884c\u7684\u5e94\u7528\u7a0b\u5e8f\u83b7\u53d6Let&#8217;s Encrypt\u7684\u8bc1\u4e66\uff0c\u4f60\u9700\u8981\u76f4\u63a5\u5728\u4e3b\u673a\u4e0a\u5b89\u88c5\u6240\u9700\u7684\u8f6f\u4ef6\u3002\u800c\u5bb9\u5668\u8ba9\u4f60\u53ef\u4ee5\u91c7\u53d6\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\u3002\u4f7f\u7528Docker Compose\uff0c\u4f60\u53ef\u4ee5\u4e3a\u4f60\u7684\u5e94\u7528\u7a0b\u5e8f\u3001Web\u670d\u52a1\u5668\u548cCertbot\u5ba2\u6237\u7aef\u521b\u5efa\u5bb9\u5668\uff0c\u4ece\u800c\u4f7f\u4f60\u80fd\u591f\u83b7\u53d6\u8bc1\u4e66\u3002\u901a\u8fc7\u6309\u7167\u8fd9\u4e9b\u6b65\u9aa4\u8fdb\u884c\u64cd\u4f5c\uff0c\u4f60\u53ef\u4ee5\u5145\u5206\u5229\u7528\u5bb9\u5668\u5316\u5de5\u4f5c\u6d41\u7a0b\u7684\u6a21\u5757\u5316\u548c\u53ef\u79fb\u690d\u6027\u3002<\/p>\n<p>\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u60a8\u5c06\u4f7f\u7528Docker Compose\u90e8\u7f72\u4e00\u4e2a\u5177\u6709Nginx\u53cd\u5411\u4ee3\u7406\u7684Node.js\u5e94\u7528\u7a0b\u5e8f\u3002\u60a8\u5c06\u83b7\u53d6\u4e0e\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u5173\u8054\u7684\u57df\u540d\u7684TLS\/SSL\u8bc1\u4e66\uff0c\u5e76\u786e\u4fdd\u5b83\u5728SSL Labs\u4e2d\u83b7\u5f97\u9ad8\u5b89\u5168\u8bc4\u7ea7\u3002\u6700\u540e\uff0c\u60a8\u5c06\u8bbe\u7f6e\u4e00\u4e2a\u5b9a\u65f6\u4efb\u52a1\u6765\u66f4\u65b0\u60a8\u7684\u8bc1\u4e66\uff0c\u4ee5\u4fdd\u6301\u60a8\u7684\u57df\u540d\u7684\u5b89\u5168\u6027\u3002<\/p>\n<h2>\u5148\u51b3\u6761\u4ef6<\/h2>\n<p>\u8981\u6309\u7167\u8fd9\u4e2a\u6559\u7a0b\u7684\u6b65\u9aa4\u8fdb\u884c\uff0c\u4f60\u9700\u8981\u4ee5\u4e0b\u7269\u54c1\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>\u4e00\u53f0Ubuntu 18.04\u670d\u52a1\u5668\uff0c\u4e00\u4e2a\u5177\u6709sudo\u6743\u9650\u7684\u975eroot\u7528\u6237\uff0c\u4ee5\u53ca\u4e00\u4e2a\u6d3b\u52a8\u7684\u9632\u706b\u5899\u3002\u6709\u5173\u5982\u4f55\u8bbe\u7f6e\u8fd9\u4e9b\u7684\u6307\u5bfc\uff0c\u8bf7\u9605\u8bfb\u6b64\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\u6307\u5357\u3002<\/li>\n<li>\u5728\u60a8\u7684\u670d\u52a1\u5668\u4e0a\u5b89\u88c5Docker\u548cDocker Compose\u3002\u6709\u5173\u5b89\u88c5Docker\u7684\u6307\u5bfc\uff0c\u8bf7\u9075\u5faa\u300a\u5982\u4f55\u5728Ubuntu 18.04\u4e0a\u5b89\u88c5\u548c\u4f7f\u7528Docker\u300b\u7684\u6b65\u9aa41\u548c2\u3002\u6709\u5173\u5b89\u88c5Compose\u7684\u6307\u5bfc\uff0c\u8bf7\u9075\u5faa\u300a\u5982\u4f55\u5728Ubuntu 18.04\u4e0a\u5b89\u88c5Docker Compose\u300b\u7684\u6b65\u9aa41\u3002<\/li>\n<li>\u4e00\u4e2a\u5df2\u6ce8\u518c\u7684\u57df\u540d\u3002\u672c\u6559\u7a0b\u5c06\u5168\u7a0b\u4f7f\u7528your_domain\u4f5c\u4e3a\u793a\u4f8b\u3002\u60a8\u53ef\u4ee5\u5728Freenom\u514d\u8d39\u83b7\u53d6\u4e00\u4e2a\uff0c\u6216\u4f7f\u7528\u60a8\u9009\u62e9\u7684\u57df\u540d\u6ce8\u518c\u5546\u3002<\/li>\n<li>\u4e3a\u60a8\u7684\u670d\u52a1\u5668\u8bbe\u7f6e\u4e86\u4ee5\u4e0b\u4e24\u4e2aDNS\u8bb0\u5f55\u3002\u5982\u679c\u60a8\u4f7f\u7528\u7684\u662fSilicon Cloud\uff0c\u53ef\u4ee5\u6309\u7167Silicon Cloud DNS\u7b80\u4ecb\u4e86\u89e3\u5982\u4f55\u5c06\u5b83\u4eec\u6dfb\u52a0\u5230Silicon Cloud\u8d26\u6237\uff1a\n<ul>\n<li>\u4e00\u4e2aA\u8bb0\u5f55\uff0c\u5c06your_domain\u6307\u5411\u60a8\u670d\u52a1\u5668\u7684\u516c\u5171IP\u5730\u5740\u3002<\/li>\n<li>\u4e00\u4e2aA\u8bb0\u5f55\uff0c\u5c06www.your_domain\u6307\u5411\u60a8\u670d\u52a1\u5668\u7684\u516c\u5171IP\u5730\u5740\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u4e00\u65e6\u4f60\u628a\u4e00\u5207\u51c6\u5907\u5c31\u7eea\uff0c\u4f60\u5c31\u53ef\u4ee5\u5f00\u59cb\u7b2c\u4e00\u6b65\u4e86\u3002<\/p>\n<h2>\u7b2c\u4e00\u6b65 &#8211; \u514b\u9686\u548c\u6d4b\u8bd5\u8282\u70b9\u5e94\u7528\u7a0b\u5e8f<\/h2>\n<p>\u4f5c\u4e3a\u7b2c\u4e00\u6b65\uff0c\u60a8\u5c06\u4f7f\u7528\u5305\u542bDockerfile\u7684Node\u5e94\u7528\u7a0b\u5e8f\u4ee3\u7801\u514b\u9686\u5b58\u50a8\u5e93\uff0c\u901a\u8fc7Compose\u4f7f\u7528\u5b83\u6765\u6784\u5efa\u5e94\u7528\u7a0b\u5e8f\u6620\u50cf\u3002\u7136\u540e\uff0c\u60a8\u5c06\u4f7f\u7528docker run\u547d\u4ee4\u6784\u5efa\u548c\u8fd0\u884c\u5e94\u7528\u7a0b\u5e8f\uff0c\u800c\u65e0\u9700\u4f7f\u7528\u53cd\u5411\u4ee3\u7406\u6216SSL\u8fdb\u884c\u6d4b\u8bd5\u3002<\/p>\n<p>\u5728\u975eroot\u7528\u6237\u7684\u4e3b\u76ee\u5f55\u4e0b\uff0c\u4eceSilicon Cloud Community\u7684GitHub\u8d26\u6237\u514b\u9686nodejs-image-demo\u5b58\u50a8\u5e93\u3002\u8fd9\u4e2a\u5b58\u50a8\u5e93\u5305\u542b\u4e86\u5728\u300a\u5982\u4f55\u4f7f\u7528Docker\u6784\u5efaNode.js\u5e94\u7528\u300b\u4e2d\u63cf\u8ff0\u7684\u8bbe\u7f6e\u4ee3\u7801\u3002<\/p>\n<p>\u5c06\u5b58\u50a8\u5e93\u514b\u9686\u5230\u4e00\u4e2a\u76ee\u5f55\u4e2d\u3002\u672c\u793a\u4f8b\u5c06\u4f7f\u7528node_project\u4f5c\u4e3a\u76ee\u5f55\u540d\u79f0\u3002\u8bf7\u968f\u610f\u6839\u636e\u60a8\u7684\u559c\u597d\u6765\u547d\u540d\u6b64\u76ee\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">git<\/span> clone https:\/\/github.com\/do-community\/nodejs-image-demo.git <mark>node_project<\/mark><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5207\u6362\u81f3node_project\u76ee\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token builtin class-name\">cd<\/span> node_project<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5728\u8fd9\u4e2a\u76ee\u5f55\u4e2d\uff0c\u6709\u4e00\u4e2aDockerfile\uff0c\u5305\u542b\u4e86\u4f7f\u7528Docker node:10\u955c\u50cf\u548c\u5f53\u524d\u9879\u76ee\u76ee\u5f55\u7684\u5185\u5bb9\u6765\u6784\u5efa\u4e00\u4e2aNode\u5e94\u7528\u7a0b\u5e8f\u7684\u6307\u4ee4\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u9884\u89c8Dockerfile\u7684\u5185\u5bb9\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">cat<\/span> Dockerfile<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>FROM node:10-alpine RUN mkdir -p \/home\/node\/app\/node_modules &amp;&amp; chown -R node:node \/home\/node\/app WORKDIR \/home\/node\/app COPY package*.json .\/ USER node RUN npm install COPY &#8211;chown=node:node . . EXPOSE 8080 CMD [ &#8220;node&#8221;, &#8220;app.js&#8221; ]<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<\/div>\n<p>\u8fd9\u4e9b\u6307\u4ee4\u901a\u8fc7\u5c06\u9879\u76ee\u4ee3\u7801\u4ece\u5f53\u524d\u76ee\u5f55\u590d\u5236\u5230\u5bb9\u5668\u4e2d\uff0c\u5e76\u4f7f\u7528npm install\u5b89\u88c5\u4f9d\u8d56\u9879\uff0c\u6784\u5efa\u4e86\u4e00\u4e2aNode\u955c\u50cf\u3002\u5b83\u4eec\u8fd8\u5229\u7528\u4e86Docker\u7684\u7f13\u5b58\u548c\u955c\u50cf\u5206\u5c42\u529f\u80fd\uff0c\u901a\u8fc7\u5c06package.json\u548cpackage-lock.json\uff08\u5305\u542b\u9879\u76ee\u5217\u51fa\u7684\u4f9d\u8d56\u9879\uff09\u7684\u590d\u5236\u4e0e\u5e94\u7528\u7a0b\u5e8f\u4ee3\u7801\u7684\u5176\u4f59\u90e8\u5206\u7684\u590d\u5236\u5206\u5f00\u3002\u6700\u540e\uff0c\u8fd9\u4e9b\u6307\u4ee4\u6307\u5b9a\u5bb9\u5668\u5c06\u4f5c\u4e3a\u975eroot\u8282\u70b9\u7528\u6237\u8fd0\u884c\uff0c\u5728\u5e94\u7528\u7a0b\u5e8f\u4ee3\u7801\u548cnode_modules\u76ee\u5f55\u4e0a\u8bbe\u7f6e\u9002\u5f53\u7684\u6743\u9650\u3002<\/p>\n<p>\u6709\u5173\u6b64Dockerfile\u548cNode\u955c\u50cf\u7684\u6700\u4f73\u5b9e\u8df5\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u5728\u300a\u5982\u4f55\u4f7f\u7528Docker\u6784\u5efaNode.js\u5e94\u7528\u7a0b\u5e8f\u300b\u7684\u7b2c3\u6b65\u4e2d\u67e5\u770b\u5b8c\u6574\u8ba8\u8bba\u3002<\/p>\n<p>\u8981\u5728\u6ca1\u6709SSL\u7684\u60c5\u51b5\u4e0b\u6d4b\u8bd5\u5e94\u7528\u7a0b\u5e8f\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528docker build\u548c-t\u6807\u5fd7\u6765\u6784\u5efa\u548c\u6807\u8bb0\u955c\u50cf\u3002\u6b64\u793a\u4f8b\u5c06\u955c\u50cf\u547d\u540d\u4e3anode-demo\uff0c\u4f46\u60a8\u53ef\u4ee5\u81ea\u7531\u5730\u4e3a\u5176\u547d\u540d\u4e3a\u5176\u4ed6\u540d\u79f0\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker<\/span> build <span class=\"token parameter variable\">-t<\/span> node-demo <span class=\"token builtin class-name\">.<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5f53\u6784\u5efa\u8fc7\u7a0b\u5b8c\u6210\u540e\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528&#8221;docker images&#8221;\u547d\u4ee4\u5217\u51fa\u60a8\u7684\u955c\u50cf\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker<\/span> images<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<\/div>\n<p>\u4ee5\u4e0b\u8f93\u51fa\u786e\u8ba4\u4e86\u5e94\u7528\u7a0b\u5e8f\u7684\u955c\u50cf\u6784\u5efa\u3002<\/p>\n<p>\u8fd9\u662f\u6587\u7ae0\u300a\u5982\u4f55\u4f7f\u7528Nginx\u3001Let&#8217;s Encrypt\u548cDocker Compose\u6765\u4fdd\u62a4\u5bb9\u5668\u5316\u7684Node.js\u5e94\u7528\u7a0b\u5e8f\u300b\u7684\u7b2c2\u90e8\u5206\uff08\u517114\u90e8\u5206\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>REPOSITORY    TAG         IMAGE ID      CREATED        SIZE\r\nnode-demo     latest      23961524051d  7 seconds ago  73MB\r\nnode          10-alpine   8a752d5af4ce  3 weeks ago    70.7MB<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528docker run\u547d\u4ee4\u521b\u5efa\u5bb9\u5668\u3002\u6b64\u547d\u4ee4\u5305\u542b\u4e86\u4e09\u4e2a\u6807\u5fd7\u3002<\/p>\n<ul class=\"post-ul\">\n<li><strong>-p<\/strong>\uff1a\u6b64\u6807\u5fd7\u5c06\u5bb9\u5668\u7684\u7aef\u53e3\u53d1\u5e03\u5e76\u6620\u5c04\u5230\u4e3b\u673a\u4e0a\u7684\u7aef\u53e3\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u60a8\u5c06\u4f7f\u7528\u4e3b\u673a\u4e0a\u7684\u7aef\u53e380\uff0c\u4f46\u5982\u679c\u8be5\u7aef\u53e3\u4e0a\u5df2\u6709\u5176\u4ed6\u8fdb\u7a0b\u8fd0\u884c\uff0c\u8bf7\u6839\u636e\u9700\u8981\u8fdb\u884c\u4fee\u6539\u3002\u6709\u5173\u6b64\u5de5\u4f5c\u539f\u7406\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u67e5\u770bDocker\u6587\u6863\u4e2d\u5173\u4e8e\u7aef\u53e3\u7ed1\u5b9a\u7684\u8ba8\u8bba\u3002<\/li>\n<li><strong>-d<\/strong>\uff1a\u6b64\u6807\u5fd7\u4f7f\u5bb9\u5668\u5728\u540e\u53f0\u8fd0\u884c\u3002<\/li>\n<li><strong>&#8211;name<\/strong>\uff1a\u6b64\u6807\u5fd7\u5141\u8bb8\u60a8\u4e3a\u5bb9\u5668\u6307\u5b9a\u4e00\u4e2a\u6613\u4e8e\u8bb0\u5fc6\u7684\u540d\u79f0\u3002<\/li>\n<\/ul>\n<p>\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u6765\u6784\u5efa\u5bb9\u5668\uff1a<\/p>\n<pre class=\"post-pre\"><code>$ docker run --name node-demo -p 80:8080 -d node-demo<\/code><\/pre>\n<p>\u4f7f\u7528docker ps\u547d\u4ee4\u68c0\u67e5\u8fd0\u884c\u4e2d\u7684\u5bb9\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code>$ docker ps<\/code><\/pre>\n<p>\u4ee5\u4e0b\u8f93\u51fa\u786e\u8ba4\u4e86\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u5bb9\u5668\u6b63\u5728\u8fd0\u884c\uff1a<\/p>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\n<pre class=\"post-pre\"><code>CONTAINER ID   IMAGE       COMMAND       CREATED          STATUS          PORTS                  NAMES\r\n4133b72391da   node-demo   \"node app.js\" 17 seconds ago   Up 16 seconds   0.0.0.0:80->8080\/tcp   node-demo<\/code><\/pre>\n<\/div>\n<p>\u60a8\u73b0\u5728\u53ef\u4ee5\u8bbf\u95ee\u60a8\u7684\u57df\u540d\u6765\u6d4b\u8bd5\u60a8\u7684\u8bbe\u7f6e\uff1a<code>http:\/\/your_domain<\/code>\u3002\u8bb0\u5f97\u5c06<code>your_domain<\/code>\u66ff\u6362\u4e3a\u60a8\u81ea\u5df1\u7684\u57df\u540d\u3002\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u5c06\u663e\u793a\u4ee5\u4e0b\u5f15\u5bfc\u9875\u9762\uff1a<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\u5e94\u7528\u7a0b\u5e8f\u5f15\u5bfc\u9875\u9762\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/656470dea4b2f92e6c728c39\/35-0.png\" alt=\"Application Landing Page\" \/><\/div>\n<p>\u73b0\u5728\u60a8\u5df2\u7ecf\u6d4b\u8bd5\u4e86\u8be5\u5e94\u7528\u7a0b\u5e8f\uff0c\u60a8\u53ef\u4ee5\u505c\u6b62\u5bb9\u5668\u5e76\u5220\u9664\u955c\u50cf\u3002\u4f7f\u7528docker ps\u83b7\u53d6\u60a8\u7684\u5bb9\u5668ID\u3002<\/p>\n<pre class=\"post-pre\"><code>$ docker ps<\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\n<pre class=\"post-pre\"><code>CONTAINER ID   IMAGE       COMMAND       CREATED          STATUS          PORTS                  NAMES\r\n4133b72391da   node-demo   \"node app.js\" 17 seconds ago   Up 16 seconds   0.0.0.0:80->8080\/tcp   node-demo<\/code><\/pre>\n<\/div>\n<p>\u4f7f\u7528docker stop\u505c\u6b62\u5bb9\u5668\u3002\u8bf7\u786e\u4fdd\u5c06\u6b64\u5904\u5217\u51fa\u7684CONTAINER ID\u66ff\u6362\u4e3a\u60a8\u81ea\u5df1\u5e94\u7528\u7a0b\u5e8f\u7684CONTAINER ID\u3002<\/p>\n<pre class=\"post-pre\"><code>$ docker stop 4133b72391da<\/code><\/pre>\n<p>\u73b0\u5728\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528docker system prune\u548c-a\u6807\u5fd7\u4e00\u6b21\u6027\u5220\u9664\u5df2\u505c\u6b62\u7684\u5bb9\u5668\u4ee5\u53ca\u6240\u6709\u56fe\u50cf\uff0c\u5305\u62ec\u672a\u4f7f\u7528\u548c\u60ac\u7a7a\u7684\u56fe\u50cf\u3002<\/p>\n<pre class=\"post-pre\"><code>$ docker system prune -a<\/code><\/pre>\n<p>\u5728\u8f93\u51fa\u4e2d\u63d0\u793a\u65f6\u6309y\u952e\u786e\u8ba4\u60a8\u8981\u5220\u9664\u5df2\u505c\u6b62\u7684\u5bb9\u5668\u548c\u955c\u50cf\u3002\u8bf7\u6ce8\u610f\uff0c\u8fd9\u4e5f\u4f1a\u5220\u9664\u60a8\u7684\u6784\u5efa\u7f13\u5b58\u3002<\/p>\n<p>\u4e00\u65e6\u4f60\u7684\u5e94\u7528\u955c\u50cf\u7ecf\u8fc7\u6d4b\u8bd5\uff0c\u4f60\u5c31\u53ef\u4ee5\u4f7f\u7528Docker Compose\u7ee7\u7eed\u6784\u5efa\u4f60\u7684\u5176\u4ed6\u8bbe\u7f6e\u3002<\/p>\n<h2>\u6b65\u9aa4 2 \u2014 \u5b9a\u4e49\u7f51\u7edc\u670d\u52a1\u5668\u914d\u7f6e<\/h2>\n<p>\u6709\u4e86\u6211\u4eec\u7684Dockerfile\u5e94\u7528\u7a0b\u5e8f\uff0c\u60a8\u5c06\u521b\u5efa\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u6765\u8fd0\u884c\u60a8\u7684Nginx\u5bb9\u5668\u3002\u60a8\u53ef\u4ee5\u4ece\u4e00\u4e2a\u6700\u5c0f\u7684\u914d\u7f6e\u5f00\u59cb\uff0c\u5176\u4e2d\u5305\u62ec\u60a8\u7684\u57df\u540d\uff0c\u6587\u6863\u6839\u76ee\u5f55\uff0c\u4ee3\u7406\u4fe1\u606f\u4ee5\u53ca\u4e00\u4e2alocation\u5757\u6765\u6307\u5411.certbot\u76ee\u5f55\uff0cCertbot\u5c06\u5728\u5176\u4e2d\u653e\u7f6e\u4e00\u4e2a\u4e34\u65f6\u6587\u4ef6\u6765\u9a8c\u8bc1\u60a8\u7684\u57df\u540d\u7684DNS\u662f\u5426\u89e3\u6790\u5230\u60a8\u7684\u670d\u52a1\u5668\u3002<\/p>\n<p>\u9996\u5148\uff0c\u5728\u5f53\u524d\u9879\u76ee\u76ee\u5f55node_project\u4e2d\u521b\u5efa\u4e00\u4e2a\u76ee\u5f55\uff0c\u7528\u4e8e\u5b58\u653e\u914d\u7f6e\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>$ mkdir nginx-conf<\/code><\/pre>\n<p>\u4f7f\u7528nano\u6216\u60a8\u559c\u7231\u7684\u7f16\u8f91\u5668\u521b\u5efa\u5e76\u6253\u5f00\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>$ nano nginx-conf\/nginx.conf<\/code><\/pre>\n<p>\u5c06\u4ee5\u4e0b\u670d\u52a1\u5668\u5757\u6dfb\u52a0\u5230\u4ee3\u7406\u7528\u6237\u8bf7\u6c42\u5230\u60a8\u7684Node\u5e94\u7528\u5bb9\u5668\uff0c\u5e76\u5c06Certbot\u7684\u8bf7\u6c42\u5b9a\u5411\u5230.well-known\u76ee\u5f55\u3002\u8bf7\u52a1\u5fc5\u4f7f\u7528\u60a8\u81ea\u5df1\u7684\u57df\u540d\u66ff\u6362<code>your_domain<\/code>\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token directive\"><span class=\"token keyword\">server<\/span><\/span> <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">listen<\/span> <span class=\"token number\">80<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">listen<\/span> [::]:80<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">root<\/span> \/var\/www\/html<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">index<\/span> index.html index.htm index.nginx-debian.html<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">server_name<\/span> <mark>your_domain<\/mark> www.<mark>your_domain<\/mark><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">location<\/span> \/<\/span> <span class=\"token punctuation\">{<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">proxy_pass<\/span> http:\/\/nodejs:8080<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">location<\/span> ~ \/.well-known\/acme-challenge<\/span> <span class=\"token punctuation\">{<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">allow<\/span> all<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">root<\/span> \/var\/www\/html<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u4e2a\u670d\u52a1\u5668\u5757\u5c06\u5141\u8bb8\u60a8\u542f\u52a8Nginx\u5bb9\u5668\u4f5c\u4e3a\u53cd\u5411\u4ee3\u7406\uff0c\u5c06\u8bf7\u6c42\u4f20\u9012\u5230\u60a8\u7684Node\u5e94\u7528\u5bb9\u5668\u3002\u5b83\u8fd8\u5c06\u5141\u8bb8\u60a8\u4f7f\u7528Certbot\u7684webroot\u63d2\u4ef6\u6765\u83b7\u53d6\u60a8\u7684\u57df\u540d\u7684\u8bc1\u4e66\u3002\u8be5\u63d2\u4ef6\u4f9d\u8d56\u4e8eHTTP-01\u9a8c\u8bc1\u65b9\u6cd5\uff0c\u5b83\u4f7f\u7528\u4e00\u4e2aHTTP\u8bf7\u6c42\u6765\u9a8c\u8bc1Certbot\u80fd\u591f\u8bbf\u95ee\u54cd\u5e94\u7ed9\u5b9a\u57df\u540d\u7684\u670d\u52a1\u5668\u8d44\u6e90\u3002<\/p>\n<p>\u7f16\u8f91\u5b8c\u6210\u540e\uff0c\u8bf7\u4fdd\u5b58\u5e76\u5173\u95ed\u6587\u4ef6\u3002\u5982\u679c\u60a8\u4f7f\u7528\u7684\u662fnano\u7f16\u8f91\u5668\uff0c\u53ef\u4ee5\u6309\u4e0bCTRL+X\uff0c\u7136\u540e\u6309Y\u952e\uff0c\u6700\u540e\u6309\u56de\u8f66\u952e\u6765\u5b8c\u6210\u64cd\u4f5c\u3002\u8981\u4e86\u89e3\u66f4\u591a\u5173\u4e8eNginx\u670d\u52a1\u5668\u548clocation\u5757\u9009\u62e9\u7b97\u6cd5\u7684\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u8fd9\u7bc7\u5173\u4e8e\u7406\u89e3Nginx\u670d\u52a1\u5668\u548clocation\u5757\u9009\u62e9\u7b97\u6cd5\u7684\u6587\u7ae0\u3002<\/p>\n<p>\u5728\u5b8c\u6210\u4e86Web\u670d\u52a1\u5668\u914d\u7f6e\u7ec6\u8282\u4e4b\u540e\uff0c\u4f60\u53ef\u4ee5\u5f00\u59cb\u521b\u5efa\u4f60\u7684docker-compose.yml\u6587\u4ef6\uff0c\u8fd9\u5c06\u5141\u8bb8\u4f60\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f\u670d\u52a1\u548c\u4f7f\u7528\u7684Certbot\u5bb9\u5668\u6765\u83b7\u53d6\u8bc1\u4e66\u3002<\/p>\n<h2>\u7b2c\u4e09\u6b65\u2014\u2014\u521b\u5efaDocker Compose\u6587\u4ef6<\/h2>\n<p>docker-compose.yml\u6587\u4ef6\u5c06\u5b9a\u4e49\u60a8\u7684\u670d\u52a1\uff0c\u5305\u62ecNode\u5e94\u7528\u7a0b\u5e8f\u548cWeb\u670d\u52a1\u5668\u3002\u5b83\u5c06\u6307\u5b9a\u8be6\u7ec6\u4fe1\u606f\uff0c\u5982\u547d\u540d\u5377\uff0c\u8fd9\u5bf9\u4e8e\u5728\u5bb9\u5668\u4e4b\u95f4\u5171\u4eabSSL\u51ed\u636e\u975e\u5e38\u91cd\u8981\uff0c\u4ee5\u53ca\u7f51\u7edc\u548c\u7aef\u53e3\u4fe1\u606f\u3002\u5b83\u8fd8\u5141\u8bb8\u60a8\u6307\u5b9a\u5728\u521b\u5efa\u5bb9\u5668\u65f6\u8981\u8fd0\u884c\u7684\u547d\u4ee4\u3002\u6b64\u6587\u4ef6\u662f\u5b9a\u4e49\u60a8\u7684\u670d\u52a1\u5982\u4f55\u534f\u540c\u5de5\u4f5c\u7684\u6838\u5fc3\u8d44\u6e90\u3002<\/p>\n<p>\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u521b\u5efa\u5e76\u6253\u5f00\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> docker-compose.yml<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u9996\u5148\uff0c\u5bf9\u5e94\u7528\u670d\u52a1\u8fdb\u884c\u5b9a\u4e49\u3002<\/p>\n<div>\n<p><code>~\/node_project\/docker-compose.yml<\/code> \u4e3a\u4e00 Docker Compose \u7684\u914d\u7f6e\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'3'<\/span>\r\n\r\n<span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">nodejs<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">build<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token key atrule\">context<\/span><span class=\"token punctuation\">:<\/span> .\r\n      <span class=\"token key atrule\">dockerfile<\/span><span class=\"token punctuation\">:<\/span> Dockerfile\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nodejs\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> nodejs\r\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">-<\/span>stopped\r\n<\/code><\/pre>\n<p>Node.js\u670d\u52a1\u5b9a\u4e49\u5305\u62ec\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<ul class=\"post-ul\">\n<li><strong>build<\/strong>: \u8fd9\u5b9a\u4e49\u4e86\u5728Compose\u6784\u5efa\u5e94\u7528\u7a0b\u5e8f\u6620\u50cf\u65f6\u5c06\u5e94\u7528\u7684\u914d\u7f6e\u9009\u9879\uff0c\u5305\u62ec\u4e0a\u4e0b\u6587\u548cdockerfile\u3002\u5982\u679c\u60a8\u60f3\u4f7f\u7528\u6765\u81eaDocker Hub\u7b49\u6ce8\u518c\u8868\u7684\u73b0\u6709\u6620\u50cf\uff0c\u5219\u53ef\u4ee5\u4f7f\u7528image\u6307\u4ee4\uff0c\u5e76\u5305\u542b\u6709\u5173\u60a8\u7684\u7528\u6237\u540d\u3001\u5b58\u50a8\u5e93\u548c\u6620\u50cf\u6807\u7b7e\u7684\u4fe1\u606f\u3002<\/li>\n<li><strong>context<\/strong>: \u8fd9\u5b9a\u4e49\u4e86\u5e94\u7528\u7a0b\u5e8f\u6620\u50cf\u6784\u5efa\u7684\u6784\u5efa\u4e0a\u4e0b\u6587\u3002\u5728\u672c\u4f8b\u4e2d\uff0c\u5b83\u662f\u5f53\u524d\u9879\u76ee\u76ee\u5f55\uff0c\u7528.\u8868\u793a\u3002<\/li>\n<li><strong>dockerfile<\/strong>: \u8fd9\u6307\u5b9aCompose\u5c06\u7528\u4e8e\u6784\u5efa\u7684Dockerfile\u2014\u2014\u5728\u6b65\u9aa41\u4e2d\u5ba1\u67e5\u7684Dockerfile\u3002<\/li>\n<li><strong>image, container_name<\/strong>: \u8fd9\u4e9b\u4e3a\u6620\u50cf\u548c\u5bb9\u5668\u5e94\u7528\u540d\u79f0\u3002<\/li>\n<li><strong>restart<\/strong>: \u8fd9\u5b9a\u4e49\u4e86\u91cd\u542f\u7b56\u7565\u3002\u9ed8\u8ba4\u503c\u4e3ano\uff0c\u4f46\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u5bb9\u5668\u8bbe\u7f6e\u4e3a\u9664\u975e\u505c\u6b62\u5426\u5219\u91cd\u542f\u3002<\/li>\n<\/ul>\n<p>\u8bf7\u6ce8\u610f\uff0c\u60a8\u5728\u8fd9\u9879\u670d\u52a1\u4e2d\u4e0d\u5305\u62ec\u7ed1\u5b9a\u6302\u8f7d\uff0c\u56e0\u4e3a\u60a8\u7684\u8bbe\u7f6e\u4fa7\u91cd\u4e8e\u90e8\u7f72\u800c\u4e0d\u662f\u5f00\u53d1\u3002\u5982\u9700\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u9605\u8bfbDocker\u5173\u4e8e\u7ed1\u5b9a\u6302\u8f7d\u548c\u5377\u7684\u6587\u6863\u3002<\/p>\n<p>\u5728\u91cd\u65b0\u542f\u52a8\u5b9a\u4e49\u4e4b\u540e\uff0c\u6dfb\u52a0\u540d\u4e3aapp-network\u7684\u6865\u63a5\u7f51\u7edc\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u7a0b\u5e8f\u548cweb\u670d\u52a1\u5668\u5bb9\u5668\u4e4b\u95f4\u7684\u901a\u4fe1\u3002<\/p>\n<\/div>\n<pre class=\"post-pre\"><code><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">nodejs<\/span><span class=\"token punctuation\">:<\/span>\r\n<span class=\"token punctuation\">...<\/span>\r\n    <mark><span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><\/mark>\r\n      <mark><span class=\"token punctuation\">-<\/span> app<span class=\"token punctuation\">-<\/span>network<\/mark>\r\n<\/code><\/pre>\n<p>\u8fd9\u79cd\u7528\u6237\u81ea\u5b9a\u4e49\u6865\u63a5\u7f51\u7edc\u5141\u8bb8\u5728\u540c\u4e00\u53f0Docker\u5b88\u62a4\u4e3b\u673a\u4e0a\u7684\u5bb9\u5668\u4e4b\u95f4\u8fdb\u884c\u901a\u4fe1\u3002\u5b83\u7b80\u5316\u4e86\u5e94\u7528\u7a0b\u5e8f\u5185\u90e8\u7684\u6d41\u91cf\u548c\u901a\u4fe1\u7ba1\u7406\uff0c\u56e0\u4e3a\u5728\u540c\u4e00\u6865\u63a5\u7f51\u7edc\u4e0a\u7684\u6240\u6709\u5bb9\u5668\u4e4b\u95f4\u7aef\u53e3\u662f\u5f00\u653e\u7684\uff0c\u800c\u4e0d\u4f1a\u5411\u5916\u90e8\u66b4\u9732\u4efb\u4f55\u7aef\u53e3\u3002\u56e0\u6b64\uff0c\u60a8\u53ef\u4ee5\u9009\u62e9\u6027\u5730\u4ec5\u516c\u5f00\u524d\u7aef\u670d\u52a1\u6240\u9700\u7684\u7aef\u53e3\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u5b9a\u4e49\u7f51\u7edc\u670d\u52a1\u5668\u670d\u52a1\uff1a<\/p>\n<div>\u301c\/node_project\/docker-compose.yml<\/p>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n <span class=\"token key atrule\">webserver<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nginx<span class=\"token punctuation\">:<\/span>mainline<span class=\"token punctuation\">-<\/span>alpine\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> webserver\r\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">-<\/span>stopped\r\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> <span class=\"token string\">\"80:80\"<\/span>\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> web<span class=\"token punctuation\">-<\/span>root<span class=\"token punctuation\">:<\/span>\/var\/www\/html\r\n      <span class=\"token punctuation\">-<\/span> .\/nginx<span class=\"token punctuation\">-<\/span>conf<span class=\"token punctuation\">:<\/span>\/etc\/nginx\/conf.d\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>etc<span class=\"token punctuation\">:<\/span>\/etc\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>var<span class=\"token punctuation\">:<\/span>\/var\/lib\/letsencrypt\r\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> nodejs\r\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> app<span class=\"token punctuation\">-<\/span>network\r\n<\/code><\/pre>\n<p>\u8fd9\u91cc\u4e3anodejs\u670d\u52a1\u5b9a\u4e49\u7684\u90e8\u5206\u8bbe\u7f6e\u4fdd\u6301\u4e0d\u53d8\uff0c\u4f46\u8fdb\u884c\u4e86\u4ee5\u4e0b\u4fee\u6539\uff1a<\/p>\n<ul class=\"post-ul\">\n<li><strong>image<\/strong>: \u8fd9\u544a\u8bc9Compose\u4eceDocker Hub\u62c9\u53d6\u6700\u65b0\u7684\u57fa\u4e8eAlpine\u7684Nginx\u955c\u50cf\u3002\u6709\u5173Alpine\u955c\u50cf\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u9605\u8bfb\u300a\u5982\u4f55\u4f7f\u7528Docker\u6784\u5efaNode.js\u5e94\u7528\u7a0b\u5e8f\u300b\u7684\u7b2c3\u6b65\u3002<\/li>\n<li><strong>ports<\/strong>: \u8fd9\u5c06\u66b4\u9732\u7aef\u53e380\uff0c\u4ee5\u542f\u7528\u60a8\u5728Nginx\u914d\u7f6e\u4e2d\u5b9a\u4e49\u7684\u914d\u7f6e\u9009\u9879\u3002<\/li>\n<\/ul>\n<p>\u4ee5\u4e0b\u6307\u5b9a\u4e86\u5177\u540d\u5377\u548c\u7ed1\u5b9a\u6302\u8f7d\u7684\u9009\u9879\uff1a<\/p>\n<ul class=\"post-ul\">\n<li><strong>web-root:\/var\/www\/html<\/strong>: \u8fd9\u4f1a\u5c06\u60a8\u7f51\u7ad9\u7684\u9759\u6001\u8d44\u6e90\uff08\u5df2\u590d\u5236\u5230\u540d\u4e3aweb-root\u7684\u5377\u4e2d\uff09\u6dfb\u52a0\u5230\u5bb9\u5668\u7684\/var\/www\/html\u76ee\u5f55\u3002<\/li>\n<li><strong>.\/nginx-conf:\/etc\/nginx\/conf.d<\/strong>: \u8fd9\u4f1a\u5c06\u4e3b\u673a\u4e0a\u7684Nginx\u914d\u7f6e\u76ee\u5f55\u7ed1\u5b9a\u6302\u8f7d\u5230\u5bb9\u5668\u4e0a\u7684\u76f8\u5e94\u76ee\u5f55\uff0c\u786e\u4fdd\u60a8\u5728\u4e3b\u673a\u4e0a\u5bf9\u6587\u4ef6\u6240\u505a\u7684\u4efb\u4f55\u66f4\u6539\u90fd\u4f1a\u53cd\u6620\u5728\u5bb9\u5668\u4e2d\u3002<\/li>\n<li><strong>certbot-etc:\/etc\/letsencrypt<\/strong>: \u8fd9\u4f1a\u5c06\u60a8\u57df\u540d\u7684\u76f8\u5173Let&#8217;s Encrypt\u8bc1\u4e66\u548c\u5bc6\u94a5\u6302\u8f7d\u5230\u5bb9\u5668\u4e0a\u7684\u9002\u5f53\u76ee\u5f55\u3002<\/li>\n<li><strong>certbot-var:\/var\/lib\/letsencrypt<\/strong>: \u8fd9\u4f1a\u5c06Let&#8217;s Encrypt\u7684\u9ed8\u8ba4\u5de5\u4f5c\u76ee\u5f55\u6302\u8f7d\u5230\u5bb9\u5668\u4e0a\u7684\u9002\u5f53\u76ee\u5f55\u3002<\/li>\n<\/ul>\n<p>\u63a5\u4e0b\u6765\uff0c\u4e3acertbot\u5bb9\u5668\u6dfb\u52a0\u914d\u7f6e\u9009\u9879\u3002\u8bf7\u786e\u4fdd\u7528\u60a8\u81ea\u5df1\u7684\u57df\u540d\u548c\u8054\u7cfb\u90ae\u7bb1\u66ff\u6362\u793a\u4f8b\u4e2d\u7684\u57df\u540d\u548c\u7535\u5b50\u90ae\u4ef6\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n  <span class=\"token key atrule\">certbot<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> certbot\/certbot\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> certbot\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>etc<span class=\"token punctuation\">:<\/span>\/etc\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>var<span class=\"token punctuation\">:<\/span>\/var\/lib\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> web<span class=\"token punctuation\">-<\/span>root<span class=\"token punctuation\">:<\/span>\/var\/www\/html\r\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> webserver\r\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> certonly <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>webroot <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>webroot<span class=\"token punctuation\">-<\/span>path=\/var\/www\/html <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>email <mark>sammy@your_domain<\/mark> <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>agree<span class=\"token punctuation\">-<\/span>tos <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>no<span class=\"token punctuation\">-<\/span>eff<span class=\"token punctuation\">-<\/span>email <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>staging <span class=\"token punctuation\">-<\/span>d <mark>your_domain<\/mark>  <span class=\"token punctuation\">-<\/span>d www.<mark>your_domain<\/mark> \r\n<\/code><\/pre>\n<p>\u8fd9\u4e2a\u5b9a\u4e49\u544a\u8bc9Docker Compose\u4eceDocker Hub\u62c9\u53d6certbot\/certbot\uff08Certbot\u5ba2\u6237\u7aef\uff09\u955c\u50cf\u3002\u5b83\u8fd8\u4f7f\u7528\u4e86\u547d\u540d\u5377\u6765\u4e0eNginx\u5bb9\u5668\u5171\u4eab\u8d44\u6e90\uff0c\u5305\u62ec\u57df\u540d\u8bc1\u4e66\u548c\u5bc6\u94a5\u5728certbot-etc\uff08\u8bc1\u4e66bot\u914d\u7f6e\uff09\u4e2d\uff0cLet&#8217;s Encrypt\uff08\u52a0\u5bc6Lets\uff09\u5de5\u4f5c\u76ee\u5f55\u5728certbot-var\uff08\u8bc1\u4e66bot\u53d8\u91cf\uff09\u4e2d\uff0c\u4ee5\u53ca\u5e94\u7528\u7a0b\u5e8f\u4ee3\u7801\u5728web-root\uff08\u7f51\u9875\u6839\u76ee\u5f55\uff09\u4e2d\u3002<\/p>\n<p>\u518d\u6b21\uff0c\u60a8\u5df2\u4f7f\u7528depends_on\uff08\u4f9d\u8d56\u5173\u7cfb\uff09\u6765\u6307\u5b9a\u53ea\u6709\u5f53webserver\uff08\u7f51\u9875\u670d\u52a1\u5668\uff09\u670d\u52a1\u6b63\u5728\u8fd0\u884c\u65f6\uff0ccertbot\u5bb9\u5668\u624d\u4f1a\u542f\u52a8\u3002<\/p>\n<p>\u5f53\u5bb9\u5668\u542f\u52a8\u65f6\uff0c\u547d\u4ee4\u9009\u9879\u6307\u5b9a\u8981\u8fd0\u884c\u7684\u547d\u4ee4\u3002\u5b83\u5305\u62ec\u4f7f\u7528certonly\uff08\u4ec5\u83b7\u53d6\u8bc1\u4e66\uff09\u5b50\u547d\u4ee4\u548c\u4ee5\u4e0b\u9009\u9879\u3002<\/p>\n<ul class=\"post-ul\">\n<li><strong>&#8211;webroot<\/strong>: \u8fd9\u544a\u8bc9Certbot\u4f7f\u7528webroot\u63d2\u4ef6\u5c06\u6587\u4ef6\u653e\u5728webroot\u6587\u4ef6\u5939\u4e2d\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\u3002<\/li>\n<li><strong>&#8211;webroot-path<\/strong>: \u8fd9\u6307\u5b9awebroot\u76ee\u5f55\u7684\u8def\u5f84\u3002<\/li>\n<li><strong>&#8211;email<\/strong>: \u60a8\u7528\u4e8e\u6ce8\u518c\u548c\u6062\u590d\u7684\u9996\u9009\u7535\u5b50\u90ae\u4ef6\uff0c\u5982<mark>sammy@your_domain<\/mark>\uff08\u793a\u4f8b\u90ae\u7bb1\uff09\u3002<\/li>\n<li><strong>&#8211;agree-tos<\/strong>: \u8fd9\u8868\u793a\u60a8\u540c\u610fACME\uff08\u81ea\u52a8\u5316\u8bc1\u4e66\u7ba1\u7406\u73af\u5883\uff09\u7684\u8ba2\u9605\u8005\u534f\u8bae\u3002<\/li>\n<li><strong>&#8211;no-eff-email<\/strong>: \u8fd9\u544a\u8bc9Certbot\u60a8\u4e0d\u5e0c\u671b\u4e0e\u7535\u5b50\u524d\u6cbf\u57fa\u91d1\u4f1a\uff08EFF\uff0cElectronic Frontier Foundation\uff09\u5171\u4eab\u60a8\u7684\u7535\u5b50\u90ae\u4ef6\u3002\u5982\u679c\u60a8\u613f\u610f\uff0c\u53ef\u4ee5\u968f\u610f\u7701\u7565\u6b64\u9009\u9879\u3002<\/li>\n<li><strong>&#8211;staging<\/strong>: \u8fd9\u544a\u8bc9Certbot\u60a8\u5e0c\u671b\u4f7f\u7528Let&#8217;s Encrypt\uff08\u52a0\u5bc6Lets\uff09\u7684\u6d4b\u8bd5\u73af\u5883\u6765\u83b7\u53d6\u6d4b\u8bd5\u8bc1\u4e66\u3002\u4f7f\u7528\u6b64\u9009\u9879\u5141\u8bb8\u60a8\u6d4b\u8bd5\u914d\u7f6e\u9009\u9879\u5e76\u907f\u514d\u53ef\u80fd\u7684\u57df\u540d\u8bf7\u6c42\u9650\u5236\u3002\u6709\u5173\u8fd9\u4e9b\u9650\u5236\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u9605\u8bfbLet&#8217;s Encrypt\uff08\u52a0\u5bc6Lets\uff09\u7684\u901f\u7387\u9650\u5236\u6587\u6863\u3002<\/li>\n<li><strong>-d<\/strong>: \u8fd9\u5141\u8bb8\u60a8\u6307\u5b9a\u8981\u5e94\u7528\u4e8e\u8bf7\u6c42\u7684\u57df\u540d\u3002\u5728\u672c\u4f8b\u4e2d\uff0c\u60a8\u5305\u542b\u4e86<mark>your_domain<\/mark>\uff08\u60a8\u7684\u57df\u540d\uff09\u548cwww.<mark>your_domain<\/mark>\uff08www.\u60a8\u7684\u57df\u540d\uff09\u3002\u8bf7\u786e\u4fdd\u5c06\u8fd9\u4e9b\u66ff\u6362\u4e3a\u60a8\u81ea\u5df1\u7684\u57df\u540d\u3002<\/li>\n<\/ul>\n<p>\u6700\u540e\u4e00\u6b65\uff0c\u6dfb\u52a0\u5377\u548c\u7f51\u7edc\u5b9a\u4e49\u3002\u8bf7\u786e\u4fdd\u5c06\u6b64\u5904\u7684\u7528\u6237\u540d\u66ff\u6362\u4e3a\u60a8\u81ea\u5df1\u7684\u975eroot\u7528\u6237\u3002<\/p>\n<div>~\/node_project\/docker-compose.yml\uff08\u8282\u70b9\u9879\u76ee\u76ee\u5f55\u4e0b\u7684Docker Compose\u914d\u7f6e\u6587\u4ef6\uff09\u7684\u4e2d\u6587\u672c\u5730\u5316\u6539\u5199\u7248\u672c\uff1a<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">certbot-etc<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">certbot-var<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">web-root<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> local\r\n    <span class=\"token key atrule\">driver_opts<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> none\r\n      <span class=\"token key atrule\">device<\/span><span class=\"token punctuation\">:<\/span> \/home\/<mark>sammy<\/mark>\/<mark>node_project<\/mark>\/views\/\r\n      <span class=\"token key atrule\">o<\/span><span class=\"token punctuation\">:<\/span> bind\r\n\r\n<span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">app-network<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> bridge\r\n<\/code><\/pre>\n<p>\u60a8\u7684\u547d\u540d\u5377\u5305\u62ecCertbot\u8bc1\u4e66\u548c\u5de5\u4f5c\u76ee\u5f55\u5377\uff0c\u4ee5\u53ca\u7ad9\u70b9\u9759\u6001\u8d44\u4ea7web-root\u7684\u5377\u3002\u5728\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0cDocker\u5377\u7684\u9ed8\u8ba4\u9a71\u52a8\u7a0b\u5e8f\u662f\u672c\u5730\u9a71\u52a8\u7a0b\u5e8f\uff0c\u5728Linux\u4e0a\u63a5\u53d7\u7c7b\u4f3c\u4e8emount\u547d\u4ee4\u7684\u9009\u9879\u3002\u591a\u4e8f\u4e86\u8fd9\u4e00\u70b9\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528driver_opts\u6307\u5b9a\u9a71\u52a8\u7a0b\u5e8f\u9009\u9879\u5217\u8868\uff0c\u5c06\u4e3b\u673a\u4e0a\u5305\u542b\u5e94\u7528\u7a0b\u5e8f\u9759\u6001\u8d44\u4ea7\u7684views\u76ee\u5f55\u6302\u8f7d\u5230\u8fd0\u884c\u65f6\u7684\u5377\u4e2d\u3002\u7136\u540e\uff0c\u76ee\u5f55\u5185\u5bb9\u53ef\u4ee5\u5728\u5bb9\u5668\u4e4b\u95f4\u5171\u4eab\u3002\u6709\u5173views\u76ee\u5f55\u5185\u5bb9\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u9605\u8bfb\u4f7f\u7528Docker\u6784\u5efaNode.js\u5e94\u7528\u7a0b\u5e8f\u7684\u7b2c2\u6b65\u3002<\/p>\n<p>\u4ee5\u4e0b\u662f\u5b8c\u6574\u7684docker-compose.yml\u6587\u4ef6\uff1a<\/p>\n<div>\n<p>~\/node_project\/docker-compose.yml \u53ef\u4ee5\u88ab\u6539\u5199\u4e3a\uff1a<\/p>\n<p>~\/node_project\/docker-compose.yml \u6587\u4ef6<\/p>\n<\/div>\n<pre class=\"post-pre\"><code><span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'3'<\/span>\r\n\r\n<span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">nodejs<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">build<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token key atrule\">context<\/span><span class=\"token punctuation\">:<\/span> .\r\n      <span class=\"token key atrule\">dockerfile<\/span><span class=\"token punctuation\">:<\/span> Dockerfile\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nodejs\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> nodejs\r\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">-<\/span>stopped\r\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> app<span class=\"token punctuation\">-<\/span>network\r\n\r\n  <span class=\"token key atrule\">webserver<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nginx<span class=\"token punctuation\">:<\/span>mainline<span class=\"token punctuation\">-<\/span>alpine\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> webserver\r\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">-<\/span>stopped\r\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> <span class=\"token string\">\"80:80\"<\/span>\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> web<span class=\"token punctuation\">-<\/span>root<span class=\"token punctuation\">:<\/span>\/var\/www\/html\r\n      <span class=\"token punctuation\">-<\/span> .\/nginx<span class=\"token punctuation\">-<\/span>conf<span class=\"token punctuation\">:<\/span>\/etc\/nginx\/conf.d\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>etc<span class=\"token punctuation\">:<\/span>\/etc\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>var<span class=\"token punctuation\">:<\/span>\/var\/lib\/letsencrypt\r\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> nodejs\r\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> app<span class=\"token punctuation\">-<\/span>network\r\n\r\n  <span class=\"token key atrule\">certbot<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> certbot\/certbot\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> certbot\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>etc<span class=\"token punctuation\">:<\/span>\/etc\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>var<span class=\"token punctuation\">:<\/span>\/var\/lib\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> web<span class=\"token punctuation\">-<\/span>root<span class=\"token punctuation\">:<\/span>\/var\/www\/html\r\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> webserver\r\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> certonly <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>webroot <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>webroot<span class=\"token punctuation\">-<\/span>path=\/var\/www\/html <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>email <mark>sammy@your_domain<\/mark> <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>agree<span class=\"token punctuation\">-<\/span>tos <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>no<span class=\"token punctuation\">-<\/span>eff<span class=\"token punctuation\">-<\/span>email <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>staging <span class=\"token punctuation\">-<\/span>d <mark>your_domain<\/mark>  <span class=\"token punctuation\">-<\/span>d www.<mark>your_domain<\/mark> \r\n\r\n<span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">certbot-etc<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">certbot-var<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">web-root<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> local\r\n    <span class=\"token key atrule\">driver_opts<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> none\r\n      <span class=\"token key atrule\">device<\/span><span class=\"token punctuation\">:<\/span> \/home\/<mark>sammy<\/mark>\/<mark>node_project<\/mark>\/views\/\r\n      <span class=\"token key atrule\">o<\/span><span class=\"token punctuation\">:<\/span> bind\r\n\r\n<span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">app-network<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> bridge  \r\n<\/code><\/pre>\n<p>\u6709\u4e86\u670d\u52a1\u5b9a\u4e49\uff0c\u60a8\u53ef\u4ee5\u5f00\u59cb\u542f\u52a8\u5bb9\u5668\u5e76\u6d4b\u8bd5\u60a8\u7684\u8bc1\u4e66\u8bf7\u6c42\u3002<\/p>\n<h2>\u6b65\u9aa44 &#8211; \u83b7\u53d6SSL\u8bc1\u4e66\u548c\u51ed\u8bc1<\/h2>\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528docker-compose up\u547d\u4ee4\u542f\u52a8\u5bb9\u5668\u3002\u8fd9\u5c06\u6309\u7167\u60a8\u6307\u5b9a\u7684\u987a\u5e8f\u521b\u5efa\u548c\u8fd0\u884c\u5bb9\u5668\u548c\u670d\u52a1\u3002\u4e00\u65e6\u60a8\u7684\u57df\u540d\u8bf7\u6c42\u6210\u529f\uff0c\u60a8\u7684\u8bc1\u4e66\u5c06\u88ab\u6302\u8f7d\u5230Web\u670d\u52a1\u5668\u5bb9\u5668\u7684\/etc\/letsencrypt\/live\u6587\u4ef6\u5939\u4e2d\u3002<\/p>\n<p>\u4f7f\u7528docker-compose up\u547d\u4ee4\uff0c\u52a0\u4e0a-d\u6807\u5fd7\uff0c\u521b\u5efa\u670d\u52a1\uff0c\u5e76\u4e14\u5728\u540e\u53f0\u8fd0\u884cnodejs\u548cwebserver\u5bb9\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code><ol>\r\n \t<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> up <span class=\"token parameter variable\">-d<\/span><\/li>\r\n<\/ol><\/code><\/pre>\n<p>\u60a8\u7684\u8f93\u51fa\u5c06\u786e\u8ba4\u60a8\u7684\u670d\u52a1\u5df2\u88ab\u521b\u5efa\u3002<\/p>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/div>\n<pre class=\"post-pre\"><code>Creating nodejs ... <mark>done<\/mark> Creating webserver ... <mark>done<\/mark> Creating certbot ... <mark>done<\/mark><\/code><\/pre>\n<p>\u4f7f\u7528docker-compose ps\u547d\u4ee4\u6765\u68c0\u67e5\u60a8\u670d\u52a1\u7684\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code><ol>\r\n \t<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> <span class=\"token function\">ps<\/span><\/li>\r\n<\/ol><\/code><\/pre>\n<p>\u5982\u679c\u4e00\u5207\u987a\u5229\u7684\u8bdd\uff0c\u4f60\u7684Node.js\u548cWeb\u670d\u52a1\u5668\u670d\u52a1\u5c06\u4f1a\u6210\u529f\u8fd0\u884c\uff0c\u5e76\u4e14certbot\u5bb9\u5668\u5c06\u4f1a\u4ee50\u72b6\u6001\u6d88\u606f\u9000\u51fa\u3002<\/p>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/div>\n<pre class=\"post-pre\"><code>Name Command State Ports ------------------------------------------------------------------------ certbot certbot certonly --webroot ... Exit 0 nodejs node app.js Up 8080\/tcp webserver nginx -g daemon off; Up 0.0.0.0:80->80\/tcp<\/code><\/pre>\n<p>\u5982\u679c\u60a8\u5728nodejs\u548cwebserver\u670d\u52a1\u7684\u72b6\u6001\u5217\u4e2d\u6ce8\u610f\u5230\u9664\u4e86Up\u4e4b\u5916\u7684\u4efb\u4f55\u5185\u5bb9\uff0c\u6216\u8005certbot\u5bb9\u5668\u7684\u9000\u51fa\u72b6\u6001\u4e0d\u4e3a0\uff0c\u8bf7\u52a1\u5fc5\u4f7f\u7528docker-compose logs\u547d\u4ee4\u68c0\u67e5\u670d\u52a1\u65e5\u5fd7\u3002\u4f8b\u5982\uff0c\u5982\u679c\u60a8\u60f3\u8981\u68c0\u67e5Certbot\u65e5\u5fd7\uff0c\u53ef\u4ee5\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol>\r\n \t<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> logs certbot<\/li>\r\n<\/ol><\/code><\/pre>\n<p>\u60a8\u73b0\u5728\u53ef\u4ee5\u4f7f\u7528docker-compose exec\u547d\u4ee4\u9a8c\u8bc1\u60a8\u7684\u51ed\u636e\u662f\u5426\u5df2\u6302\u8f7d\u5230Web\u670d\u52a1\u5668\u5bb9\u5668\u4e0a\u3002<\/p>\n<pre class=\"post-pre\"><code><ol>\r\n \t<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> <span class=\"token builtin class-name\">exec<\/span> webserver <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/etc\/letsencrypt\/live<\/li>\r\n<\/ol><\/code><\/pre>\n<p>\u4e00\u65e6\u60a8\u7684\u8bf7\u6c42\u6210\u529f\uff0c\u60a8\u7684\u8f93\u51fa\u5c06\u663e\u793a\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/div>\n<pre class=\"post-pre\"><code>total 16 drwx------ 3 root root 4096 Dec 23 16:48 . drwxr-xr-x 9 root root 4096 Dec 23 16:48 .. -rw-r--r-- 1 root root 740 Dec 23 16:48 README drwxr-xr-x 2 root root 4096 Dec 23 16:48 <mark>\u60a8\u7684\u57df\u540d<\/mark><\/code><\/pre>\n<p>\u65e2\u7136\u4f60\u77e5\u9053\u4f60\u7684\u8bf7\u6c42\u4f1a\u6210\u529f\uff0c\u4f60\u53ef\u4ee5\u7f16\u8f91certbot\u670d\u52a1\u7684\u5b9a\u4e49\uff0c\u5220\u9664&#8211;staging\u6807\u5fd7\u3002<\/p>\n<p>\u6253\u5f00docker-compose.yml\u6587\u4ef6<\/p>\n<pre class=\"post-pre\"><code><ol>\r\n \t<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> docker-compose.yml<\/li>\r\n<\/ol><\/code><\/pre>\n<p>\u627e\u5230\u5305\u542bcertbot\u670d\u52a1\u5b9a\u4e49\u7684\u6587\u4ef6\u90e8\u5206\uff0c\u5e76\u5c06\u547d\u4ee4\u9009\u9879\u4e2d\u7684&#8211;staging\u6807\u5fd7\u66ff\u6362\u4e3a&#8211;force-renewal\u6807\u5fd7\u3002\u8fd9\u5c06\u544a\u8bc9Certbot\u60a8\u5e0c\u671b\u4f7f\u7528\u4e0e\u73b0\u6709\u8bc1\u4e66\u76f8\u540c\u7684\u57df\u540d\u8bf7\u6c42\u65b0\u8bc1\u4e66\u3002certbot\u670d\u52a1\u5b9a\u4e49\u5e94\u5305\u542b\u4ee5\u4e0b\u5b9a\u4e49\u3002<\/p>\n<p>~\/node_project\/docker-compose.yml\u6587\u4ef6<\/p>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n  <span class=\"token key atrule\">certbot<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> certbot\/certbot\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> certbot\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>etc<span class=\"token punctuation\">:<\/span>\/etc\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>var<span class=\"token punctuation\">:<\/span>\/var\/lib\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> web<span class=\"token punctuation\">-<\/span>root<span class=\"token punctuation\">:<\/span>\/var\/www\/html\r\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> webserver\r\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> certonly <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>webroot <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>webroot<span class=\"token punctuation\">-<\/span>path=\/var\/www\/html <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>email <mark>sammy@your_domain<\/mark> <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>agree<span class=\"token punctuation\">-<\/span>tos <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>no<span class=\"token punctuation\">-<\/span>eff<span class=\"token punctuation\">-<\/span>email <mark><span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>force<span class=\"token punctuation\">-<\/span>renewal<\/mark> <span class=\"token punctuation\">-<\/span>d <mark>your_domain<\/mark> <span class=\"token punctuation\">-<\/span>d www.<mark>your_domain<\/mark>\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u4f60\u5b8c\u6210\u7f16\u8f91\u540e\uff0c\u4fdd\u5b58\u5e76\u9000\u51fa\u6587\u4ef6\u3002\u73b0\u5728\u4f60\u53ef\u4ee5\u8fd0\u884cdocker-compose up\u6765\u91cd\u65b0\u521b\u5efacertbot\u5bb9\u5668\u53ca\u5176\u76f8\u5173\u7684\u5377\u3002\u901a\u8fc7\u5305\u542b&#8211;no-deps\u9009\u9879\uff0c\u4f60\u544a\u8bc9Compose\u53ef\u4ee5\u8df3\u8fc7\u542f\u52a8webserver\u670d\u52a1\uff0c\u56e0\u4e3a\u5b83\u5df2\u7ecf\u5728\u8fd0\u884c\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> up &#8211;force-recreate &#8211;no-deps certbot<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4e0b\u9762\u7684\u8f93\u51fa\u8868\u660e\u60a8\u7684\u8bc1\u4e66\u8bf7\u6c42\u6210\u529f\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Recreating certbot &#8230; done Attaching to certbot certbot | \u8d26\u6237\u5df2\u6ce8\u518c\u3002 certbot | \u6b63\u5728\u4e3a <mark>your_domain<\/mark> \u548c www.<mark>your_domain<\/mark> \u7eed\u8ba2\u73b0\u6709\u8bc1\u4e66 certbot | certbot | \u6210\u529f\u63a5\u6536\u8bc1\u4e66\u3002 certbot | \u8bc1\u4e66\u4fdd\u5b58\u5728\uff1a\/etc\/letsencrypt\/live\/<mark>your_domain<\/mark>\/fullchain.pem certbot | \u5bc6\u94a5\u4fdd\u5b58\u5728\uff1a\/etc\/letsencrypt\/live\/<mark>your_domain<\/mark>\/privkey.pem certbot | \u6b64\u8bc1\u4e66\u5c06\u4e8e2022-11-03\u5230\u671f\u3002 certbot | \u8bc1\u4e66\u7eed\u8ba2\u65f6\u8fd9\u4e9b\u6587\u4ef6\u5c06\u4f1a\u66f4\u65b0\u3002 certbot | \u540e\u7eed\u6b65\u9aa4\uff1a certbot | &#8211; \u8bc1\u4e66\u9700\u8981\u5728\u5230\u671f\u524d\u7eed\u8ba2\u3002Certbot\u53ef\u4ee5\u5728\u540e\u53f0\u81ea\u52a8\u7eed\u8ba2\u8bc1\u4e66\uff0c\u4f46\u60a8\u53ef\u80fd\u9700\u8981\u91c7\u53d6\u63aa\u65bd\u542f\u7528\u8be5\u529f\u80fd\u3002\u8bf7\u53c2\u9605 https:\/\/certbot.org\/renewal-setup \u83b7\u53d6\u8bf4\u660e\u3002 certbot | \u5c06\u8c03\u8bd5\u65e5\u5fd7\u4fdd\u5b58\u5230 \/var\/log\/letsencrypt\/letsencrypt.log certbot | certbot | &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; certbot | \u5982\u679c\u60a8\u559c\u6b22Certbot\uff0c\u8bf7\u8003\u8651\u901a\u8fc7\u4ee5\u4e0b\u65b9\u5f0f\u652f\u6301\u6211\u4eec\u7684\u5de5\u4f5c\uff1a certbot | * \u5411ISRG \/ Let&#8217;s Encrypt\u6350\u6b3e\uff1ahttps:\/\/letsencrypt.org\/donate certbot | * \u5411EFF\u6350\u6b3e\uff1ahttps:\/\/eff.org\/donate-le certbot | &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; certbot \u5df2\u9000\u51fa\uff0c\u4ee3\u7801\u4e3a0<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4e00\u65e6\u60a8\u83b7\u5f97\u4e86\u8bc1\u4e66\uff0c\u60a8\u53ef\u4ee5\u8fdb\u4e00\u6b65\u4fee\u6539Nginx\u914d\u7f6e\u6765\u6dfb\u52a0SSL\u3002<\/p>\n<h2>\u7b2c\u4e94\u6b65 \u2014 \u4fee\u6539Web\u670d\u52a1\u5668\u914d\u7f6e\u548c\u670d\u52a1\u5b9a\u4e49<\/h2>\n<p>\u5728\u60a8\u7684Nginx\u914d\u7f6e\u4e2d\u542f\u7528SSL\u5c06\u6d89\u53ca\u5230\u6dfb\u52a0HTTP\u91cd\u5b9a\u5411\u5230HTTPS\uff0c\u5e76\u6307\u5b9aSSL\u8bc1\u4e66\u548c\u5bc6\u94a5\u7684\u4f4d\u7f6e\u3002\u8fd8\u9700\u8981\u6307\u5b9a\u60a8\u5c06\u7528\u4e8e\u5b8c\u7f8e\u524d\u5411\u4fdd\u5bc6\u7684Diffie-Hellman\u7ec4\u3002<\/p>\n<p>\u65e2\u7136\u4f60\u6253\u7b97\u91cd\u65b0\u521b\u5efa\u7f51\u9875\u670d\u52a1\u5668\u670d\u52a1\u5e76\u52a0\u5165\u8fd9\u4e9b\u65b0\u589e\u529f\u80fd\uff0c\u90a3\u4f60\u53ef\u4ee5\u73b0\u5728\u505c\u6b62\u5b83\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> stop webserver<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4e0b\u4e00\u6b65\uff0c\u5728\u60a8\u5f53\u524d\u7684\u9879\u76ee\u76ee\u5f55\u4e2d\u4e3aDiffie-Hellman\u5bc6\u94a5\u521b\u5efa\u4e00\u4e2a\u76ee\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">mkdir<\/span> dhparam<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4f7f\u7528openssl\u547d\u4ee4\u751f\u6210\u60a8\u7684\u5bc6\u94a5\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">sudo<\/span> openssl dhparam <span class=\"token parameter variable\">-out<\/span> \/home\/<mark>sammy<\/mark>\/<mark>node_project<\/mark>\/dhparam\/dhparam-2048.pem <span class=\"token number\">2048<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u751f\u6210\u5bc6\u94a5\u9700\u8981\u4e00\u4e9b\u65f6\u95f4\u3002<\/p>\n<p>\u4e3a\u4e86\u5728\u60a8\u7684Nginx\u914d\u7f6e\u4e2d\u6dfb\u52a0\u76f8\u5173\u7684Diffie-Hellman\u548cSSL\u4fe1\u606f\uff0c\u8bf7\u5148\u5220\u9664\u60a8\u4e4b\u524d\u521b\u5efa\u7684Nginx\u914d\u7f6e\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">rm<\/span> nginx-conf\/nginx.conf<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u6253\u5f00\u6587\u4ef6\u7684\u53e6\u4e00\u4e2a\u7248\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> nginx-conf\/nginx.conf<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5728\u6587\u4ef6\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u4ee3\u7801\uff0c\u5c06HTTP\u91cd\u5b9a\u5411\u5230HTTPS\uff0c\u5e76\u6dfb\u52a0SSL\u51ed\u8bc1\u3001\u534f\u8bae\u548c\u5b89\u5168\u5934\u3002\u8bf7\u8bb0\u5f97\u5c06your_domain\u66ff\u6362\u4e3a\u60a8\u81ea\u5df1\u7684\u57df\u540d\u3002\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\u4e3a\uff1a~\/node_project\/nginx-conf\/nginx.conf<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"token directive\"><span class=\"token keyword\">server<\/span><\/span> <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">listen<\/span> <span class=\"token number\">80<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">listen<\/span> [::]:80<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">server_name<\/span> <mark>your_domain<\/mark> www.<mark>your_domain<\/mark><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">location<\/span> ~ \/.well-known\/acme-challenge<\/span> <span class=\"token punctuation\">{<\/span>\r\n          <span class=\"token directive\"><span class=\"token keyword\">allow<\/span> all<\/span><span class=\"token punctuation\">;<\/span>\r\n          <span class=\"token directive\"><span class=\"token keyword\">root<\/span> \/var\/www\/html<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">location<\/span> \/<\/span> <span class=\"token punctuation\">{<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">rewrite<\/span> ^ https:\/\/<span class=\"token variable\">$host<\/span><span class=\"token variable\">$request_uri?<\/span> permanent<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token directive\"><span class=\"token keyword\">server<\/span><\/span> <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">listen<\/span> <span class=\"token number\">443<\/span> ssl http2<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">listen<\/span> [::]:443 ssl http2<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">server_name<\/span> <mark>your_domain<\/mark> www.<mark>your_domain<\/mark><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">server_tokens<\/span> <span class=\"token boolean\">off<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_certificate<\/span> \/etc\/letsencrypt\/live\/<mark>your_domain<\/mark>\/fullchain.pem<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_certificate_key<\/span> \/etc\/letsencrypt\/live\/<mark>your_domain<\/mark>\/privkey.pem<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_buffer_size<\/span> <span class=\"token number\">8k<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_dhparam<\/span> \/etc\/ssl\/certs\/dhparam-2048.pem<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_protocols<\/span> TLSv1.2<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_prefer_server_ciphers<\/span> <span class=\"token boolean\">on<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_ciphers<\/span> ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_ecdh_curve<\/span> secp384r1<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_session_tickets<\/span> <span class=\"token boolean\">off<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_stapling<\/span> <span class=\"token boolean\">on<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_stapling_verify<\/span> <span class=\"token boolean\">on<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">resolver<\/span> 8.8.8.8<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">location<\/span> \/<\/span> <span class=\"token punctuation\">{<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">try_files<\/span> <span class=\"token variable\">$uri<\/span> @nodejs<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">location<\/span> @nodejs<\/span> <span class=\"token punctuation\">{<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">proxy_pass<\/span> http:\/\/nodejs:8080<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> X-Frame-Options <span class=\"token string\">\"SAMEORIGIN\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> X-XSS-Protection <span class=\"token string\">\"1; mode=block\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> X-Content-Type-Options <span class=\"token string\">\"nosniff\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> Referrer-Policy <span class=\"token string\">\"no-referrer-when-downgrade\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> Content-Security-Policy <span class=\"token string\">\"default-src * data: 'unsafe-eval' 'unsafe-inline'\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token comment\">#add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\" always;<\/span>\r\n                <span class=\"token comment\"># \u4ec5\u5728\u60a8\u7406\u89e3\u5176\u5f71\u54cd\u540e\u624d\u542f\u7528\u4e25\u683c\u4f20\u8f93\u5b89\u5168<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">root<\/span> \/var\/www\/html<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">index<\/span> index.html index.htm index.nginx-debian.html<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>HTTP \u670d\u52a1\u5668\u5757\u6307\u5b9a Certbot \u7eed\u8ba2\u8bf7\u6c42\u7684\u7f51\u9875\u6839\u76ee\u5f55\u4e3a .well-known\/acme-challenge \u76ee\u5f55\u3002\u5b83\u8fd8\u5305\u62ec\u4e00\u4e2a\u91cd\u5199\u6307\u4ee4\uff0c\u5c06\u6240\u6709 HTTP \u8bf7\u6c42\u91cd\u5b9a\u5411\u5230 HTTPS\u3002<\/p>\n<p>HTTPS \u670d\u52a1\u5668\u5757\u542f\u7528\u4e86 SSL \u548c HTTP\/2\u3002\u5982\u679c\u60f3\u4e86\u89e3\u66f4\u591a\u5173\u4e8e HTTP\/2 \u5982\u4f55\u6539\u8fdb HTTP \u534f\u8bae\u4ee5\u53ca\u5b83\u5bf9\u7f51\u7ad9\u6027\u80fd\u7684\u597d\u5904\uff0c\u8bf7\u9605\u8bfb\u300a\u5982\u4f55\u5728 Ubuntu 18.04 \u4e0a\u8bbe\u7f6e\u5e26\u6709 HTTP\/2 \u652f\u6301\u7684 Nginx\u300b\u7684\u4ecb\u7ecd\u3002\u6b64\u5757\u8fd8\u5305\u62ec\u4e00\u7cfb\u5217\u9009\u9879\uff0c\u4ee5\u786e\u4fdd\u60a8\u4f7f\u7528\u7684\u662f\u6700\u65b0\u7684 SSL \u534f\u8bae\u548c\u5bc6\u7801\u5957\u4ef6\uff0c\u5e76\u5f00\u542f\u4e86 OCSP Stapling\u3002OCSP Stapling \u5141\u8bb8\u5728\u521d\u59cb TLS \u63e1\u624b\u8fc7\u7a0b\u4e2d\u63d0\u4f9b\u6765\u81ea\u8bc1\u4e66\u9881\u53d1\u673a\u6784\u7684\u65f6\u95f4\u6233\u54cd\u5e94\uff0c\u8fd9\u53ef\u4ee5\u52a0\u5feb\u8ba4\u8bc1\u8fc7\u7a0b\u3002<\/p>\n<p>\u8be5\u533a\u5757\u8fd8\u6307\u5b9a\u4e86\u60a8\u7684 SSL \u548c Diffie-Hellman \u51ed\u8bc1\u4ee5\u53ca\u5bc6\u94a5\u6587\u4ef6\u4f4d\u7f6e\u3002<\/p>\n<p>\u6700\u540e\uff0c\u60a8\u5c06\u4ee3\u7406\u4f20\u9012\u7684\u4fe1\u606f\u79fb\u81f3\u6b64\u533a\u5757\u4e2d\uff0c\u5305\u62ec\u4e00\u4e2a\u5e26\u6709 try_files \u6307\u4ee4\u7684\u4f4d\u7f6e\u533a\u5757\uff0c\u5c06\u8bf7\u6c42\u6307\u5411\u60a8\u7684 Node.js \u5e94\u7528\u7a0b\u5e8f\u5bb9\u5668\u522b\u540d\uff0c\u5e76\u5305\u542b\u4e00\u4e2a\u9488\u5bf9\u8be5\u522b\u540d\u7684\u4f4d\u7f6e\u533a\u5757\uff0c\u5176\u4e2d\u5305\u542b\u5b89\u5168\u5934\u4fe1\u606f\uff0c\u4f7f\u60a8\u80fd\u591f\u5728\u8bf8\u5982 SSL Labs \u548c Security Headers \u7b49\u670d\u52a1\u5668\u6d4b\u8bd5\u7f51\u7ad9\u4e0a\u83b7\u5f97 &#8220;A&#8221; \u7ea7\u8bc4\u5206\u3002\u8fd9\u4e9b\u5934\u4fe1\u606f\u5305\u62ec X-Frame-Options\u3001X-Content-Type-Options\u3001Referrer Policy\u3001Content-Security-Policy \u548c X-XSS-Protection\u3002HTTP Strict Transport Security\uff08HSTS\uff09\u5934\u4fe1\u606f\u5df2\u88ab\u6ce8\u91ca\u6389 &#8211; \u4ec5\u5728\u60a8\u7406\u89e3\u5176\u5f71\u54cd\u5e76\u8bc4\u4f30\u8fc7\u5176 &#8220;preload&#8221; \u529f\u80fd\u540e\u624d\u542f\u7528\u3002<\/p>\n<p>\u5f53\u60a8\u5b8c\u6210\u7f16\u8f91\u540e\uff0c\u4fdd\u5b58\u5e76\u5173\u95ed\u6587\u4ef6\u3002<\/p>\n<p>\u5728\u91cd\u65b0\u521b\u5efa\u7f51\u7edc\u670d\u52a1\u5668\u670d\u52a1\u4e4b\u524d\uff0c\u60a8\u9700\u8981\u5728 docker-compose.yml \u6587\u4ef6\u4e2d\u4e3a\u670d\u52a1\u5b9a\u4e49\u6dfb\u52a0\u4e00\u4e9b\u5185\u5bb9\uff0c\u5305\u62ec HTTPS \u7684\u76f8\u5173\u7aef\u53e3\u4fe1\u606f\u548c Diffie-Hellman \u5377\u5b9a\u4e49\u3002<\/p>\n<p>\u6253\u5f00\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> docker-compose.yml<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5728 Web \u670d\u52a1\u5668\u670d\u52a1\u5b9a\u4e49\u4e2d\uff0c\u6dfb\u52a0\u4ee5\u4e0b\u7aef\u53e3\u6620\u5c04\u548c\u540d\u4e3a dhparam \u7684\u5377\uff1a<\/p>\n<div>\u4ee5\u4e0b\u662f\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\uff1a~\/node_project\/docker-compose.yml<\/div>\n<p>\u8fd9\u662f\u6587\u7ae0\u300a\u5982\u4f55\u4f7f\u7528Nginx\u3001Let&#8217;s Encrypt\u548cDocker Compose\u6765\u4fdd\u62a4\u5bb9\u5668\u5316\u7684Node.js\u5e94\u7528\u7a0b\u5e8f\u300b\u7684\u7b2c12\u90e8\u5206\uff08\u517114\u90e8\u5206\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n <span class=\"token key atrule\">webserver<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nginx<span class=\"token punctuation\">:<\/span>latest\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> webserver\r\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">-<\/span>stopped\r\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> <span class=\"token string\">\"80:80\"<\/span>\r\n      <span class=\"token punctuation\">-<\/span> <mark><span class=\"token string\">\"443:443\"<\/span><\/mark>\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> web<span class=\"token punctuation\">-<\/span>root<span class=\"token punctuation\">:<\/span>\/var\/www\/html\r\n      <span class=\"token punctuation\">-<\/span> .\/nginx<span class=\"token punctuation\">-<\/span>conf<span class=\"token punctuation\">:<\/span>\/etc\/nginx\/conf.d\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>etc<span class=\"token punctuation\">:<\/span>\/etc\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>var<span class=\"token punctuation\">:<\/span>\/var\/lib\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> <mark>dhparam<span class=\"token punctuation\">:<\/span>\/etc\/ssl\/certs<\/mark>\r\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> nodejs\r\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> app<span class=\"token punctuation\">-<\/span>network\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u5728\u5377\u5b9a\u4e49\u4e2d\u6dfb\u52a0dhparam\u5377\u3002\u8bb0\u5f97\u5c06sammy\u548cnode_project\u76ee\u5f55\u66ff\u6362\u4e3a\u60a8\u81ea\u5df1\u7684\u76ee\u5f55\u3002<\/p>\n<p>~\/node_project\/docker-compose.yml\u6587\u4ef6\u7684\u4e2d\u6587\u7248\u672c\u5982\u4e0b\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token punctuation\">...<\/span>\r\n  <span class=\"token key atrule\">webroot<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token punctuation\">...<\/span>\r\n  <mark><span class=\"token key atrule\">dhparam<\/span><span class=\"token punctuation\">:<\/span><\/mark>\r\n    <mark><span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> local<\/mark>\r\n    <mark><span class=\"token key atrule\">driver_opts<\/span><span class=\"token punctuation\">:<\/span><\/mark>\r\n      <mark><span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> none<\/mark>\r\n      <mark><span class=\"token key atrule\">device<\/span><span class=\"token punctuation\">:<\/span> \/home\/sammy\/node_project\/dhparam\/<\/mark>\r\n      <mark><span class=\"token key atrule\">o<\/span><span class=\"token punctuation\">:<\/span> bind<\/mark>\r\n<\/code><\/pre>\n<p>\u4e0eWeb\u6839\u5377\u7c7b\u4f3c\uff0cdhparam\u5377\u5c06\u628a\u5b58\u50a8\u5728\u4e3b\u673a\u4e0a\u7684Diffie-Hellman\u5bc6\u94a5\u6302\u8f7d\u5230Web\u670d\u52a1\u5668\u5bb9\u5668\u4e0a\u3002<\/p>\n<p>\u5728\u7f16\u8f91\u5b8c\u6210\u540e\u4fdd\u5b58\u5e76\u5173\u95ed\u6587\u4ef6\u3002<\/p>\n<h3>\u91cd\u65b0\u521b\u5efaWeb\u670d\u52a1\u5668\u670d\u52a1<\/h3>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> up <span class=\"token parameter variable\">-d<\/span> &#8211;force-recreate &#8211;no-deps webserver<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4f7f\u7528docker-compose ps\u547d\u4ee4\u68c0\u67e5\u60a8\u7684\u670d\u52a1\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> <span class=\"token function\">ps<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4e0b\u9762\u7684\u8f93\u51fa\u8868\u660e\u60a8\u7684nodejs\u548cWeb\u670d\u52a1\u5668\u670d\u52a1\u6b63\u5728\u8fd0\u884c\u3002<\/p>\n<div class=\"secondary-code-label\" title=\"Output\">\u8f93\u51fa<\/p>\n<pre class=\"post-pre\"><code>Name              Command               State           Ports          \r\n---------------------------------------------------------------------------------------------- \r\ncertbot   certbot certonly --webroot ...   Exit 0                                \r\nnodejs    node app.js                      Up      8080\/tcp                   \r\nwebserver nginx -g daemon off;             Up      0.0.0.0:443->443\/tcp, 0.0.0.0:80->80\/tcp\r\n<\/code><\/pre>\n<\/div>\n<p>\u6700\u540e\uff0c\u60a8\u53ef\u4ee5\u8bbf\u95ee\u60a8\u7684\u57df\u540d\uff0c\u4ee5\u786e\u4fdd\u4e00\u5207\u90fd\u80fd\u6b63\u5e38\u5de5\u4f5c\u3002\u5728\u6d4f\u89c8\u5668\u4e2d\u6253\u5f00https:\/\/your_domain\uff0c\u5e76\u786e\u4fdd\u5c06your_domain\u66ff\u6362\u4e3a\u60a8\u81ea\u5df1\u7684\u57df\u540d\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/656470dea4b2f92e6c728c39\/159-0.png\" alt=\"\u5e94\u7528\u7a0b\u5e8f\u7740\u9646\u9875\" \/><\/div>\n<p>\u60a8\u7684\u6d4f\u89c8\u5668\u5b89\u5168\u6307\u793a\u5668\u4e2d\u5e94\u8be5\u51fa\u73b0\u4e00\u4e2a\u9501\u5b9a\u56fe\u6807\u3002\u5982\u679c\u60a8\u613f\u610f\uff0c\u53ef\u4ee5\u5bfc\u822a\u5230SSL Labs\u670d\u52a1\u5668\u6d4b\u8bd5\u9875\u9762\u6216\u5b89\u5168\u6807\u5934\u670d\u52a1\u5668\u6d4b\u8bd5\u9875\u9762\u3002\u6240\u5305\u542b\u7684\u914d\u7f6e\u9009\u9879\u5e94\u8be5\u80fd\u591f\u4f7f\u60a8\u7684\u7f51\u7ad9\u5728SSL Labs\u670d\u52a1\u5668\u6d4b\u8bd5\u4e2d\u83b7\u5f97A\u7ea7\u8bc4\u5206\u3002\u4e3a\u4e86\u5728\u5b89\u5168\u6807\u5934\u670d\u52a1\u5668\u6d4b\u8bd5\u4e2d\u83b7\u5f97A\u7ea7\u8bc4\u5206\uff0c\u60a8\u9700\u8981\u5728\u60a8\u7684nginx-conf\/nginx.conf\u6587\u4ef6\u4e2d\u53d6\u6d88\u6ce8\u91caStrict Transport Security\uff08HSTS\uff09\u6807\u5934\u3002<\/p>\n<p>~\/node_project\/nginx-conf\/nginx.conf<\/p>\n<pre class=\"post-pre\"><code>\u2026\r\n<span class=\"token directive\"><span class=\"token keyword\">location<\/span> @nodejs<\/span> <span class=\"token punctuation\">{<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">proxy_pass<\/span> http:\/\/nodejs:8080<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> X-Frame-Options <span class=\"token string\">\"SAMEORIGIN\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> X-XSS-Protection <span class=\"token string\">\"1; mode=block\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> X-Content-Type-Options <span class=\"token string\">\"nosniff\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> Referrer-Policy <span class=\"token string\">\"no-referrer-when-downgrade\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> Content-Security-Policy <span class=\"token string\">\"default-src * data: 'unsafe-eval' 'unsafe-inline'\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <mark><span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> Strict-Transport-Security <span class=\"token string\">\"max-age=31536000; includeSubDomains; preload\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span><\/mark>\r\n                <span class=\"token comment\"># enable strict transport security only if you understand the implications<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n\u2026\r\n<\/code><\/pre>\n<p>\u5982\u679c\u4f60\u7406\u89e3\u5176\u5f71\u54cd\u5e76\u8bc4\u4f30\u8fc7\u5176\u201c\u9884\u52a0\u8f7d\u201d\u529f\u80fd\uff0c\u8bf7\u5f00\u542f\u6b64\u9009\u9879\u3002<\/p>\n<h2>\u6b65\u9aa46 \u2014 \u66f4\u65b0\u8bc1\u4e66Let&#8217;s Encrypt\u8bc1\u4e66\u7684\u6709\u6548\u671f\u662f90\u5929\u3002\u60a8\u53ef\u4ee5\u8bbe\u7f6e\u81ea\u52a8\u66f4\u65b0\u6d41\u7a0b\uff0c\u4ee5\u786e\u4fdd\u8bc1\u4e66\u4e0d\u8fc7\u671f\u3002\u5176\u4e2d\u4e00\u79cd\u65b9\u6cd5\u662f\u5229\u7528cron\u8c03\u5ea6\u5de5\u5177\u521b\u5efa\u4e00\u4e2a\u4f5c\u4e1a\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u811a\u672c\u6765\u5b89\u6392cron\u4f5c\u4e1a\uff0c\u8be5\u811a\u672c\u5c06\u66f4\u65b0\u60a8\u7684\u8bc1\u4e66\u5e76\u91cd\u65b0\u52a0\u8f7d\u60a8\u7684Nginx\u914d\u7f6e\u3002<\/p>\n<p>\u5728\u60a8\u7684\u9879\u76ee\u76ee\u5f55\u4e2d\u6253\u5f00\u4e00\u4e2a\u540d\u4e3assl_renew.sh\u7684\u811a\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> ssl_renew.sh<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5c06\u4ee5\u4e0b\u4ee3\u7801\u6dfb\u52a0\u5230\u811a\u672c\u4e2d\uff0c\u4ee5\u66f4\u65b0\u60a8\u7684\u8bc1\u4e66\u5e76\u91cd\u65b0\u52a0\u8f7d\u60a8\u7684Web\u670d\u52a1\u5668\u914d\u7f6e\u3002<\/p>\n<div>\uff5e\/node_project\/ssl_renew.sh<br \/>\n\uff5e\/node\u9879\u76ee\/ssl_renew.sh<\/p>\n<pre class=\"post-pre\"><code><span class=\"token shebang important\">#!\/bin\/bash<\/span>\r\n\r\n<span class=\"token assign-left variable\">COMPOSE<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">\"\/usr\/local\/bin\/docker-compose --ansi never\"<\/span>\r\n<span class=\"token assign-left variable\">DOCKER<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">\"\/usr\/bin\/docker\"<\/span>\r\n\r\n<span class=\"token builtin class-name\">cd<\/span> \/home\/<mark>sammy<\/mark>\/<mark>node_project<\/mark>\/\r\n<span class=\"token variable\">$COMPOSE<\/span> run certbot renew --dry-run <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token variable\">$COMPOSE<\/span> <span class=\"token function\">kill<\/span> <span class=\"token parameter variable\">-s<\/span> SIGHUP webserver\r\n<span class=\"token variable\">$DOCKER<\/span> system prune <span class=\"token parameter variable\">-af<\/span>\r\n<\/code><\/pre>\n<p>\u6b64\u811a\u672c\u9996\u5148\u5c06docker-compose\u4e8c\u8fdb\u5236\u6587\u4ef6\u5206\u914d\u7ed9\u4e00\u4e2a\u540d\u4e3aCOMPOSE\u7684\u53d8\u91cf\uff0c\u5e76\u6307\u5b9a&#8211;no-ansi\u9009\u9879\uff0c\u8fd9\u5c06\u5728\u8fd0\u884cdocker-compose\u547d\u4ee4\u65f6\u4e0d\u4f7f\u7528ANSI\u63a7\u5236\u5b57\u7b26\u3002\u7136\u540e\u5b83\u5bf9docker\u4e8c\u8fdb\u5236\u6587\u4ef6\u6267\u884c\u76f8\u540c\u7684\u64cd\u4f5c\u3002\u6700\u540e\uff0c\u5b83\u5207\u6362\u5230~\/node_\u9879\u76ee\u76ee\u5f55\u5e76\u8fd0\u884c\u4ee5\u4e0bdocker-compose\u547d\u4ee4\u3002<\/p>\n<ul class=\"post-ul\">\n<li>docker-compose run: This will start a certbot container and override the command provided in the certbot service definition. Instead of using the certonly subcommand use the renew subcommand, which will renew certificates that are close to expiring. Also included is the &#8211;dry-run option to test the script.<\/li>\n<li>docker-compose kill: This will send a SIGHUP signal to the webserver container to reload the Nginx configuration.<\/li>\n<\/ul>\n<p>\u7136\u540e\u8fd0\u884cdocker system prune\u547d\u4ee4\u4ee5\u5220\u9664\u6240\u6709\u672a\u4f7f\u7528\u7684\u5bb9\u5668\u548c\u955c\u50cf\u3002<\/p>\n<p>\u5f53\u4f60\u5b8c\u6210\u7f16\u8f91\u540e\uff0c\u5173\u95ed\u6587\u4ef6\uff0c\u7136\u540e\u5c06\u5176\u8bbe\u7f6e\u4e3a\u53ef\u6267\u884c\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">chmod<\/span> +x ssl_renew.sh<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u6253\u5f00\u60a8\u7684\u6839 crontab \u6587\u4ef6\u4ee5\u4fbf\u5728\u6307\u5b9a\u7684\u95f4\u9694\u8fd0\u884c\u7eed\u8ba2\u811a\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code>sudo crontab -e \r\n<\/code><\/pre>\n<p>\u5982\u679c\u8fd9\u662f\u4f60\u7b2c\u4e00\u6b21\u7f16\u8f91\u8fd9\u4e2a\u6587\u4ef6\uff0c\u4f60\u5c06\u88ab\u8981\u6c42\u9009\u62e9\u4e00\u4e2a\u7f16\u8f91\u5668\u3002<\/p>\n<div>\u5b9a\u65f6\u4efb\u52a1\u8868<\/p>\n<pre class=\"post-pre\"><code>no crontab for root - using an empty one\r\nSelect an editor.  To change later, run 'select-editor'.\r\n  1. \/bin\/ed\r\n  2. \/bin\/nano        &lt;---- easiest\r\n  3. \/usr\/bin\/vim.basic\r\n  4. \/usr\/bin\/vim.tiny\r\nChoose 1-4 [2]: \r\n...\r\n<\/code><\/pre>\n<p>\u8bf7\u5728\u6587\u4ef6\u7684\u672b\u5c3e\u6dfb\u52a0\u4ee5\u4e0b\u4e00\u884c\u5185\u5bb9:<\/p>\n<div>\u5b9a\u65f6\u4efb\u52a1\u8868<\/p>\n<pre class=\"post-pre\"><code>...\r\n*\/5 * * * * \/home\/sammy\/node_project\/ssl_renew.sh >> \/var\/log\/cron.log 2>&1\r\n<\/code><\/pre>\n<p>\u8fd9\u5c06\u628a\u4efb\u52a1\u95f4\u9694\u8bbe\u7f6e\u4e3a\u6bcf\u4e94\u5206\u949f\u4e00\u6b21\uff0c\u8fd9\u6837\u60a8\u5c31\u53ef\u4ee5\u6d4b\u8bd5\u60a8\u7684\u7eed\u8ba2\u8bf7\u6c42\u662f\u5426\u6309\u9884\u671f\u5de5\u4f5c\u3002\u60a8\u8fd8\u521b\u5efa\u4e86\u4e00\u4e2a\u540d\u4e3acron.log\u7684\u65e5\u5fd7\u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u4efb\u52a1\u7684\u76f8\u5173\u8f93\u51fa\u3002<\/p>\n<p>5\u5206\u949f\u540e\uff0c\u68c0\u67e5cron.log\u4ee5\u786e\u8ba4\u7eed\u8ba2\u8bf7\u6c42\u662f\u5426\u6210\u529f\u3002<\/p>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">tail<\/span> <span class=\"token parameter variable\">-f<\/span> \/var\/log\/cron.log<\/li>\n<\/ol>\n<p>\u8fc7\u4e86\u4e00\u4f1a\u513f\uff0c\u4ee5\u4e0b\u8f93\u51fa\u4fe1\u53f7\u8868\u793a\u7eed\u8ba2\u6210\u529f\u3002<\/p>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/div>\n<pre class=\"post-pre\"><code>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** \u6a21\u62df\u8fd0\u884c\uff1a\u6a21\u62df\u8bc1\u4e66\u5230\u671f\u65f6\u7684'certbot renew'\u64cd\u4f5c **\uff08\u4ee5\u4e0b\u6d4b\u8bd5\u8bc1\u4e66\u5c1a\u672a\u4fdd\u5b58\u3002\uff09\u606d\u559c\uff0c\u6240\u6709\u7eed\u8ba2\u90fd\u6210\u529f\u4e86\u3002\u4ee5\u4e0b\u8bc1\u4e66\u5df2\u7eed\u8ba2\uff1a\/etc\/letsencrypt\/live\/your_domain\/fullchain.pem\uff08\u6210\u529f\uff09** \u6a21\u62df\u8fd0\u884c\uff1a\u6a21\u62df\u8bc1\u4e66\u5230\u671f\u65f6\u7684'certbot renew'\u64cd\u4f5c **\uff08\u4ee5\u4e0a\u6d4b\u8bd5\u8bc1\u4e66\u5c1a\u672a\u4fdd\u5b58\u3002\uff09- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \u7ec8\u6b62\u7f51\u7edc\u670d\u52a1\u5668...\u5b8c\u6210<\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/div>\n<pre class=\"post-pre\"><code>\u2026 \u606d\u559c\uff0c\u6240\u6709\u6a21\u62df\u7eed\u8ba2\u90fd\u6210\u529f\u4e86\uff1a\/etc\/letsencrypt\/live\/your_domain\/fullchain.pem\uff08\u6210\u529f\uff09- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \u5c06\u8c03\u8bd5\u65e5\u5fd7\u4fdd\u5b58\u5230 \/var\/log\/letsencrypt\/letsencrypt.log \u7ec8\u6b62\u7f51\u7edc\u670d\u52a1\u5668... \u7ec8\u6b62\u7f51\u7edc\u670d\u52a1\u5668... \u5b8c\u6210 \u5df2\u5220\u9664\u5bb9\u5668\uff1a00cad94050985261e5b377de43e314b30ad0a6a724189753a9a23ec76488fd78 \u603b\u56de\u6536\u7a7a\u95f4\uff1a824.5kB<\/code><\/pre>\n<p>\u5728\u7ec8\u7aef\u4e2d\u901a\u8fc7\u8f93\u5165CTRL + C\u9000\u51fa\u3002<\/p>\n<p>\u73b0\u5728\u60a8\u53ef\u4ee5\u4fee\u6539crontab\u6587\u4ef6\u4ee5\u8bbe\u7f6e\u6bcf\u5929\u7684\u65f6\u95f4\u95f4\u9694\u3002\u4f8b\u5982\uff0c\u8981\u5728\u6bcf\u5929\u4e2d\u5348\u8fd0\u884c\u811a\u672c\uff0c\u60a8\u53ef\u4ee5\u4fee\u6539\u6587\u4ef6\u7684\u6700\u540e\u4e00\u884c\u5982\u4e0b\uff1a<\/p>\n<div>\u5b9a\u65f6\u4efb\u52a1\u8868<\/div>\n<pre class=\"post-pre\"><code>...\r\n0 12 * * * \/home\/sammy\/node_project\/ssl_renew.sh >> \/var\/log\/cron.log 2>&1\r\n<\/code><\/pre>\n<p>\u4f60\u4e5f\u53ef\u4ee5\u4ece\u4f60\u7684ssl_renew.sh\u811a\u672c\u4e2d\u5220\u9664&#8211;dry-run\u9009\u9879\u3002<\/p>\n<div>~\/node_project\/ssl_renew.sh<\/div>\n<pre class=\"post-pre\"><code><span class=\"token shebang important\">#!\/bin\/bash<\/span>\r\n\r\n<span class=\"token assign-left variable\">COMPOSE<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">\"\/usr\/local\/bin\/docker-compose --no-ansi\"<\/span>\r\n<span class=\"token assign-left variable\">DOCKER<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">\"\/usr\/bin\/docker\"<\/span>\r\n\r\n<span class=\"token builtin class-name\">cd<\/span> \/home\/sammy\/node_project\/\r\n<span class=\"token variable\">$COMPOSE<\/span> run certbot renew <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token variable\">$COMPOSE<\/span> <span class=\"token function\">kill<\/span> <span class=\"token parameter variable\">-s<\/span> SIGHUP webserver\r\n<span class=\"token variable\">$DOCKER<\/span> system prune <span class=\"token parameter variable\">-af<\/span>\r\n<\/code><\/pre>\n<p>\u4f60\u7684\u5b9a\u65f6\u4efb\u52a1\u5c06\u786e\u4fddLet&#8217;s Encrypt\u8bc1\u4e66\u5728\u7b26\u5408\u6761\u4ef6\u65f6\u8fdb\u884c\u7eed\u8ba2\uff0c\u4ee5\u9632\u6b62\u8fc7\u671f\u3002\u4f60\u8fd8\u53ef\u4ee5\u4f7f\u7528Logrotate\u5de5\u5177\u8bbe\u7f6e\u65e5\u5fd7\u8f6e\u6362\uff0c\u4ee5\u8f6e\u6362\u548c\u538b\u7f29\u4f60\u7684\u65e5\u5fd7\u6587\u4ef6\u3002<\/p>\n<h2>\u7ed3\u8bba<\/h2>\n<p>\u4f60\u5df2\u7ecf\u4f7f\u7528\u5bb9\u5668\u6765\u8bbe\u7f6e\u548c\u8fd0\u884c\u4e00\u4e2aNode\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u4e14\u5b89\u88c5\u4e86Nginx\u53cd\u5411\u4ee3\u7406\u3002\u4f60\u8fd8\u4e3a\u5e94\u7528\u7a0b\u5e8f\u7684\u57df\u540d\u8bbe\u7f6e\u4e86SSL\u8bc1\u4e66\uff0c\u5e76\u8bbe\u7f6e\u4e86\u4e00\u4e2a\u5b9a\u65f6\u4efb\u52a1\u6765\u5728\u9700\u8981\u65f6\u66f4\u65b0\u8fd9\u4e9b\u8bc1\u4e66\u3002<\/p>\n<p>\u5982\u679c\u60a8\u5bf9\u5b66\u4e60\u66f4\u591a\u5173\u4e8eLet&#8217;s Encrypt\u63d2\u4ef6\u611f\u5174\u8da3\uff0c\u8bf7\u67e5\u9605\u6211\u4eec\u5173\u4e8e\u4f7f\u7528Nginx\u63d2\u4ef6\u6216\u72ec\u7acb\u63d2\u4ef6\u7684\u6587\u7ae0\u3002<\/p>\n<p>\u4f60\u8fd8\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u8d44\u6e90\u4e86\u89e3\u66f4\u591a\u5173\u4e8eDocker Compose\u7684\u5185\u5bb9\u3002<\/p>\n<ul class=\"post-ul\">\n<li>\u5982\u4f55\u5728Ubuntu 18.04\u4e0a\u5b89\u88c5Docker Compose\u3002<\/li>\n<li>\u5982\u4f55\u5728Ubuntu 16.04\u4e0a\u4f7f\u7528Docker\u548cDocker Compose\u914d\u7f6e\u6301\u7eed\u96c6\u6210\u6d4b\u8bd5\u73af\u5883\u3002<\/li>\n<li>\u5982\u4f55\u4f7f\u7528Docker Compose\u8bbe\u7f6eLaravel\u3001Nginx\u548cMySQL\u3002<\/li>\n<\/ul>\n<p>Compose\u6587\u6863\u4e5f\u662f\u5b66\u4e60\u66f4\u591a\u5173\u4e8e\u591a\u5bb9\u5668\u5e94\u7528\u7684\u7edd\u4f73\u8d44\u6e90\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b80\u4ecb \u6709\u591a\u79cd\u65b9\u6cd5\u53ef\u4ee5\u589e\u5f3a\u60a8\u7684Node.js\u5e94\u7528\u7a0b\u5e8f\u7684\u7075\u6d3b\u6027\u548c\u5b89\u5168\u6027\u3002\u4f7f\u7528\u50cfNginx\u8fd9\u6837\u7684\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u5668\u53ef\u4ee5\u5b9e [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[13,651,696,302,642],"class_list":["post-489","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-docker","tag-docker-compose","tag-lets-encrypt","tag-nginx","tag-node-js"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Node.js\u5b89\u5168\u914d\u7f6e\uff1a\u4f7f\u7528Nginx\u3001Let&#039;s Encrypt\u548cDocker Compose\u4fdd\u62a4\u5bb9\u5668\u5316\u5e94\u7528 - Blog - Silicon Cloud<\/title>\n<meta name=\"description\" content=\"\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Nginx\u4f5c\u4e3a\u53cd\u5411\u4ee3\u7406\uff0cLet&#039;s Encrypt\u63d0\u4f9bSSL\u8bc1\u4e66\uff0c\u4ee5\u53caDocker Compose\u7f16\u6392\u5bb9\u5668\uff0c\u5168\u9762\u4fdd\u62a4\u4f60\u7684Node.js\u5e94\u7528\u7a0b\u5e8f\u5b89\u5168\u3002\u8be6\u7ec6\u914d\u7f6e\u6b65\u9aa4\u548c\u6700\u4f73\u5b9e\u8df5\uff0c\u786e\u4fdd\u5bb9\u5668\u5316Node.js\u5e94\u7528\u7684\u5b89\u5168\u90e8\u7f72\u3002\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528nginx\u3001lets-encrypt\u548cdocker-compose\u6765\u4fdd\u62a4\u5bb9\u5668\u5316\u7684node-js\u5e94\u7528\u7a0b\u5e8f\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js\u5b89\u5168\u914d\u7f6e\uff1a\u4f7f\u7528Nginx\u3001Let&#039;s Encrypt\u548cDocker Compose\u4fdd\u62a4\u5bb9\u5668\u5316\u5e94\u7528\" \/>\n<meta property=\"og:description\" content=\"\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Nginx\u4f5c\u4e3a\u53cd\u5411\u4ee3\u7406\uff0cLet&#039;s Encrypt\u63d0\u4f9bSSL\u8bc1\u4e66\uff0c\u4ee5\u53caDocker Compose\u7f16\u6392\u5bb9\u5668\uff0c\u5168\u9762\u4fdd\u62a4\u4f60\u7684Node.js\u5e94\u7528\u7a0b\u5e8f\u5b89\u5168\u3002\u8be6\u7ec6\u914d\u7f6e\u6b65\u9aa4\u548c\u6700\u4f73\u5b9e\u8df5\uff0c\u786e\u4fdd\u5bb9\u5668\u5316Node.js\u5e94\u7528\u7684\u5b89\u5168\u90e8\u7f72\u3002\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528nginx\u3001lets-encrypt\u548cdocker-compose\u6765\u4fdd\u62a4\u5bb9\u5668\u5316\u7684node-js\u5e94\u7528\u7a0b\u5e8f\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-05T18:41:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-02T05:40:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/656470dea4b2f92e6c728c39\/35-0.png\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/\",\"name\":\"Node.js\u5b89\u5168\u914d\u7f6e\uff1a\u4f7f\u7528Nginx\u3001Let's Encrypt\u548cDocker Compose\u4fdd\u62a4\u5bb9\u5668\u5316\u5e94\u7528 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-11-05T18:41:27+00:00\",\"dateModified\":\"2025-08-02T05:40:47+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"description\":\"\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Nginx\u4f5c\u4e3a\u53cd\u5411\u4ee3\u7406\uff0cLet's Encrypt\u63d0\u4f9bSSL\u8bc1\u4e66\uff0c\u4ee5\u53caDocker Compose\u7f16\u6392\u5bb9\u5668\uff0c\u5168\u9762\u4fdd\u62a4\u4f60\u7684Node.js\u5e94\u7528\u7a0b\u5e8f\u5b89\u5168\u3002\u8be6\u7ec6\u914d\u7f6e\u6b65\u9aa4\u548c\u6700\u4f73\u5b9e\u8df5\uff0c\u786e\u4fdd\u5bb9\u5668\u5316Node.js\u5e94\u7528\u7684\u5b89\u5168\u90e8\u7f72\u3002\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js\u5b89\u5168\u914d\u7f6e\uff1a\u4f7f\u7528Nginx\u3001Let&#8217;s Encrypt\u548cDocker Compose\u4fdd\u62a4\u5bb9\u5668\u5316\u5e94\u7528\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Node.js\u5b89\u5168\u914d\u7f6e\uff1a\u4f7f\u7528Nginx\u3001Let's Encrypt\u548cDocker Compose\u4fdd\u62a4\u5bb9\u5668\u5316\u5e94\u7528 - Blog - Silicon Cloud","description":"\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Nginx\u4f5c\u4e3a\u53cd\u5411\u4ee3\u7406\uff0cLet's Encrypt\u63d0\u4f9bSSL\u8bc1\u4e66\uff0c\u4ee5\u53caDocker Compose\u7f16\u6392\u5bb9\u5668\uff0c\u5168\u9762\u4fdd\u62a4\u4f60\u7684Node.js\u5e94\u7528\u7a0b\u5e8f\u5b89\u5168\u3002\u8be6\u7ec6\u914d\u7f6e\u6b65\u9aa4\u548c\u6700\u4f73\u5b9e\u8df5\uff0c\u786e\u4fdd\u5bb9\u5668\u5316Node.js\u5e94\u7528\u7684\u5b89\u5168\u90e8\u7f72\u3002","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528nginx\u3001lets-encrypt\u548cdocker-compose\u6765\u4fdd\u62a4\u5bb9\u5668\u5316\u7684node-js\u5e94\u7528\u7a0b\u5e8f\/","og_locale":"zh_CN","og_type":"article","og_title":"Node.js\u5b89\u5168\u914d\u7f6e\uff1a\u4f7f\u7528Nginx\u3001Let's Encrypt\u548cDocker Compose\u4fdd\u62a4\u5bb9\u5668\u5316\u5e94\u7528","og_description":"\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Nginx\u4f5c\u4e3a\u53cd\u5411\u4ee3\u7406\uff0cLet's Encrypt\u63d0\u4f9bSSL\u8bc1\u4e66\uff0c\u4ee5\u53caDocker Compose\u7f16\u6392\u5bb9\u5668\uff0c\u5168\u9762\u4fdd\u62a4\u4f60\u7684Node.js\u5e94\u7528\u7a0b\u5e8f\u5b89\u5168\u3002\u8be6\u7ec6\u914d\u7f6e\u6b65\u9aa4\u548c\u6700\u4f73\u5b9e\u8df5\uff0c\u786e\u4fdd\u5bb9\u5668\u5316Node.js\u5e94\u7528\u7684\u5b89\u5168\u90e8\u7f72\u3002","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528nginx\u3001lets-encrypt\u548cdocker-compose\u6765\u4fdd\u62a4\u5bb9\u5668\u5316\u7684node-js\u5e94\u7528\u7a0b\u5e8f\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-11-05T18:41:27+00:00","article_modified_time":"2025-08-02T05:40:47+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/656470dea4b2f92e6c728c39\/35-0.png"}],"author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"9 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/","name":"Node.js\u5b89\u5168\u914d\u7f6e\uff1a\u4f7f\u7528Nginx\u3001Let's Encrypt\u548cDocker Compose\u4fdd\u62a4\u5bb9\u5668\u5316\u5e94\u7528 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-11-05T18:41:27+00:00","dateModified":"2025-08-02T05:40:47+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"description":"\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Nginx\u4f5c\u4e3a\u53cd\u5411\u4ee3\u7406\uff0cLet's Encrypt\u63d0\u4f9bSSL\u8bc1\u4e66\uff0c\u4ee5\u53caDocker Compose\u7f16\u6392\u5bb9\u5668\uff0c\u5168\u9762\u4fdd\u62a4\u4f60\u7684Node.js\u5e94\u7528\u7a0b\u5e8f\u5b89\u5168\u3002\u8be6\u7ec6\u914d\u7f6e\u6b65\u9aa4\u548c\u6700\u4f73\u5b9e\u8df5\uff0c\u786e\u4fdd\u5bb9\u5668\u5316Node.js\u5e94\u7528\u7684\u5b89\u5168\u90e8\u7f72\u3002","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js\u5b89\u5168\u914d\u7f6e\uff1a\u4f7f\u7528Nginx\u3001Let&#8217;s Encrypt\u548cDocker Compose\u4fdd\u62a4\u5bb9\u5668\u5316\u5e94\u7528"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8nginx%e3%80%81lets-encrypt%e5%92%8cdocker-compose%e6%9d%a5%e4%bf%9d%e6%8a%a4%e5%ae%b9%e5%99%a8%e5%8c%96%e7%9a%84node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/489","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=489"}],"version-history":[{"count":4,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/489\/revisions"}],"predecessor-version":[{"id":110137,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/489\/revisions\/110137"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}