欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

『Nginx』介绍、安装与配置使用

程序员文章站 2022-07-12 18:13:29
...

一、简介

Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,同时也提供了IMAP/POP3/SMTP服务。自从2004年发布以来nginx一直关注于高性能、高并发、低内存的使用,另外还有一些特色的Web服务器功能,如负载均衡、缓存、访问和带宽控制以及能够有效的与各种应用集成这些特点使得nginx成为现代网站架构中一个不错的选择。

二、安装

(一)、安装编译工具和相关库文件

$ yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

等待安装完毕即可

(二)、安装 PCRE

Nginx 中的 rewrite 模块需要 pcre 库。

pcre-8.44是目前最新版(2020.08.27)

1、下载安装包并解压

$ cd /usr/local/src/
$ wget https://netix.dl.sourceforge.net/project/pcre/pcre/8.44/pcre-8.44.tar.gz
$ tar zxv -f pcre-8.44.tar.gz

2、进入目录编译安装

$ cd pcre-8.44
$ ./configure
$ make && make install

3、检查是否成功(查看版本)

$ pcre-config --version

出现如图版本提示,即安装成功!

『Nginx』介绍、安装与配置使用

(三)、安装 Nginx

nginx-1.19.2是目前最新版本(2020.08.27)

1、下载安装包并解压

$ cd /usr/local/src/
$ wget http://nginx.org/download/nginx-1.19.2.tar.gz
$ tar zxv -f nginx-1.19.2.tar.gz

2、进入目录编译安装

$ cd nginx-1.19.2
$ ./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.44
$ make && make install

其中–prefix=/usr/local/webserver/nginx是配置安装目录(如果想安装在当前目录,可以省略)

而–with-pcre=/usr/local/src/pcre-8.44是指定上一步安装的pcre(路径要确认)

3、检查是否成功(查看版本)

$ /usr/local/webserver/nginx/sbin/nginx -v

出现如图版本提示,即安装成功!

『Nginx』介绍、安装与配置使用

(四)、启动Nginx

$ /usr/local/webserver/nginx/sbin/nginx

如下所示即成功启动!

『Nginx』介绍、安装与配置使用

这时我们可以通过本地浏览器访问 http://{服务器ip}:80,这时会出现如下文字:

『Nginx』介绍、安装与配置使用

三、Nginx主要功能

先来看看Nginx的配置文件:

$ vim /usr/local/webserver/nginx/conf/nginx.conf

『Nginx』介绍、安装与配置使用

如图所示,Nginx的配置文件大体可分为三部分:

  • 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组nginx进程pid存放路径日志存放路径配置文件引入允许生成worker process数等。

    默认只配置了worker process 1,这里指明了允许生成的进程数(默认为1),即可以处理并发的能力,但受硬件的约束。

  • events块:配置影响nginx服务器或与用户的网络连接。每个进程的最大连接数选取哪种事件驱动模型处理连接请求是否允许同时接受多个网路连接开启多个网络连接序列化等。

    默认只配置了worker_connections 1024,即指明了最大连接数(默认为1024),对Nginx性能影响较大,要灵活配置。

  • http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

    • server块:配置虚拟主机的相关参数,一个http中可以有多个server。
      • location块:配置请求的路由,以及各种页面的处理情况。

配置文件的其他详细信息可以到网上查阅。

(一)、反向代理

谈到反向代理,我们应该掌握正向代理与方向代理的区别,我先放出结论:

它们请求访问的方式是相似的,即都要通过代理服务器这个中间者进行请求,但两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端。

带着这个结论,再看看下面的图文分析,你就清楚了。

1、正向代理

我们平时常说的代理(懂的都懂),就是属于正向代理。

客户端访问远程服务器都是通过中间这个正向代理服务器间接访问的,所以远程服务器其实并不知道你是哪一个客户端,它接受的请求都是正向代理服务器发出的,也就是说,正向代理服务器隐藏了真实的请求客户端。响应返回时,也是返回给发出请求的正向代理服务器,并由这个正向代理服务器将响应转发到真正请求的客户端。

『Nginx』介绍、安装与配置使用

2、反向代理

Nginx就是反向代理服务器!

与正向代理相反,反向代理服务器隐藏了真实的服务器。客客户端访问的都是反向代理服务器的ip,但这台反向代理服务器之后可能会有多台服务器同时工作(客户端并不清楚,它只知道反向代理服务器的站点),反向代理服务器会帮我们把请求转发到真实的服务器那里去。服务器的响应返回也是通过反向代理服务器直接返回给客户端。

『Nginx』介绍、安装与配置使用

理解完正向代理和反向代理的区别,我们接下来看看如何在nginx中配置反向代理!!!

3、Nginx配置反向代理

这里只介绍一种最简单的Nginx反向代理设置:反向代理Tomcat的8080端口。

这里我们要修改Nginx配置文件中http块的server块,将server_name(监听地址)设置为自己服务器的ip地址,并将其中的location(请求的url过滤,图中的“/”为通配符)添加上一项proxy_pass(请求转向所定义的服务器列表)

『Nginx』介绍、安装与配置使用

保存退出后,记得重新加载Nginx(没启动的直接启动就好,命令如上文):

$ /usr/local/webserver/nginx/sbin/nginx -s reload

然后再次访问http://{服务器ip}:80,你会发现主页变成了Tomcat主页,即设置反向代理成功:

『Nginx』介绍、安装与配置使用

(二)、负载均衡

负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。

举个例子,为了提升网站的各方面能力,我们一般会把多台服务器组成一个集群对外提供服务。然而,我们的网站对外提供的访问入口(网址)都是一个的,比如www.baidu.com(即上文的反向代理)。

当多个客户端发送请求的时候,Nginx(既为反向代理服务器,又是负载均衡器)会均衡地把这些请求分配到多台服务器上,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。

『Nginx』介绍、安装与配置使用

Nginx配置负载均衡

同样,只举最简单的例子

这里,我们要先配置服务器集群的地址和端口,在http块中添加一项upstream(其中myserver为自定义名字,为了让下面的proxy_pass能够转发到这),一项server为一台服务器(当然也可以配置成一台服务器的不同端口),当然这里为了演示,ip和端口都是瞎写的。

upstream可以设置分配方式,轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉(宕机)后,能自动剔除。

下图即是按照默认配置。其他分配方式的配置可以上网搜索。

上面可以看作是负载均衡的配置,为了让其发挥作用,我们还要配置反向代理(与上面的反向代理设置相似),唯一不同的就是proxy_pass,将其配置为http://加上upstream后面的名字。

『Nginx』介绍、安装与配置使用

保存退出后,记得重新加载Nginx,命令如上文(没启动的直接启动就好,命令同样如上文)

(三)、动静分离

  • 静态资源: 当用户多次访问这个资源,资源的源代码永远不会改变的资源(css、html、image)。
  • 动态资源:当用户多次访问这个资源,资源的源代码可能会发生改变(jsp、ftl、thymeleaf)。

问题:如果将静态资源与动态资源存放在同一台服务器上面。当静态资源过多时,每次获取静态资源,就会使我们的服务器速度变慢甚至崩溃,因为静态资源消耗过多的带宽。

动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。在这里我们只讨论将静态资源部署在Nginx服务器上的情况,更好的方案是直接将静态资源全部存放在CDN服务器上。

『Nginx』介绍、安装与配置使用

Nginx配置动静分离

同样是最简单的例子

先在本地的/data目录加入icon目录和image目录(即/data/icon和/data/image),这是为了统一存放静态资源

其中我在icon目录下放置了html静态文件,在image目录下放置了图片等静态文件。

上文我们说过,location后面是通配符,因此当访问地址是http://{服务器ip}:80/icon/xx.html时,将会匹配到/data/icon目录下的xx.html文件。

『Nginx』介绍、安装与配置使用

在第二个location,有这样几个参数:

  • autoindex:目录浏览功能(on开启,off关闭),目录浏览功能如图(来自清华大学开源软件镜像站)

    只有上面这个参数开启了,下面这些参数才有效

  • autoindex_exact_size

    • 默认为on,显示出文件的确切大小,单位是bytes。
    • 改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
  • autoindex_localtime

    • 默认为off,显示的文件时间为GMT时间。
    • 改为on后,显示的文件时间为文件的服务器时间
  • charset utf-8:文件名中有中文时添加

『Nginx』介绍、安装与配置使用

配置文件保存退出后,记得重新加载Nginx,命令如上文(没启动的直接启动就好,命令同样如上文)

四、Nginx配置示例

该配置文件引用自:https://www.cnblogs.com/knowledgesea/p/5175711.html

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}