NGINX,发音为"engine-x",是一个开源 Web 服务器,主要用于反向代理、缓存和负载平衡。
作为一个后端开发者,那么在您职业生涯的某个阶段您可能需要使用 NGINX。本文将帮助您开始使用 NGINX。最后,您将能够设置自己的 NGINX Web 服务器。您还将了解负载平衡和反向代理等术语。
为什么选择 NGINX?
NGINX 广泛用于提供 Web content。它以其高性能、稳定性和效率而闻名,使其成为各种 Web 应用程序和网站的流行选择。
NGINX 的一些主要功能包括:
- Web 服务器:它可以直接向客户端提供静态内容(例如 HTML、CSS 和图像),从而高效地交付网页。
- 反向代理:它可以充当反向代理,将客户端的请求转发到其他服务器。这是安全性和可扩展性方面的常用做法。
- 负载均衡器⚖:它可以将传入流量路由到不同的服务器实例,确保最佳的资源利用率。
- SSL/TLS Termination:它可以处理 SSL/TLS termination,加密和解密客户端和服务器之间的数据。
- 性能优化⚡:设计轻量高效,能够以较低的资源占用处理大量并发连接。
安装
Ubuntu/Debian
sql
sudo apt update
sudo apt install nginx
安装后,NGINX 将在后台自动启动。要检查状态,请运行:
lua
sudo systemctl status nginx
苹果系统
我们可以使用brew安装它
brew install nginx
安装后,您可以使用以下命令运行它:
sql
brew services start nginx
Windows
- 从官方网站下载NGINX的最新稳定版本:NGINX下载。
- 将下载的 zip 文件解压缩到您选择的位置。
- 导航到 NGINX 目录并运行
nginx.exe
. NGINX 应该启动。
配置
要查找配置文件,请运行:
vbnet
nginx -t
nginx: the configuration file /opt/homebrew/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /opt/homebrew/etc/nginx/nginx.conf test is successful
此命令测试配置文件是否存在语法错误和拼写错误,但不应用它。它还将显示主配置文件的路径。
您可以直接编辑此文件,也可以创建一个新文件以进行后续操作。
Serving HTML
如果您检查该nginx.conf
文件,您会看到许多块被包裹起来{}
,并且这些块内有许多键值对。
这些块称为上下文 ,键值对称为该上下文的指令。
我们将清除文件并从头开始。你的nginx.conf
应该看起来像这样:
bash
events {}
http {
server {
listen 8080;
root /Users/syfe/Desktop/tutorials/nginx-test/html;
}
}
您只需要events
上下文http
即可成功加载配置。在内部http
,我们有server
包含 Web 服务器配置的上下文。
它告诉服务器listen
打开端口8080
并将root
文件设置为/Users/syfe/Desktop/tutorials/nginx-test/html
.
在html
目录中,我们将创建一个index.html
文件。
xml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
这是当前目录结构的样子。
如果您创建了一个新的conf文件,您可以通过运行以下命令加载它:
r
nginx -c path_to_your_file
对任何conf文件进行更改后,您可以使用以下命令应用它:
nginx -s reload
如果继续http://localhost:8080
,您将看到正在提供的 html。
提供其他静态内容
如果您尝试使用 CSS 文件向 HTML 内容添加样式并使用当前配置提供服务,它将无法工作。
要实现此功能,您必须在配置中设置正确的 mime 类型。
arduino
...
http {
types {
text/css css;
text/html html;
}
server {
...
}
}
...
但为所有不同类型的资产手动添加这些 mime 类型非常麻烦。因此,NGINX 附带了一个mime.types
可以在这里使用的默认文件。
添加默认的 mime 类型文件后,我们的配置如下所示:
bash
events {}
http {
# include mime.types; (if you did not create a custom file)
include /opt/homebrew/etc/nginx/mime.types;
server {
listen 8080;
root /Users/syfe/Desktop/tutorials/nginx-test/html;
}
}
重新加载conf后,我们的HTML和CSS应该按预期工作,但现在我们支持很多类型。
location
block
假设您有以下目录结构:
转至/animals
, 将提供目录index.html
内的文件animals
。如果您想要另一个接口/forest
提供相同的文件怎么办?
我们可以使用该location
块来指定完整路径,然后使用alias
我们可以设置将提供文件的目录。
bash
events {}
http {
include /opt/homebrew/etc/nginx/mime.types;
server {
listen 8080;
root /Users/syfe/Desktop/tutorials/nginx-test/html;
location /forest {
alias /Users/syfe/Desktop/tutorials/nginx-test/html/animals;
}
}
}
通过上述配置,/forest
将从目录中处理请求animals
。
如果有人删除了animals
目录或者我们尝试提供的文件不可用怎么办?我们可以使用指令提供后备文件try_files
。
让我们创建一个后备文件。
现在,让我们更新配置。
bash
events {}
http {
include /opt/homebrew/etc/nginx/mime.types;
server {
listen 8080;
root /Users/syfe/Desktop/tutorials/nginx-test/html;
location /animals {
root /Users/syfe/Desktop/tutorials/nginx-test/html;
try_files /animals/fallback.html /index.html =404;
}
}
}
现在,当用户访问时/animals
:
- 首先服务器会寻找
/animals/index.html
. - 如果不存在,它将寻找
/animals/fallback.html
. - 如果我们的后备文件丢失,它将尝试提供
index.html
根目录服务。 - 如果它找不到我们列出的任何文件,则会抛出 404 错误。
重定向
使用 NGINX 设置重定向非常容易。让我们更新配置以将所有传入流量重定向/birds
到/animals
。
bash
events {}
http {
include /opt/homebrew/etc/nginx/mime.types;
server {
listen 8080;
root /Users/syfe/Desktop/tutorials/nginx-test/html;
location /animals {
root /Users/syfe/Desktop/tutorials/nginx-test/html;
}
location /birds {
return 307 /animals;
}
}
}
返回就307
可以了。
反向代理
要将请求转发到另一台服务器,我们可以使用该proxy_pass
指令。
ini
events {}
http {
include /opt/homebrew/etc/nginx/mime.types;
server {
listen 8080;
location / {
proxy_pass http://192.168.10.5:8080;
}
}
}
现在,所有请求都localhost:8080
将转发到http://192.168.10.5:8080
。当您不想透露实际服务器或想要根据不同路径将请求中继到不同服务器时,这非常有用。
负载均衡
有时,在高流量情况下,我们可能会启动多个实例来处理负载。NGINX 可以充当负载均衡器,在所有实例之间均匀分配请求。
这可确保为我们的用户提供无缝体验,而不会造成任何停机。
让我们更新配置来实现这一点:
ini
events {}
http {
include /opt/homebrew/etc/nginx/mime.types;
upstream instances {
server 192.168.10.2:8080;
server 192.168.10.3:8080;
server 192.168.10.4:8080;
}
server {
listen 8080;
location / {
proxy_pass http://instances;
}
}
}
该upstream
块用于指定可以被引用的一组服务器proxy_pass
。NGINX 将自动均匀地分配请求。
log
凭借迄今为止所学到的所有知识,您将能够做很多很酷的事情。最后一件(也是重要的)对您的工作有帮助的事情是 - 日志记录。
让我们更新配置以在服务器上添加访问日志:
bash
events {}
http {
include /opt/homebrew/etc/nginx/mime.types;
log_format main '$remote_addr - $remote_user [$time_local] "$request" ';
access_log /Users/syfe/Desktop/tutorials/nginx-test/access.log main;
server {
listen 8080;
root /Users/syfe/Desktop/tutorials/nginx-test/html;
}
}
我们提供 using 指令的格式log_format
。该access_log
指令采用我们之前指定的存储日志的路径和格式。