基础知识
下载和安装
前言
Nginx是什么?
Nginx是一个高性能的HTTP和反向代理Web服务器nginx,在BSD-like协议xAI发行。其特点是占用内存少,并发能力强。
windows什么情况下需要nginx?
通常windows使用IIS就够用了,支持.NET、ASP、PHP等等。如果要做负载均衡就需要nginx,或者在一台windows 10电脑上要部署项目。
本篇环境
| 工具/环境 | 版本 |
|---|---|
| Windows | windows10 |
| Nginx | 1.18.0 |
下载
官方下载地址: https://nginx.org/en/download.html
下载nginx/Windows-1.18.0.zip
安装
下载后,将nginx-1.18.0.zip解压到电脑的任意盘符/ 路径中
nginx目录所在的路径不要有中文字符,也不建议有空格。
启动
使用cmd命令start命令启动nginx
cd nginx的解压目录
start nginx如果开启了windows防火墙,记得允许访问网络。
测试
方法一:启动成功后,浏览访问:localhost,即可看到nginx的默认欢迎页面。
方法二:curl localhost
配置
nginx配置文件说明
| 目录 | 说明 |
|---|---|
| conf | 存放nginx配置文件的目录 |
| docs | 存放nginx文档的目录 |
| html | 存放静态html文件的目录 |
| logs | 存放nginx日志的目录 |
| temp | 存放临时文件的目录 |
nginx的所有配置文件都在nginx根目录的conf目录下,nginx的核心配置文件就是conf目录里的nginx.conf文件。
我们的常用配置只需要在nginx.conf中调整server节点就可以了,在nginx.conf文件末尾。
nginx 80端口配置示例
server{
listen 80;
server_name 192.168.0.2;
location / {
root 项目
index index.html index.htm;
}
}配置验证
cd nginx的目录
nginx -s reload然后浏览器访问域名即可验证
Nginx常用命令说明
| 命令 | 说明 |
|---|---|
| start nginx | 启动nginx |
| taskkill /f /t /im nginx.exe | 彻底关闭nginx(关闭nginx其他服务,这样才能彻底关闭) |
| nginx -h | 查看帮助信息 |
| nginx -v | 查看nginx版本 |
| nginx -s stop | 停用nginx |
| nginx -s quit | 优雅的停用nginx(处理正在进行的请求后停用) |
| nginx -s reload | 重新加载配置,并优雅启动 |
| nginx -s reopen | 重启日志文件 |
taskkill是windows操作系统中的一个命令,允许你终止运行中的进程。下面是解释
taskkill这是命令自身/f这个选项强制终止进程,它会在不询问确认的情况xAI强制关闭指定的进程。/t这个选项指定的进程以及由它启动的任何子进程。- /im nginx.exe 这指定要终止的进程的映像名称,在这种情况下是
nginx.exe。
设置自动启动
将nginx.exe复制到C:\Windows\System32
打开命令提示符,运行以下命令
nginx -s install设置nginx对应前端项目
打开nginx配置文件:
nginx.conf找到
http块,并在其中添加以下内容nginxserver{ listen 80; server_name example.com; #替换为您的域名或者IP地址 root C:\nginx\html; #替换为您的vue项目dist文件夹路径 index index.html; location / { try_files $uri $uri/ /index.html; } }保存
nginx.conf文件。启动nginx
打开命令一是福,运行以下命令
shellstart nginx
设置nginx对应的后端项目
找到nginx配置文件:nginx.conf
找到http块,并在其中添加以下内容
nginxlocation / { proxy_pass http://127.0.0.1:8000; #后端接口 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; } location /static/ { alias /path/to/your/myproject/static/; } location /media/{ alias /path/to/your/myproject/media/; }
引擎(engine)
这个互联网世界上有一个神奇的引擎,可以把这个引擎放入服务器中,当它被放入服务器的时候,它就拥有了(Web服务器、负载均衡、API网管、DDOS防御、反向代理、Web应用防火墙、缓存)等功能。
查看版本
通过查看版本的命令保证当前操作的电脑上安装了Nginx。
nginx -v查看状态
通过查看状态的命令保证当前操作的电脑上的nginx的状态。
service nginx status当显示 nginx is running的时候,表示nginx正常运行中。也就表示着别人可以通过网址可以访问你的web服务器了。
重要备份
通过复制一份nginx目录下的nginx.conf,将原始的文件备份防止程序员修改错误。
mv nginx.conf nginx.conf.bak因为很多程序员都是要重写nginx.conf文件,所以先将原始文件备份一份。防止改错内容导致问题的发生。
修改后,再建立一个新的nginx.conf文件
touch nginx.conf编辑nginx.conf
刚建立完这个新的nginx.conf,那就开始编辑这个nginx.conf吧。
vim nginx.conf在nginx.conf文件里写入如下内容防止报错产生
events{}检查配置文件是否正确
nginx -t当输入完上面命令后,显示内容如下就是正确,否则就是错误。
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful正确之后,就进行重新加载配置文件的nginx。也可以称为重启
nginx -s reload搭建web服务
我们在nginx.conf文件中写了events,nginx不仅仅支持events,它还有http。我们可以把他们当成容器(箱子)。 在这个叫nginx.conf的房间里,有两个箱子events和http
在http盒子里有server盒子, 在server盒子里有listen工具,它负责监听端口。你可以把它想象成🎧耳机。那监听的端口号就是(0-65535)中间任意整数。
我们搭建web服务的规则(规定)就是80端口号或者443端口号。如果搭建的是HTTP的web服务,那就是80 。如果搭建的是HTTPS的web服务,那就是443。
在server盒子里有server_name工具,它负责绑定ip地址或者域名。ip地址就是127.0.0.1类似的东西,4组数字中间用点分隔就是ip地址。 域名就是www.xxx.com类似的东西。
在http盒子里可以有多个server盒子。
注意:工具所绑定数据后面要加上;,你可以认为是盒子里泡沫垫子。
# nginx.conf
events{}
http{
server{
listen 80;
server_name 127.0.0.1;
}
}每次修改完文件之后进行保存后,进行检查和重新加载
nginx -t && nginx -s reloadNginx不仅可以返回网站页面,还可以返回内容。示例如下
# nginx.conf
events{}
http{
server{
listen 80;
server_name 127.0.0.1;
return 200 "hello nginx";
}
}创建存放网页文件的文件夹/var/www/html/
mkdir /var/www/html/配置nginx.conf,使用root指定存放网页文件的文件夹。nginx会去这个文件夹里去找默认的网页文件(index.html)。如果你的网页文件名称不是index.html。要不指定文件名称,要不就把网页文件名称更改为index.html。
# nginx.conf
events{}
http{
server{
listen 80;
server_name 127.0.0.1;
root /var/www/html;
index.html hello.html;
}
}如果你放在/var/www/html/是hello.html那就需要指定。
配置nginx的类型
# nginx.conf
events{}
http{
include /etc/nginx/mime.typs;
server{
listen 80;
server_name 127.0.0.1;
root /var/www/html;
index.html hello.html;
}
}既然可以使用include来引入其他文件,我们就可以把配置拆分为多个文件。实际上Nginx配置文件夹里有一个conf.c文件夹,那我们就可以在nginx.conf文件中去引入conf.d文件夹里的多个以.conf结尾的文件。
# nginx.conf
events{}
http{
include /etc/nginx/mime.typs;
include /etc/nginx/conf.d/*.conf;
server{
listen 80;
server_name 127.0.0.1;
root /var/www/html;
index.html hello.html;
}
}我们就只需要去conf.d文件夹配置项目的.conf文件。
定义路径
使用location可以更好的定义路径
# conf.d/default.conf
server{
listen 80;
server_name localhost;
location /{
root /var/www/html;
}
}或者
# conf.d/default.conf
server{
listen 80;
server_name localhost;
location /app{
root /var/www/html;
}
}但是使用location工具(指令)时候,虽然我们告诉了Nginx留意lcoalhost/app这个请求,但是/var/www/html文件夹里并没有app文件夹。所以在访问的时候会导致404 Not Found。location工具(指令)不仅要匹配URI,还要匹配对应路径的文件。
解释:
如果我们使用location工具后面写 /app ,Nginx就会在根路径下找有没有app这个文件。nginx是认为app是个文件。
URL和文件路径完全匹配
# conf.d/default.conf
server{
listen 80;
server_name localhost;
location = /app/index.html {
root /var/www/html;
}
}location使用正则匹配模式
使用location工具(指令)参数配合。限制web服务器(N)
# conf.d/default.conf
server{
listen 80;
server_name localhost;
location ~ /videos/video[6-9].avi{
root /var/www/html;
}
}- 假设的是我的/videos/文件夹里面有多个以 video开头的文件,但是我只想分享6-9的视频。
- 但是使用 "~"会区分大小写,需要在 "~"后面加上 "*"号表示不区分大小写。
- ~*是不区分大小写的
- = 精确
- ^~优先前缀
- ~和~*正则
- 空格 普通前缀
临时重定向
经常需要把匹配到的URI进行临时重定向的操作
location /temp {
return 307 /app/index.html;
}不过临时重定向是会让用户觉察到的。为了让重定向的过程更加丝滑。
那就可以使用rewrite指令来进行重写,将一个路径更改为另一个路径。(这只适合单个文件)
# conf.d/default.conf
server{
listen 80;
server_name localhost;
root /var/www/html;
rewrite /temp /app/index.html;
}适合多个文件的,那就使用try_files结合$uri变量来使用。
# conf.d/default.conf
server{
listen 80;
server_name localhost;
root /var/www/localhost;
index index.html;
location /{
try_files $uri $uri/ =404;
}
}反向代理
使用proxy_pass做反向代理操作,访问指定的路径就会去指定端口运行的项目。
实际上可以使用不同的server_name反向代理到不同的后端
# conf.d/default.conf
server{
listen 80;
server_name localhost;
root /var/www/localhost;
index index.html;
location /app1{
proxy_pass http://localhost:3000;
}
location /app2{
proxy_pass http://localhost:3001;
}
}负载均衡
场景:网站访问增多,就需要增加服务器进行分流
upstream需要设置在http里面,给上游服务器设置名称,例如:backend-servers。
然后在里面写入可以调配的服务器,接着我们在location工具(指令)里使用proxy_pass。并且把域名指向上面的上游服务器的名称,其实就是告诉Nginx把流量导到指定的服务器集群。然后通过负载均衡分配到集群的服务器。
验证:我们可以使用浏览器的刷新功能来验证是否被分配到不同的机器 。Nginx会进行分配流量,因为现实中的服务器的性能配置可能不太一样,因此我们必须要把更多的流量分配给高配置的服务器,低配置的服务器则分担少一点的流量。
我们可以设置weight,并且自定义数值。weight数值分配越大,被分配的次数就会相对越多。
upstream工具的功能是上游服务器地址
http{
upstream backend-serves{
server localhost:3000 weight 1;
server localhost:3001 weight 2;
}
server{
listen 80;
server_name localhost;
}
}