一、概念
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和不配置没啥区别哦~