Nginx学习文档

目录

一、概念

1、含义

Nginx (engine x) 是一个高性能的Web服务器反向代理服务器

2、反向代理和正向代理

  • 反向代理:我们不知道代理服务器后面的目的服务器;比如:我想去访问谷歌官网,但是国内环境无法访问,这个时候我可以通过一个代理服务器去做到
    在这里插入图片描述

  • 正向代理:我们知道代理服务器后面的目的服务器;比如:我直接访问代理服务器获取服务,但是我不知道代理服务器后面的真实服务器信息,例如nginx
    在这里插入图片描述

3、特点

Nginx 特点是占有内存少并发处理能力强,以高性能、系统资源低消耗而闻名,Nginx官方测试为5万并发请求

二、安装、启动、关闭

1、Linux

1.1、安装

1.1.1、准备工作

安装Nginx需要Linux先安装相关的几个库,否则配置和编译会出现错误

# 解释一下,下面命令可以一次性安装所需库,其中-y是只要询问是否确认就是确认yes,安装完成之后会出现complete,
# 下面介绍一下这几个库;
# gcc编译器:gcc
# openssl库:openssl openssl-devel
# pcre库:pcre pcre-devel
# zlib库:zlib zlib-devel
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
1.1.2、正式安装
1.1.2.1、下载nginx安装包

访问nginx官网下载地址,然后下载合适的版本,包括Windows或者Linux版本

在这里插入图片描述

1.1.2.2、将安装包上传到Linux系统中
1.1.2.3、解压压缩包
# 命令
tar -zxvf 压缩包名称

# 示例
tar -zxvf nginx-1.24.0.tar.gz
1.1.2.4、进入nginx解压目录
# 命令
cd nginx解压目录名称

# 示例
cd nginx-1.24.0
1.1.2.5、执行配置命令(依旧在nginx解压目录执行)
# 命令
# 解释:--prefix是指定nginx安装路径
./configure --prefix=nginx安装目录

# 示例
./configure --prefix=/usr/local/nginx
1.1.2.6、执行编译命令(依旧在nginx解压目录执行)
make
1.1.2.7、执行安装命令(依旧在nginx解压目录执行)
make install

1.2、启动

# 1、切换到nginx安装目录的sbin目录下,执行如下命令(默认使用和sbin目录同级目录conf下面的nginx.conf配置文件):
./nginx

# 2、切换到nginx安装目录的sbin目录下,执行如下命令(指定所使用的配置文件,可以用原始的,也可以用其他的):
./nginx -c /usr/local/nginx/conf/nginx.conf

# 3、在任何地方执行如下命令(前面是nginx工具,后面是使用的配置文件,这种启动方式必须指定具体配置文件):
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

# 4、检查nginx是否启动
# 说明:
# nginx 体系结构由 master 进程和其 worker 进程组成
# master 进程读取配置文件,并维护 worker 进程,而 worker 进程则对请求进行实际处理。
ps -ef | grep nginx

1.3、关闭

# 1、优雅关闭Nginx
# 找出nginx的进程号:
ps -ef | grep nginx
# 执行关闭命令:
# 解释:其中pid是主进程号的pid(master process),其他为子进程pid(worker process)
kill -QUIT 主pid

# 2、快速关闭Nginx
# 找出nginx的进程号:
ps -ef | grep nginx
# 执行关闭命令:
# 解释:其中pid是主进程号的pid(master process),其他为子进程pid(worker process)
kill -TERM 主pid

1.4、重启

# 切换到nginx安装目录的sbin目录下,执行如下命令(默认使用和sbin目录同级目录conf下面的nginx.conf配置文件):
./nginx -s reload

1.5、配置检查

# 最前面是nginx命令的全路径,-c后面是配置文件全路径,最后加上-t
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t

1.6、查看版本

# 1、-V (大写的V)显示 nginx 的版本、编译器版本和配置参数(最前面是nginx命令的全路径)
/usr/local/nginx/sbin/nginx -V

# 2、-v (小写的v)显示 nginx 的版本(最前面是nginx命令的全路径)
/usr/local/nginx/sbin/nginx -v

2、Windows

2.1、安装

访问nginx官网下载地址,然后下载合适的版本,包括Windows或者Linux版本,然后解压即可

在这里插入图片描述

2.2、启动

# 方式1、双击解压目录下的nginx.exe文件即可运行nginx

# 方式2:进入dos窗口,切换到nginx主目录下,在dos窗口执行命令:start nginx

2.3、关闭

在资源管理器杀掉Nginx进程(有两个进程),具体操作可见:windows操作系统下nginx的开启和关闭

三、配置文件内容

1、全局块:配置服务器整体运行的配置指令

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

比如上面第一行配置的:
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约,建议worker 数和服务器的 cpu 数相等是最为适宜的

在这里插入图片描述

2、events 块:影响 Nginx 服务器与用户的网络连接

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 wordprocess 可以同时支持的最大连接数等。

上述例子就表示每个 work process 支持的最大连接数为 1024.

这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

在这里插入图片描述

3、http 块

这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

需要注意的是:http 块也可以包括 http 全局块、server 块。

在这里插入图片描述

3.1、http 全局块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

在这里插入图片描述

3.2、server 块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。

而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

在这里插入图片描述

3.2.1、全局 server 块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

3.2.2、location 块

一个 server 块可以配置多个 location 块。

这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称

(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

四、应用场景

1、静态网站

1.1、作用

Nginx是一个HTTP的web服务器,可以将服务器上的静态文件(如HTML、图片等)通过HTTP协议返回给浏览器客户端

1.2、配置方式

修改配置文件nginx.conf

server {  
    listen 80; # 监听端口号  
    location / {  
        root /opt/www/; #静态文件全路径
    }  
}

1.3、访问说明

1、在浏览器访问http://192.168.92.128:80/相当于访问/opt/www/(linux目录)
2、在浏览器访问http://192.168.92.128:80/ace相当于访问/opt/www/ace(linux目录)
说明:这种配置方式来说,ip+port就相当于root指向的全路径

1.4、拓展

location后面不仅可以跟/,还可以跟其他内容,比如:

在这里插入图片描述

root指定静态文件所在路径,此时ip+port+/ace就相当于root指向的全路径/opt/static

index指代默认首页地址,在链接最后加上/会默认访问index.html或者index.htm页面

2、负载均衡

2.1、作用

在网站创立初期,我们一般都使用单台机器对外提供集中式服务。但是随着业务量的增大,我们一台服务器不够用,此时就会把多台机器组成一个集群对外提供服务。但是,我们网站对外提供的访问入口通常只有一个,比如 www.web.com。那么当用户在浏览器输入www.web.com进行访问的时候,如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡要做的事情。

负载均衡通常是指将请求"均匀"分摊到集群中多个服务器节点上执行,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀。

在这里插入图片描述

2.2、实现方式

2.2.1、硬件负载均衡

比如 F5、深信服、Array 等。

优点:厂商有专业的技术服务团队提供支持,性能稳定

缺点:费用昂贵,对于规模较小的网络应用成本太高

2.2.2、软件负载均衡

比如 Nginx、LVS、HAProxy 等

优点:免费开源,成本低廉

2.3、配置方式

步骤1: 在server模块里添加如下内容(举例):

location /myweb {
	proxy_pass http://www.myweb.com;
}

步骤2: 在http模块加上如下内容(举例):

# 上面proxy_pass后面的 www.myweb.com 字符串要和 upstream 后面的字符串相等(只是要求相等,不在意具体值),然后才能进行负载均衡
# 比如 9100 和 9200 端口指向的是两个Tomcat服务器
upstream www.myweb.com { 
	server  127.0.0.1:9100; 
	server  127.0.0.1:9200;  
} 

2.4、负载均衡策略

2.4.1、概念

upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器;

2.4.2、负载均衡前提配置

配置以下策略之前,需要先在server模块里添加如下内容(举例),其中proxy_pass后面的 backserver 字符串要和 下面各种负载均衡策略写法中 upstream 后面的字符串相等(只是要求相等,不在意具体值),然后才能进行负载均衡

location /myweb {
	proxy_pass http://backserver;
}
2.4.3、轮询(默认方式)
# 效果:每个请求轮流分配到不同的后端服务器,如果后端服务器down掉,将自动剔除;

# 示例:
upstream backserver { 
    server 127.0.0.1:8080; 
    server 127.0.0.1:9090; 
} 
2.4.4、权重
# 效果:每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况

# 示例:
upstream backserver { 
    server 192.168.0.14 weight=5; 
    server 192.168.0.15 weight=2; 
} 
2.4.5、ip_hash
# 效果:ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题;

# 示例:
upstream backserver { 
    ip_hash; 
    server 127.0.0.1:8080; 
    server 127.0.0.1:9090; 
}
2.4.6、最少连接
# 效果:web请求会被转发到连接数最少的服务器上

# 示例:
upstream backserver { 
    least_conn;
    server 127.0.0.1:8080; 
    server 127.0.0.1:9090; 
} 

2.5、其他配置

2.5.1、前提配置

配置以下策略之前,需要先在server模块里添加如下内容(举例),其中proxy_pass后面的 backserver 字符串要和 下面各种负载均衡策略写法中 upstream 后面的字符串相等(只是要求相等,不在意具体值),然后才能进行负载均衡

location /myweb {
	proxy_pass http://backserver;
}
2.5.2、backup
# 效果: 其它所有的非backup机器down的时候,才请求backup机器)

# 示例:
upstream backserver { 
    server 127.0.0.1:9100;
    server 127.0.0.1:9200 backup;
} 
2.5.3、down
# 效果:down表示当前的server是down状态,不参与负载均衡

# 示例:
upstream backserver { 
    server 127.0.0.1:9100;
    server 127.0.0.1:9200 down;
} 

3、静态代理

3.1、作用

把所有静态资源的访问改为访问nginx,而不是访问tomcat,因为nginx更擅长于静态资源的处理,性能更好,效率更高

在实际应用中,我们将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理;
在这里插入图片描述

3.2、配置方式

方式1(不推荐,所有文件直接放在某个目录下不太好):

通过在nginx.conf配置文件中添加静态资源的后缀名实现,比如:

#当访问静态资源,则从linux服务器/opt/static目录下获取(举例)
location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
        root /opt/static;
}

所有以js结尾的

方式2(推荐):

通过在nginx.conf配置文件中配置静态资源所在目录实现,比如:

location ~ .*/(css|js|img|images) {
      root   /opt/static;
}

3.3、正则匹配解释

根据下面例子来进行解释:

location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
        root /opt/static;
}
  • ~:表示正则匹配,也就是说后面的内容可以是正则表达式匹配
  • 点 . :表示任意字符
  • 问号 ? : 表示前面的字符是0次或者1次。‌
  • 加号 + :表示前面的字符可以重复一次或多次。‌
  • 星号 * :表示前面的字符可以重复零次或多次
  • \. :将点进行转义,表示普通的点
  • |:表示或者
  • $:表示结尾
  • ( ) :用于分组字符
  • []:匹配方括号内的任何字符,‌例如,‌[abc] 将匹配 a 或者 b 或者 c
  • [^]:匹配不在方括号内的任何字符,例如:[^abc]将不匹配a 或者 b 或者 c

3.4、注意事项

放置静态资源的目录,要注意一下目录权限问题,如果权限不足,需要给目录赋予权限

4、动静分离

4.1、作用

Nginx的负载均衡 和 静态代理 结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。

对于动态资源,例如jsp由tomcat或其他web服务器完成。

对于静态资源,例如图片、css、js等由nginx服务器完成。

动静分离充分利用了它们各自的优势,从而达到更高效合理的架构。

在这里插入图片描述

4.2、实现方案

最小的配置也需要启动一个用于负载均衡的nginx,启动一个用于静态代理的nginx,启动一个用于访问的tomcat,从而实现动静分离的效果

不过用于负载均衡和静态代理的nginx可以使用同一个,只是本次我们分开了而已

4.3、配置方式

负载均衡的Nginx配置:

步骤1: 在server模块里添加如下内容(举例):

upstream www.p2p.com { 
    server  127.0.0.1:9100 weight=5; 
    server  127.0.0.1:9200 weight=2;  
}
    
upstream static.p2p.com { 
    server  127.0.0.1:81 weight=1; 
    server  127.0.0.1:82 weight=1;  
}

步骤2: 在http模块加上如下内容(举例):

location /p2p {
    proxy_pass http://www.p2p.com;
}

location ~ .*/(css|js|img|images) {
    proxy_pass http://static.p2p.com;
}

静态代理的Nginx配置:

步骤3: 在http模块加上如下内容(举例):

location ~ .*/(css|js|img|images) {
    root /opt/static;
}

5、虚拟主机

5.1、作用

虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站;

Nginx提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以运行多个网站;

Nginx下,一个server标签就是一个虚拟主机;

nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可;

5.2、配置方式

前提准备:

由于这两种配置方式都涉及域名,所以我们需要提前修改一下浏览器所在机器的hosts文件,主要是添加域名和nginx的ip之间的映射关系,其中文件位置是:C:\Windows\System32\drivers\etc\hosts

我们可以这样配置,首先在hosts文件配置:192.168.208.128 www.myweb.com,其中192.168.208.128是nginx的ip地址,后面www.myweb.com是自定义域名,可以被nginx中server_name所匹配到,进而执行相关操作

在这里插入图片描述

针对基于域名的虚拟主机,这时候会有多个域名指向同一个nginx服务,所以我们需要在浏览器所在机器的hosts文件中指定多个域名,例如:192.168.208.128 www.shop.com www.p2p.com

在这里插入图片描述

5.2.1、基于端口的虚拟主机

实现方案:

基于端口的虚拟主机配置,使用端口来区分;浏览器使用 同一个域名+端口 或 同一个ip地址+端口访问;

修改nginx配置文件:

# 这里只写了location,其中对于proxy_pass指代的upstream值可以参考负载均衡中的写法
server {
    listen 8080;
    server_name www.myweb.com;
    location /myweb {
           proxy_pass http://www.myweb.com;
    }
}

server {
    listen 9090;
    server_name www.myweb.com;
    location /p2p {
           proxy_pass http://www.p2p.com;
    }
}
5.2.2、基于域名的虚拟主机

实现方案:

基于域名的虚拟主机是最常见的一种虚拟主机,做法就是域名一致,但是端口不一致

修改nginx配置文件:

# 这里只写了location,其中对于proxy_pass指代的upstream值可以参考负载均衡中的写法
server {
        listen       80;
        server_name  www.shop.com;
        location /myweb {
           proxy_pass http://www.shop.com;
        }
}

server {
        listen       80;
        server_name  www.p2p.com;
        location /myweb {
           proxy_pass http://www.p2p.com;
        }
}

五、知识点

1、通过include的方式引入繁多的server配置

针对http块中server块过多的情况,尤其是上面的虚拟主机这种情况,我们可以把部分server配置写在其他配置文件中,然后在http块中最后引入即可,比如:

我们将部分server配置信息写在/usr/local/nginx/conf/vhost/vhost.conf文件中,内容如下:

server {
	listen       80;
	server_name  beijing.myweb.com;
	location / {
		proxy_pass http://beijing.myweb.com;
	}
}

server {
	listen       80;
	server_name  nanjing.myweb.com;
	location / {
		proxy_pass http://nanjing.myweb.com;
	}
}

server {
	listen       80;
	server_name  tianjin.myweb.com;
	location / {
		proxy_pass http://tianjin.myweb.com;
	}
}

然后我们在nginx.conf中的http块最后加上这一句即可完成配置添加工作:

http {
……
include /usr/local/nginx/conf/vhost/vhost.conf;
}

示例如下:

在这里插入图片描述

2、nginx中http块中的server块中的server_name可以不配置吗?

nginx的server_name可以不配置。‌当Nginx配置中没有指定server_name时,‌Nginx会自动将其设置为空字符串(‌"")‌,‌这意味着它不会匹配任何域名。‌在这种情况下,‌Nginx会优先将HTTP请求交给其他server处理。‌如果其他server不处理该请求,‌Nginx会继续将请求交给该server处理。‌因此,‌即使不配置server_name,‌Nginx仍然能够处理HTTP请求,‌只是它不会根据域名进行匹配。

此外,‌当Nginx在某个端口收到一个HTTP请求时,‌它会交给监听该端口的server处理。‌如果监听该端口的server有多个,‌Nginx会根据请求头的Host与哪个server的域名(‌server_name)‌匹配来决定如何处理请求。‌如果没有匹配的域名,‌或者请求头的Host是IP地址,‌则Nginx会交给监听该端口的默认server处理。‌

虽然不配置server_name可以工作,‌但为了更好地管理和控制基于域名的请求路由,‌建议根据实际需求配置适当的server_name。

其中server_name写在配置文件中这个地方:
在这里插入图片描述

3、nginx中http块中的server块中的server_name可以配置成ip吗?

上面示例中基本配置的都是域名,其实server_name可以配置ip,但是配置ip和不配置没啥区别哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值