Skip to content

基础知识

下载和安装

前言

Nginx是什么?

Nginx是一个高性能的HTTP和反向代理Web服务器nginx,在BSD-like协议xAI发行。其特点是占用内存少,并发能力强。

windows什么情况下需要nginx?

通常windows使用IIS就够用了,支持.NET、ASP、PHP等等。如果要做负载均衡就需要nginx,或者在一台windows 10电脑上要部署项目。

本篇环境

工具/环境版本
Windowswindows10
Nginx1.18.0

下载

官方下载地址: https://nginx.org/en/download.html

下载nginx/Windows-1.18.0.zip

安装

下载后,将nginx-1.18.0.zip解压到电脑的任意盘符/ 路径中

nginx目录所在的路径不要有中文字符,也不建议有空格。

启动

使用cmd命令start命令启动nginx

shell
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端口配置示例

nginx
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重启日志文件

taskkillwindows操作系统中的一个命令,允许你终止运行中的进程。下面是解释

  • taskkill这是命令自身
  • /f这个选项强制终止进程,它会在不询问确认的情况xAI强制关闭指定的进程。
  • /t这个选项指定的进程以及由它启动的任何子进程。
  • /im nginx.exe 这指定要终止的进程的映像名称,在这种情况下是nginx.exe

设置自动启动

nginx.exe复制到C:\Windows\System32

打开命令提示符,运行以下命令

shell
nginx -s install

设置nginx对应前端项目

  1. 打开nginx配置文件:nginx.conf

  2. 找到http块,并在其中添加以下内容

    nginx
    server{
        listen 80;
        server_name example.com; #替换为您的域名或者IP地址
        root C:\nginx\html; #替换为您的vue项目dist文件夹路径
        index index.html;
        location / {
            try_files $uri $uri/ /index.html;
        }
    }
  3. 保存nginx.conf文件。

  4. 启动nginx

    1. 打开命令一是福,运行以下命令

      shell
      start nginx

设置nginx对应的后端项目

  1. 找到nginx配置文件:nginx.conf

  2. 找到http块,并在其中添加以下内容

    nginx
    location / {
        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。

shell
nginx -v

查看状态

通过查看状态的命令保证当前操作的电脑上的nginx的状态。

shell
service nginx status

当显示 nginx is running的时候,表示nginx正常运行中。也就表示着别人可以通过网址可以访问你的web服务器了。

重要备份

通过复制一份nginx目录下的nginx.conf,将原始的文件备份防止程序员修改错误。

shell
mv nginx.conf nginx.conf.bak

因为很多程序员都是要重写nginx.conf文件,所以先将原始文件备份一份。防止改错内容导致问题的发生。

修改后,再建立一个新的nginx.conf文件

shell
touch nginx.conf

编辑nginx.conf

刚建立完这个新的nginx.conf,那就开始编辑这个nginx.conf吧。

shell
vim nginx.conf

在nginx.conf文件里写入如下内容防止报错产生

nginx
events{}

检查配置文件是否正确

shell
nginx -t

当输入完上面命令后,显示内容如下就是正确,否则就是错误。

shell
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

正确之后,就进行重新加载配置文件的nginx。也可以称为重启

shell
nginx -s reload

搭建web服务

我们在nginx.conf文件中写了events,nginx不仅仅支持events,它还有http。我们可以把他们当成容器(箱子)。 在这个叫nginx.conf的房间里,有两个箱子eventshttp

http盒子里有server盒子, 在server盒子里有listen工具,它负责监听端口。你可以把它想象成🎧耳机。那监听的端口号就是(0-65535)中间任意整数。

我们搭建web服务的规则(规定)就是80端口号或者443端口号。如果搭建的是HTTPweb服务,那就是80 。如果搭建的是HTTPSweb服务,那就是443。

server盒子里有server_name工具,它负责绑定ip地址或者域名。ip地址就是127.0.0.1类似的东西,4组数字中间用点分隔就是ip地址。 域名就是www.xxx.com类似的东西。

http盒子里可以有多个server盒子。

注意:工具所绑定数据后面要加上;,你可以认为是盒子里泡沫垫子。

nginx
# nginx.conf
events{}
http{
  server{
    listen 80;
    server_name 127.0.0.1;
  }
}

每次修改完文件之后进行保存后,进行检查和重新加载

shell
nginx -t && nginx -s reload

Nginx不仅可以返回网站页面,还可以返回内容。示例如下

nginx
# nginx.conf	  
events{}
http{
  server{
    listen 80;
    server_name 127.0.0.1;
    return 200 "hello nginx";
  }
}

创建存放网页文件的文件夹/var/www/html/

shell
mkdir /var/www/html/

配置nginx.conf,使用root指定存放网页文件的文件夹。nginx会去这个文件夹里去找默认的网页文件(index.html)。如果你的网页文件名称不是index.html。要不指定文件名称,要不就把网页文件名称更改为index.html。

nginx
# 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
# 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
# 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可以更好的定义路径

nginx
# conf.d/default.conf

server{
  listen 80;
  server_name localhost;
  
  location /{
    root /var/www/html;
  }
}

或者

nginx
# 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和文件路径完全匹配

nginx
# conf.d/default.conf

server{
  listen 80;
  server_name localhost;
  
  location = /app/index.html {
    root /var/www/html;
  }
}

location使用正则匹配模式

使用location工具(指令)参数配合。限制web服务器(N)

nginx
# conf.d/default.conf

server{
  listen 80;
  server_name localhost;
  
  location ~ /videos/video[6-9].avi{
    root /var/www/html;
  }
}
  • 假设的是我的/videos/文件夹里面有多个以 video开头的文件,但是我只想分享6-9的视频。
  • 但是使用 "~"会区分大小写,需要在 "~"后面加上 "*"号表示不区分大小写。
  • ~*是不区分大小写的
  1. = 精确
  2. ^~优先前缀
  3. ~和~*正则
  4. 空格 普通前缀

临时重定向

经常需要把匹配到的URI进行临时重定向的操作

nginx
location /temp {
	return 307 /app/index.html;
}

不过临时重定向是会让用户觉察到的。为了让重定向的过程更加丝滑。

那就可以使用rewrite指令来进行重写,将一个路径更改为另一个路径。(这只适合单个文件)

nginx
# conf.d/default.conf

server{
  listen 80;
  server_name localhost;
 	root /var/www/html; 
  rewrite /temp /app/index.html;
}

适合多个文件的,那就使用try_files结合$uri变量来使用。

nginx
# 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反向代理到不同的后端

nginx
# 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工具的功能是上游服务器地址

nginx
http{
  upstream backend-serves{
    server localhost:3000 weight 1;
    server localhost:3001 weight 2;
  }
  server{
    listen 80;
    server_name localhost;
  }
}

Released under the MIT License.