NGINX是高性能HTTP服务器,也是反向代理。与传统服务器不同,NGINX遵循事件驱动的异步体系结构。结果,内存占用量低,性能高。如果您正在运行基于Node.js的Web应用程序,则应认真考虑将NGINX用作反向代理。
NGINX在提供静态资产方面非常有效。对于所有其他请求,它将与您的Node.js后端进行对话,并将响应发送给客户端。在本教程中,我们将讨论如何配置NGINX以与Node.js一起使用。我们还将看到如何在NGINX服务器中设置SSL。
注意:Node还具有内置的HTTPS模块,可以配置为读取必需的证书文件,而无需反向代理。您可以在我们的文章如何在Node.js中使用SSL / TLS中找到有关此内容的更多信息。
安装NGINX
假设您已经在计算机上安装了Node.js,让我们看看如何安装NGINX。
在Linux上安装
如果您正在运行Ubuntu,则可以使用以下命令来安装NGINX:
sudo apt-get updatesudo apt-get install nginx
如果您正在运行Ubuntu以外的Linux发行版,请查看NGINX安装文档【https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/#prebuilt】以获取更多信息。
NGINX一旦安装,将自动启动。
在macOS上安装
如果您使用的是macOS,则可以使用Homebrew轻松安装NGINX。步骤如下:
-
Homebrew需要将目录
/usr/local
添加chown
到您的用户名。因此,请首先在终端中运行以下命令:sudo chown -R 'username here' /usr/local
-
现在,以下两个命令将在您的系统上安装NGINX:
brew link pcre brew install nginx
-
安装完成后,您可以键入以下命令来启动NGINX:
sudo nginx
-
NGINX配置文件可以在这里找到:
/usr/local/etc/nginx/nginx.conf
。
在Windows上安装
对于Windows,请转到NGINX 下载 页面并获取zip。下一步是解压缩归档文件,并在命令提示符下移动到目录,如下所示:
unzip nginx-1.3.13.zipcd nginx-1.3.13
start nginx
如您所见,该命令start nginx
将启动NGINX。
现在安装已完成,让我们看看如何配置简单服务器。
设置Node.js服务器
首先,让我们创建一个简单的Node.js服务器。我们将首先启动一个项目并安装Express软件包:
mkdir node-demo && cd node-demonpm init -ynpm i express
创建一个名为的文件server.js
,其中包含以下内容:
const express = require('express')const app = express()const port = 3000app.get('/', (req, res) => res.send('Hello World!'))app.listen(port, () => console.log(`Example app listening on port ${port}!`))
您可以通过运行启动服务器node server.js
。
配置NGINX
现在让我们打开NGINX的默认站点配置文件:
sudo nano /etc/nginx/sites-available/default
如果需要,可以直接转到目录并使用您喜欢的文本编辑器打开配置文件。
向下滚动时,会发现一个server
块。看起来像这样:
server {
listen 80;
server_name localhost;
....
more config goes here
}
接下来,我们将配置server
块以适合我们的需求。我们想要配置NGINX以便将所有请求传递到我们的Node.js服务器。server
如下所示,用新的块替换上面的块:
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
如您所见,Web服务器将在http://localhost
port上侦听80
。该location /
块告诉NGINX如何处理任何传入请求。我们proxy_pass
通常指向Node.js应用程序,http://localhost:3000
在本例中该应用程序正在运行。
此时,您应该保存文件并键入以下内容以重新启动NGINX,具体取决于您的操作系统。
Ubuntu:
sudo service nginx restart
要么:
sudo /etc/init.d/nginx restart
苹果系统:
sudo nginx -s stop && sudo nginx
视窗:
nginx -s reload
完成此操作后,您可以转到http:// localhost以查看我们的代理正在运行。尽管您正在访问NGINX Web服务器,但是将从Node.js服务器获得实际响应。
注意:您需要确保端口80上没有其他任何东西(例如Apache)运行。
设定SSL
为了与用户的浏览器建立安全连接,我们需要获取数字证书。通常,您是从诸如Let's Encrypt之类的证书颁发机构获得的。如果您使用"让我们加密"路线,请确保使用Certbot安装证书,这将为您重新配置NGINX。
对于本地开发(以及本教程的后续操作),您还可以创建一个自签名证书。唯一的问题是,当有人访问您的网站时,浏览器将显示警告"证书不可信"。但是对于在本地计算机上进行测试来说,这是完全可以的。
获得证书和私钥后,即可在NGINX中设置SSL。您需要将我们之前的服务器块修改为以下内容:
server {
listen 80;
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
而已!
现在,如果您访问 https:// localhost,则您的连接将是安全的。上面的配置假定证书和私钥分别位于/etc/nginx/ssl/server.crt
和/etc/nginx/ssl/server.key
,但是您可以根据需要更改这些位置。
服务静态资源
在Node.js服务器之前设置NGINX的另一个好处是,我们可以轻松地对其进行配置,以提供应用程序所需的任何静态资产。这将节省通过这些请求供Node处理的开销。
为此,我们需要location
在服务器配置中添加一个新块:
server {
listen 80;
server_name localhost;
location / {
...
}
location /public {
root /usr/local/var/www;
}
}
在此location
块中,我们将根目录设置为/usr/local/var/www
,但您可以根据需要选择其他目录。结果,无论何时有类似的请求http://localhost/public/somepath/file.html
,NGINX都会/usr/local/var/www/public/somepath/file.html
直接从中提供文件。
结论
在这个简短的教程中,我们已经看到了如何将NGINX用作Node.js应用程序的反向代理并配置SSL。通过使用NGINX处理静态资源,您还可以减轻Node应用程序的负担。
下一篇文章将给大家介绍:Node.js中使用SSL / TLS。请持续关注我们,如有问题,可以留言或者加Q群讨论。