<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PM2 on Dapeng Zhang</title><link>https://zhangdapeng.dev/tags/pm2/</link><description>Recent content in PM2 on Dapeng Zhang</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 03 Jul 2025 11:59:49 +0000</lastBuildDate><atom:link href="https://zhangdapeng.dev/tags/pm2/index.xml" rel="self" type="application/rss+xml"/><item><title>PM2启动配置文件参数</title><link>https://zhangdapeng.dev/p/pm2-qi-dong-pei-zhi-wen-jian-can-shu/</link><pubDate>Thu, 03 Jul 2025 11:59:49 +0000</pubDate><guid>https://zhangdapeng.dev/p/pm2-qi-dong-pei-zhi-wen-jian-can-shu/</guid><description>&lt;p&gt;PM2启动配置文件参数比较全的一个。如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;node-app&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;cwd&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;/srv/node-app/current&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;args&amp;#34;&lt;/span&gt; : [&lt;span style="color:#e6db74"&gt;&amp;#34;--toto=heya coco&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;-d&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;script&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;bin/app.js&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;node_args&amp;#34;&lt;/span&gt; : [&lt;span style="color:#e6db74"&gt;&amp;#34;--harmony&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34; --max-stack-size=102400000&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;log_date_format&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;YYYY-MM-DD HH:mm Z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;error_file&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;/var/log/node-app/node-app.stderr.log&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;out_file&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;log/node-app.stdout.log&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;pid_file&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;pids/node-geo-api.pid&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;instances&amp;#34;&lt;/span&gt; : &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, &lt;span style="color:#75715e"&gt;//or 0 =&amp;gt; &amp;#39;max&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;min_uptime&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;200s&amp;#34;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 200 seconds, defaults to 1000
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;max_restarts&amp;#34;&lt;/span&gt; : &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// defaults to 15
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;max_memory_restart&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;1M&amp;#34;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 1 megabytes, e.g.: &amp;#34;2G&amp;#34;, &amp;#34;10M&amp;#34;, &amp;#34;100K&amp;#34;, 1024 the default unit is byte.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;cron_restart&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;1 0 * * *&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;watch&amp;#34;&lt;/span&gt; : &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;ignore_watch&amp;#34;&lt;/span&gt; : [&lt;span style="color:#e6db74"&gt;&amp;#34;[\\/\\\\]\\./&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;node_modules&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;merge_logs&amp;#34;&lt;/span&gt; : &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;exec_interpreter&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;exec_mode&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;fork&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;autorestart&amp;#34;&lt;/span&gt; : &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// enable/disable automatic restart when an app crashes or exits
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;vizion&amp;#34;&lt;/span&gt; : &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// enable/disable vizion features (versioning control)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Default environment variables that will be injected in any environment and at any start
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;env&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;NODE_ENV&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;production&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;AWESOME_SERVICE_API_TOKEN&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;env_*&amp;#34;&lt;/span&gt; : {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;SPECIFIC_ENV&amp;#34;&lt;/span&gt; : &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;比较有用的参数:&lt;/p&gt;
&lt;p&gt;cron_restart:定时启动，解决重启能解决的问题&lt;/p&gt;
&lt;p&gt;max_memory_restart：解决内容不够用的问题，不过会有风险【数据丢失】&lt;/p&gt;</description></item><item><title>PM2 npm start 方法</title><link>https://zhangdapeng.dev/p/pm2-npm-start-fang-fa/</link><pubDate>Wed, 02 Jul 2025 16:00:39 +0000</pubDate><guid>https://zhangdapeng.dev/p/pm2-npm-start-fang-fa/</guid><description>&lt;p&gt;这里只有代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pm2 start npm --name &lt;span style="color:#e6db74"&gt;&amp;#34;{app name}&amp;#34;&lt;/span&gt; -- start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>使用PM2 Deploy部署基于Git版本管理的网站应用 自动部署</title><link>https://zhangdapeng.dev/p/shi-yong-pm2-deploy-bu-shu-ji-yu-git-ban-ben-guan-li-de-wang-zhan-ying-yong-zi-dong-bu-shu/</link><pubDate>Mon, 30 Jun 2025 15:15:39 +0000</pubDate><guid>https://zhangdapeng.dev/p/shi-yong-pm2-deploy-bu-shu-ji-yu-git-ban-ben-guan-li-de-wang-zhan-ying-yong-zi-dong-bu-shu/</guid><description>&lt;p&gt;按照官方介绍，PM2是一款用于生产环境Node.js应用进程管理的工具。按照民间介绍，它主要有这样几个功能：保证Node.js应用永远在线（挂掉自动重启）、自动负载均衡、零中断重启应用等。&lt;/p&gt;
&lt;p&gt;鉴于它是如此优秀，这里还是简要介绍一下前两个功能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先，它是一个Node.js写的工具，使用npm即可安装使用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install -g pm2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;运行Node.js程序&lt;/p&gt;
&lt;p&gt;如果不使用pm2，运行Node.js程序是这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;node xxx.js
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用pm2，是这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pm2 start xxx.js
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;监视模式&lt;/p&gt;
&lt;p&gt;如果你正在开发Node.js应用，需要在代码变更后自动重启应用，只需要在pm2的参数中加上&amp;ndash;watch即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pm2 start xxx.js --watch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;cluster模式&lt;/p&gt;
&lt;p&gt;默认情况下pm2是以fork模式启动应用的，如果以cluster模式启动的话，则可以使用pm2自带的负载均衡、零间断重启等功能。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pm2 start xxx.js -i &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面的命令会以cluster模式启动4个应用进程，并自动为它们提供负载均衡，并且可以使用gracefulReload达到更新应用时不中断服务的效果。&lt;/p&gt;
&lt;p&gt;关于cluster模式，可参见朴灵《深入浅出Node.js》一书。&lt;/p&gt;
&lt;p&gt;pm2低版本默认是以cluster模式启动的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;部署应用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;官方文档:https://github.com/Unitech/PM2/blob/master/ADVANCED_README.md#deployment&lt;/p&gt;
&lt;p&gt;这才是本文的重点。PM2的部署功能可以实现网站应用的半自动部署功能。注意本文标题没有加“Node.js”，意味着这个功能并不只适用于Node.js网站应用，事实上它部署功能是用shell写的，跟网站使用什么语言没什么关系。&lt;/p&gt;
&lt;p&gt;PM2的部署功能与版本管理工具（Git，不确定是否支持SVN，下文以Git为例）结合比较紧，因此需要保证网站项目使用版本管理工具管理代码，并且服务器可以访问到版本管理服务器。&lt;/p&gt;
&lt;p&gt;部署功能是在新版本（0.12）中才添加进来的。如果你使用的是旧版本的，需要先升级：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install -g pm2@latest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pm2 updatePM2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接下来需要建立一个部署的配置文件，这个文件在本机（操作发布的机器）和服务器上都需要有，因此最好放入Git版本管理中，并且推送到远程代码库（Git服务器）。&lt;/p&gt;
&lt;p&gt;切换到项目目录下，然后执行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pm2 ecosystem
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;即可得到一个示例json文件（例如我得到的是ecosystem.json5），将它做对应的修改，大致如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;apps&amp;#34;&lt;/span&gt; : [{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;API&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;script&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;app.js&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;env&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;COMMON_VARIABLE&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;env_production&amp;#34;&lt;/span&gt; : {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;NODE_ENV&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;production&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;WEB&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;script&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;web.js&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;deploy&amp;#34;&lt;/span&gt; : {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;production&amp;#34;&lt;/span&gt; : {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;user&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//登录账号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;host&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;212.83.163.1&amp;#34;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//服务器地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;ref&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;origin/master&amp;#34;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//git 分支
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;repo&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;xx@xx:repo.git&amp;#34;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//git地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;path&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;/var/www/production&amp;#34;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//服务器项目目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;post-deploy&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;pm2 startOrRestart ecosystem.json5 --env production&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;dev&amp;#34;&lt;/span&gt; : {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;user&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;host&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;212.83.163.1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;ref&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;origin/master&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;repo&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;xx@xx:repo.git&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;path&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;/var/www/development&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;post-deploy&amp;#34;&lt;/span&gt; : &lt;span style="color:#e6db74"&gt;&amp;#34;pm2 startOrRestart ecosystem.json5 --env dev&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;env&amp;#34;&lt;/span&gt; : {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;NODE_ENV&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;dev&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;需要注意：&lt;/p&gt;
&lt;p&gt;apps.name和apps.script应该与PM2识别应用有关，后续执行&lt;code&gt;pm2 restart&lt;/code&gt;的时候可以对应到进程（未证实）&lt;/p&gt;
&lt;p&gt;deploy中可以含有多个环境，需要能够通过SSH（公钥认证）登录服务器&lt;/p&gt;
&lt;p&gt;web目录并不是真正的放版本库文件的目录，PM2会再建立一个source子目录，这个才是真正放代码的目录&lt;/p&gt;
&lt;p&gt;post-deploy是指代码部署完之后执行的命令，这里以Node.js为例子，执行依赖安装，然后重启PM2中的进程&lt;/p&gt;
&lt;p&gt;然后就可以使用&lt;/p&gt;
&lt;p&gt;首先需要安装一下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pm2 deploy ecosystem.json5 production setup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个过程中可能会涉及到权限的问题，不过都是一些小的问题&lt;/p&gt;
&lt;p&gt;如果已经安装可以运行下面这个命令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pm2 deploy ecosystem.json5 production
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;自动发布网站项目了，非常方便。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xx@xx:~/nodejs/node-react$ pm2 deploy ecosystem.json5 production
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&amp;gt; Deploying to production environment
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&amp;gt; on host 205.209.156.140
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ○ deploying
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ○ hook pre-deploy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ○ fetching updates
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xx@xx&lt;span style="color:#e6db74"&gt;&amp;#39;s password: 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Fetching origin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;From https://git.oschina.net/zhangdapeng89/node-react
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 4456ce1..c45f87c master -&amp;gt; origin/master
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ○ resetting HEAD to origin/master
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;xx@xx&amp;#39;&lt;/span&gt;s password: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;HEAD is now at c45f87c 添加eco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xx@xx&lt;span style="color:#e6db74"&gt;&amp;#39;s password: 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;xx@xx&amp;#39;&lt;/span&gt;s password: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ○ executing post-deploy &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;pm2 startOrRestart ecosystem.json5 --env production&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xx@xx&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;s password: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬──────────────┬──────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼──────────────┼──────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ app │ &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; │ fork │ &lt;span style="color:#ae81ff"&gt;5843&lt;/span&gt; │ online │ &lt;span style="color:#ae81ff"&gt;958&lt;/span&gt; │ 11D │ 133.094 MB │ disabled │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ API │ &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; │ fork │ &lt;span style="color:#ae81ff"&gt;22700&lt;/span&gt; │ online │ &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; │ 0s │ 12.219 MB │ disabled │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ WEB │ &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; │ fork │ &lt;span style="color:#ae81ff"&gt;22705&lt;/span&gt; │ online │ &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; │ 0s │ 11.746 MB │ disabled │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴──────────────┴──────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Use &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;pm2 show &amp;lt;id|name&amp;gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt; to get more details about an app
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ○ hook test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ○ successfully deployed origin/master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&amp;gt; Success
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>