Upstart env stanza not setting environment variables (like NODE_ENV) for Node.js application

后端 未结 4 821
遇见更好的自我
遇见更好的自我 2020-12-24 02:31

I have an Upstart script for my server that looks like this:

description \"myapp node.js server\"

start on runlevel [2345]
stop on shutdown

env NODE_ENV=pr         


        
4条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-24 02:38

    From the sudo man page (Ubuntu version of sudo)

    There are two distinct ways to deal with environment variables. By default, the env_reset sudoers option is enabled. This causes commands to be executed with a minimal environment containing TERM, PATH, HOME, SHELL, LOGNAME, USER and USERNAME in addition to variables from the invoking process permitted by the env_check and env_keep sudoers options. There is effectively a whitelist for environment variables.

    Sudo is resetting the environment. This is a frustrating aspect of using su and sudo in upstart or init scripts. Recent versions of upstart support specifying uid/gid without the use of sudo via the setuid/setgid directives as in the example below. Also note the use of chdir.

    start on filesystem and started networking
    respawn
    chdir /var/www/yourapp
    setuid yourapp
    setgid yourapp
    env NODE_ENV=production
    env PATH=/usr/local/bin:/usr/bin:/bin
    env CUSTOM=somevalue
    exec /usr/local/bin/node app.js | /usr/bin/multilog s1024000 /var/log/yourapp 2>&1
    

    For older versions of upstart, here's what I used to do to work around it.

    description "start and stop the example.com node.js server"
    
    start on filesystem and started networking
    respawn
    
    chdir /path/to/your/code
    exec su -c 'PATH=$PWD/node/bin NODE_ENV=$(cat node_env.txt) ./node/bin/node app/server.js' www-data  >> tmp/stdout.log 2>&1
    

    Note that I just put a node_env.txt file in my app root that sets production mode, because I hate environment variables. You can just do NODE_ENV=production right there if you prefer.

提交回复
热议问题