阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      Verdaccio 服务器的配置

      服务器配置

      这主要是一些基础的 linux 服务器配置信息,但是我觉得很重要来;

      记录并分享 verdaccio 在服务器上永久运行的步骤。

      您将需要 admin 权限(或者 sudo)权限。

      作为单独用户运行

      首先创建 verdaccio 用户:

      $ sudo adduser --system --gecos 'Verdaccio NPM mirror' --group --home /var/lib/verdaccio verdaccio
      

      或者,如果您没有 adduser

      $ sudo useradd --system --comment 'Verdaccio NPM mirror' --create-home --home-dir /var/lib/verdaccio --shell /sbin/nologin verdaccio
      

      使用以下命令将外壳创建为 verdaccio 用户:

      $ sudo su -s /bin/bash verdaccio
      $ cd
      

      该 cd 命令将您发送到 verdaccio 用户的主目录。确保至少运行一次 verdaccio 以生成配置文件。根据需要进行编辑。

      监听所有地址

      如果要侦听每个外部地址,请在配置中将 listen 指令设置为:

      # you can specify listen address (or simply a port)
      listen: 0.0.0.0:4873
      

      如果您在 Amazon EC2 实例中运行 verdaccio,则需要如上所述设置监听以更改配置文件。

      是配置 Apache 还是 nginx?请检查反向代理设置

      https://verdaccio.org/docs/zh-CN/reverse-proxy

      让 verdaccio 一直运行下去

      forever

      您可以使用名为“ forever”的节点程序包使 verdaccio 始终保持运行。

      首次 forever 在全球安装:

      $ sudo npm install -g forever
      

      确保已至少运行一次 verdaccio 来生成配置文件并记下创建的 admin 用户。然后,您可以使用以下命令启动 verdaccio:

      $ forever start `which verdaccio`
      

      您可以查看文档以获取有关永久使用的更多信息。

      pm2

      现在 pm2 也是非常流行的,可以使用

      存留服务器重启

      服务器重新引导后,可以一起使用 crontab 和 forever 来启动 verdaccio。当您以 verdaccio 用户身份登录时,请执行以下操作:

      $ crontab -e
      

      这可能会要求您选择编辑器。选择您喜欢的并继续。将以下条目添加到文件中:

      @reboot /usr/bin/forever start /usr/lib/node_modules/verdaccio/bin/verdaccio
      

      位置可能因服务器设置而异。如果您想知道文件在哪里,可以使用“哪个”命令:

      $ which forever
      $ which verdaccio
      

      使用 systemd

      而是 forever 可以使用它 systemd 来启动 verdaccio 并使它保持运行。

      Verdaccio 安装具有 systemd 单元,您只需要复制它:

      $ sudo cp /usr/lib/node_modules/verdaccio/systemd/verdaccio.service /lib/systemd/system/ && sudo systemctl daemon-reload
      

      该单元假定您已在中进行配置 /etc/verdaccio/config.yaml 并将数据存储在中 /var/lib/verdaccio,因此可以将文件移动到这些位置或编辑该单元。

      反向代理设置

      使用反向代理是一种常见的做法。 以下配置是最推荐和最常用的配置。

      Apache

      Apache 和 mod_proxy 不应对斜杠进行解码 / 编码,而应保持原样:

      用于在服务器上的相对路径 / npm 中安装

      <VirtualHost *:80>
        AllowEncodedSlashes NoDecode
        ProxyPass /npm http://127.0.0.1:4873 nocanon
        ProxyPassReverse /npm http://127.0.0.1:4873
      </VirtualHost>
      

      用于在服务器上的根路径 / 下安装

      <VirtualHost *:80>
        ServerName your.domain.com
        ServerAdmin hello@your.domain.com
        ProxyPreserveHost On
        AllowEncodedSlashes NoDecode
        ProxyPass / http://127.0.0.1:4873/ nocanon
        ProxyPassReverse / http://127.0.0.1:4873/
      </VirtualHost>
      

      用 SSL 配置

      Apache 虚拟服务器配置

      apacheconfig
      <IfModule mod_ssl.c>
      <VirtualHost *:443>
          ServerName npm.your.domain.com
          SSLEngine on
          SSLCertificateFile      /etc/letsencrypt/live/npm.your.domain.com/fullchain.pem
          SSLCertificateKeyFile   /etc/letsencrypt/live/npm.your.domain.com/privkey.pem
          SSLProxyEngine          On
          ProxyRequests           Off
          ProxyPreserveHost       On
          AllowEncodedSlashes     NoDecode
          ProxyPass               /       http://127.0.0.1:4873/ nocanon
          ProxyPassReverse        /       http://127.0.0.1:4873/
          RequestHeader set       X-Forwarded-Proto "https"
      </VirtualHost>
      </IfModule>
      

      Nginx

      以下代码段是一个完整的 docker 示例,可以在我们的 Docker 示例存储库中进行测试。

      https://github.com/verdaccio/docker-examples/tree/master/reverse_proxy/nginx

      upstream verdaccio_v4 {
          server verdaccio_relative_path_v4:4873;
          keepalive 8;
      }
      
      upstream verdaccio_v4_root {
          server verdaccio_relative_path_v4_root:8000;
          keepalive 8;
      }
      
      upstream verdaccio_v3 {
          server verdaccio_relative_path_latest_v3:7771;
          keepalive 8;
      }
      
      server {
          listen 80 default_server;
          access_log /var/log/nginx/verdaccio.log;
          charset utf-8;
      
          location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass http://verdaccio_v4_root;
            proxy_redirect off;
          }
      
          location ~ ^/verdaccio/(.*)$ {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass http://verdaccio_v4/$1;
            proxy_redirect off;
          }
      
          location ~ ^/verdacciov3/(.*)$ {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_set_header X-NginX-Proxy true;
      
            proxy_pass http://verdaccio_v3/$1;
            proxy_redirect off;
          }
      }
      

      SSL 例子

      server {
          listen 80;
          return 302 https://$host$request_uri;
      }
      
      server {
          listen 443 ssl http2;
          server_name localhost;
      
          ssl_certificate     /etc/nginx/cert.crt;
          ssl_certificate_key /etc/nginx/cert.key;
      
          ssl on;
          ssl_session_cache  builtin:1000  shared:SSL:10m;
          ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
          ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
          ssl_prefer_server_ciphers on;
      
          location / {
              proxy_set_header    Host $host;
              proxy_set_header    X-Real-IP $remote_addr;
              proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header    X-Forwarded-Proto $scheme;
              proxy_pass          http://verdaccio_v4_root;
              proxy_read_timeout  600;
              proxy_redirect off;
          }
      
          location ~ ^/verdaccio/(.*)$ {
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header Host $host;
              proxy_set_header X-NginX-Proxy true;
              proxy_pass http://verdaccio_v4_root/$1;
              proxy_redirect off;
          }
      }
      

      在逆向代理服务器后运行用不同的域名和端口

      子目录

      如果整个 URL 用于 Verdaccio,则无需定义 url_prefix,否则在 config.yaml 中将需要类似的内容。

      url_prefix: /sub_directory/
      

      如果在反向代理后面运行 verdaccio,您可能会注意到所有资源文件均作为相对路径,

      例如 http://127.0.0.1:4873/-//static

      要解决此问题,您应该将真实域和端口发送到带有主机头的 verdaccio

      Nginx configure 应该如下所示:

      ocation / {
          proxy_pass http://127.0.0.1:4873/;
          proxy_set_header Host            $host:$server_port;
          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_set_header X-Forwarded-Proto $scheme;
      }
      

      在这种情况下,不应在 verdaccio 配置中设置 url_prefix

      或者子 - 目录安装:

      location ~ ^/verdaccio/(.*)$ {
          proxy_pass http://127.0.0.1:4873/$1;
          proxy_set_header Host            $host:$server_port;
          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_set_header X-Forwarded-Proto $scheme;
      }
      

      在这个例子里, url_prefix 应该设置为 /verdaccio/

      注意:安装路径后有一个斜杠 (https://your-domain:port/verdaccio/)!

      设置 SSL 证书

      请按照以下说明配置 SSL 证书,以通过 HTTPS 为 NPM 注册表提供服务。

      • ~/.config/verdaccio/config.yaml更新监听属性:
      listen: 'https://your.domain.com/'
      

      更新完 listen 属性并尝试再次运行 verdaccio 后,它将要求提供证书。

      • 生成证书
       $ openssl genrsa -out /Users/user/.config/verdaccio/verdaccio-key.pem 2048
       $ openssl req -new -sha256 -key /Users/user/.config/verdaccio/verdaccio-key.pem -out /Users/user/.config/verdaccio/verdaccio-csr.pem
       $ openssl x509 -req -in /Users/user/.config/verdaccio/verdaccio-csr.pem -signkey /Users/user/.config/verdaccio/verdaccio-key.pem -out /Users/user/.config/verdaccio/verdaccio-cert.pem
      
      • 编辑您的配置文件/Users/user/.config/verdaccio/config.yaml并添加以下部分
      https:
          key: /Users/user/.config/verdaccio/verdaccio-key.pem
          cert: /Users/user/.config/verdaccio/verdaccio-cert.pem
          ca: /Users/user/.config/verdaccio/verdaccio-csr.pem
      

      或者,如果您拥有 server.pfx 格式的证书,则可以添加以下配置部分:

      (密码是可选的,只有在证书被加密时才需要。)

      https:
        pfx: /Users/user/.config/verdaccio/server.pfx
        passphrase: 'secret'
      

      You can find more info on the key, cert, ca, pfx, and passphrase arguments in the Node documentation

      https://nodejs.org/api/tls.html#tls_tls_createsecurecontext_options

      这些说明大多数在 OSX 和 Linux 下有效。 在 Windows 上,路径会有所不同,但是步骤相同。

      Docker

      如果您使用的是 Docker 映像,则必须将 VERDACCIO_PROTOCOL 环境变量设置为 https

      因为 dockerfile 中提供了 listen 参数,因此从配置文件中将其忽略。

      如果使用的端口不是 4873,也可以设置 VERDACCIO_PORT 环境变量。

      作为 Windows 服务安装

      基于的非精确指南请见这里:http://asysadmin.tumblr.com/post/32941224574/running-nginx-on-windows-as-a-service 。

      我制作以下,它提供良好运行的 verdaccio 服务安装:

      • 为 verdaccio 创建一个目录
        • mkdir c:\verdaccio
        • cd c:\verdaccio
      • 当地安装 verdaccio(我在全局安装的时候出现 npm 问题)
        • npm install verdaccio
      • 在此位置 (c:\verdaccio\config.yaml) 创建 config.yaml 文件
      • Windows 服务设置

      使用 NSSM

      替代方法:(当我尝试下载的时候,WinSW 包缺失)

      • 下载 NSSM 并提取

      • 添加包含 nssm.exe 的路径到 PATH(路径)中

      • 打开管理命令

      • 运行 nssm install verdaccio,至少必须填写应用程序 tab Path(选项卡路径),启动目录和参数字段。 假设在系统路径中以及 c:\verdaccio 位置用 node 安装,以下的值将起作用:

        • Path: node
        • Startup directory: c:\verdaccio
        • Arguments: c:\verdaccio\node_modules\verdaccio\build\lib\cli.js -c c:\verdaccio\config.yaml
        • You can adjust other service settings under other tabs as desired. When you are done, click Install service button
      • 启动服务 sc 启动 verdaccio

      使用 WinSW

      • As of 2015-10-27, WinSW is no longer available at the below location. Please follow the Using NSSM instructions above.
      • Download WinSW
        • 放置可执行文件(例如 winsw-1.9-bin.exe) 到此文件夹 (c:\verdaccio) 中并将其重命名为 verdaccio-winsw.exe
      • 在 c:\verdaccio 创建一个配置文件,命名为 verdaccio-winsw.xml,它有以下配置 xml verdaccio verdaccio verdaccio node c:\verdaccio\node_modules\verdaccio\src\lib\cli.js -c c:\verdaccio\config.yaml roll c:\verdaccio。
      • 安装服务
        • cd c:\verdaccio
        • verdaccio-winsw.exe install
      • 开始服务
        • verdaccio-winsw.exe start

      以上的一些配置比我预想的要繁琐,看起来好像忽略了’workingdirectory',

      但除此以外,这对我来说很有效,而且让 verdaccio instance 保持在服务器重启之间,

      并且还在 verdaccio 流程出事故的时候可以自我重启。

      更多请参考:https://github.com/davidenke/verdaccio-deamon-windows

      在 IIS 服务器上安装

      这些说明是针对 Windows Server 2016,IIS 10,Node.js 10.15.0,iisnode 0.2.26 和 verdaccio 3.11.0 编写的。

      • 安装 IIS 安装 iisnode。 确保按照 iisnode 的说明中的说明安装必备组件(URL 重写模块和节点)。
      • 在要承载 verdaccio 的资源管理器中创建一个新文件夹。 例如 C:\verdaccio。 在此文件夹里保存 package.json, start.js 和 web.config 。
      • 在因特网信息服务管理器中创建一个新站点。 您可以随意给它命名。 我将在这些用法说明中称它为 verdaccio。 指定保存所有文件和端口号的路径。
      • 返回到资源管理器中,把对您刚创建的文件夹的修改权限赋予给运行此应用程序池的用户。 如果您已命名此站点为 verdaccio,并没有修改该应用程序池,它正在 ApplicationPoolIdentity 下运行,您就应该给用户 IIS AppPool\verdaccio 修改权限。如果您需要帮助的话,请参照用法说明。 (如果需要,可以在日后限制访问,这样它只有 iisnode 和 verdaccio\storage 的修改权限)
      • 启动命令行并执行以下命令来下载 verdaccio:
      cd c:\verdaccio
      npm install
      
      • 请确保您有入站规则来接受 TCP 流量到 Windows 防火墙的端口
      • 现在,您可以导航到您指定的主机和端口

      我希望 verdaccio 站点成为 IIS 中默认的站点,因此我执行了以下操作:

      • 我中止“默认网站”,并且只在 IIS 里启动"verdaccio"站点
      • 我将端口 80 绑定设置为"http", ip 地址为"全部未定义",ok 任何警告或提示。

      这些指南是基于 Host Sinopia in IIS on Windows。

      https://gist.github.com/HCanber/4dd8409f79991a09ac75

      {
        "name": "iisnode-sinopia",
        "version": "1.0.0",
        "description": "Hosts sinopia in iisnode",
        "main": "start.js",
        "dependencies": {
          "sinopia": "^1.3.1"
        }
      }
      

      不得不依照以下调整我的网页配置,但是您可能发现上述提到链接里的原始配置可以更好作业

      将创建默认配置文件 c:\verdaccio\verdaccio\config.yaml

      package.json

      {
        "name": "iisnode-verdaccio",
        "version": "1.0.0",
        "description": "Hosts verdaccio in iisnode",
        "main": "start.js",
        "dependencies": {
          "verdaccio": "^3.11.0"
        }
      }
      

      start.js

      process.argv.push('-l', 'unix:' + process.env.PORT, '-c', './config.yaml');
      require('./node_modules/verdaccio/build/lib/cli.js');
      

      Alternate start.js for Verdaccio versions < v3.0

      process.argv.push('-l', 'unix:' + process.env.PORT);
      require('./node_modules/verdaccio/src/lib/cli.js');
      

      web.config

      <configuration>
        <system.webServer>
          <modules>
              <remove name="WebDAVModule" />
          </modules>
      
          <!-- indicates that the start.js file is a node.js application
          to be handled by the iisnode module -->
          <handlers>
                  <remove name="WebDAV" />
                  <add name="iisnode" path="start.js" verb="*" modules="iisnode" resourceType="Unspecified" requireAccess="Execute" />
                  <add name="WebDAV" path="*" verb="*" modules="WebDAVModule" resourceType="Unspecified" requireAccess="Execute" />
          </handlers>
      
          <rewrite>
            <rules>
      
              <!-- iisnode folder is where iisnode stores it's logs. These should
              never be rewritten -->
              <rule name="iisnode" stopProcessing="true">
                  <match url="iisnode*" />
                  <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                  <action type="None" />
              </rule>
      
              <!-- Rewrite all other urls in order for verdaccio to handle these -->
              <rule name="verdaccio">
                  <match url="/*" />
                  <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                  <action type="Rewrite" url="start.js" />
              </rule>
            </rules>
          </rewrite>
      
          <!-- exclude node_modules directory and subdirectories from serving
          by IIS since these are implementation details of node.js applications -->
          <security>
            <requestFiltering>
              <hiddenSegments>
                <add segment="node_modules" />
              </hiddenSegments>
            </requestFiltering>
          </security>
      
        </system.webServer>
      </configuration>
      

      故障排除

      使用 https 托管时,Web 界面不会加载,因为它尝试通过 http 下载脚本。

      确保您在 verdaccio 配置中正确提到了 url_prefix。 按照讨论。

      目录
      目录