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?请检查反向代理设置
让 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
-
在命令行运行
verdaccio
。 -
打开浏览器并访问 https://your.domain.com:port/
这些说明大多数在 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
- mkdir
- 当地安装 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。 按照讨论。