nginx学习总结(代码片段)

AC_Jobim AC_Jobim     2022-12-17     192

关键词:

一、Nginx介绍

  • Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。其特点是占有内存少,并发能力强。

Nginx 作为 web 服务器

  • Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php 等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发, 性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高 达 50,000 个并发连接数。

正向代理

  • Nginx 不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

反向代理

  • 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问
  • 我们只 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器 地址,隐藏了真实服务器 IP 地址。

负载均衡

  • 增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的 情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
  • 客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
  • 当访问量很大时,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

动静分离

  • 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
//一键安装上面四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

二、nginx安装

安装nginx前需要确保linux上安装了gccPCREzlibOpenSSL

  • 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境。
  • PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:
  • zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
  • OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

1、安装依赖包

  1. 方法一:

    1. 安装 opensslzlibgcc 依赖
      yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel
      
    2. 安装pcre

    解压文件, 进入pcre目录

    执行configure文件

    执行命令: make && make install

    pcre安装成功,查看版本

  2. 方法二:(推荐)

    //一键安装上面四个依赖
    yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
    

2、安装nginx

  1. 解压文件
  2. 使用./configure 执行configure 文件
  3. 执行命令: make && make install

3、运行nginx

安装完nginx后,会在 路径/usr/local下自动生成 nginx 文件夹。这是自动生成的

进入sbin目录通过./nginx命令启动nginx服务

4、防火墙问题

  • 在 windows 系统中访问 linux 中 nginx,默认不能访问的,因为防火墙问题

  • 解决办法:1)关闭防火墙 (2)开放访问的端口号,80 端口

开放端口相关命令:

# 开启防火墙
service firewalld start
# 重启防火墙
service firewalld restart
# 关闭防火墙
service firewalld stop
# 查看防火墙规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload

开放80端口,并重启防火墙:


输入服务器ip:80,显示

三、nignx的常用命令和配置文件

3.1 常用命令

执行命令的前提条件,必须进入nginx下的/sbin的目录中

cd /usr/local/nginx/sbin
  1. 查看 nginx 的版本号

    ./nginx -v
    

  2. 启动 nginx

    ./nginx
    

  3. 关闭nginx

    ./nginx -s stop
    

  4. 重新加载 nginx

    ./nginx -s reload
    

3.2 配置文件

1、nginx 配置文件位置

cd /usr/local/nginx/conf/nginx.conf


精简之后的内容为:

worker_processes  1;

events 
    worker_connections  1024;


http 
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server 
        listen       80;
        server_name  localhost;

        location / 
            root   html;
            index  index.html index.htm;
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html 
            root   html;
        
    

nginx 配置文件可分为三部分:

第一部分:全局块

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

比如 worker_processes 1;处理并发数的配置

第二部分:events块

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

events 
    worker_connections  1024;

比如 worker_connections 1024;支持的最大连接数为 1024

第三部分:http块

http块又包括 http全局块、server 块。

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

  • server 块
    每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

    1. 全局 server 块
      最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
    2. location 块
      一个 server 块可以配置多个 location 块。
      这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。 地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

四、Nginx 反向代理

4.1 准备工作,安装tomcat

  1. tomcat 安装文件放到 liunx 系统中,解压

  2. 对外开放访问的端口

    firewall-cmd --add-port=8080/tcp --permanent # 开放8080端口
    firewall-cmd –reload
    
  3. 开启tomcat,在bin目录下,使用 命令:./startup.sh

4.2 配置实例一

实现效果: 打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到 liunx 系统 tomcat 主页 面中

  • 访问过程的分析:
  1. 在 windows 系统的 host 文件进行域名和 ip 对应关系的配置

    在host文件中添加下面内容:

  2. 在nginx进行请求转发的配置(反向代理配置)

  3. 访问域名为 www.123.com,结果:

4.3 配置实例二

实现效果:

使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中,nginx 监听端口为 9001
访问 http://192.168.2.4:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 http:// 192.168.2.4:9001/vod/ 直接跳转到 127.0.0.1:8081

  1. 准备两个tomcat服务器(一个8080端口,一个8081端口)和测试页面

    1. /usr/src目录下新建tomcat8080和tomcat8081两个文件夹,用来存放两个tomcat

    2. 准备测试页面,写一个a.html页面

      tomcat8080的tomcat,放到目录 /webapp/vod 下,内容:

      <h1>8080!!!</h1>
      

      tomcat8081的tomcat,放到目录 /webapp/edu下,内容:

      <h1>8081!!!</h1>
      
  2. 修改 nginx 的配置文件

    在 http 块中添加 server

  3. 测试结果


**location 指令说明:**该指令用于匹配 URL

使用语法:

location [ = | ~ | ~* | ^~ ] uri 

  1. = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。
  2. ~:用于表示 uri 包含正则表达式,并且区分大小写。
  3. ~*:用于表示 uri 包含正则表达式,并且不区分大小写。
  4. ^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~*标识。

五、负载均衡

5.1 负载均衡配置实例

实现效果:
浏览器地址栏输入地址 http://192.168.2.4/edu/a.html,负载均衡效果,平均到两个tomcat服务器中(一个8080,一个8081)

  1. 准备两台 tomcat 服务器
    在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建页面 a.html,用于测试。
8080tomcat  =====>>  a.html内容为8080!!!
8081tomcat  =====>>  a.html内容为8081!!!
  1. 在 nginx 的配置文件中进行负载均衡的配置

  1. 测试urlhttp://192.168.2.4/edu/a.html

5.2 nginx分配服务器策略

负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。而且 Nginx 提供了几种分配方式(策略):

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

2、weight

weight代表权重, 默认为 1,权重越高被分配的客户端越多

upstream myserver 
    server 208.208.128.122:8081 weight=10;   # 指定权重
    server 208.208.128.122:8082 weight=10;

server 
    listen       80;
    server_name  208.208.128.122;
    location / 
        root   html;
        proxy_pass   http://myserver;
        index  index.html index.htm;

3、ip_hash

ip_hash每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题

upstream myserver 
	ip_hash;							// 指定为ip_hash的方式
    server 208.208.128.122:8081 ;   
    server 208.208.128.122:8082 ;

server 
    listen       80;
    server_name  208.208.128.122;
    location / 
        root   html;
        proxy_pass   http://myserver;
        index  index.html index.htm;

4、fair(第三方)
fair(第三方),按后端服务器的响应时间来分配请求,响应时间短的优先分配

upstream myserver 					
    server 208.208.128.122:8081 ;   
    server 208.208.128.122:8082 ;
    fair; 														#  指定为fair方式

server 
    listen       80;
    server_name  208.208.128.122;
    location / 
        root   html;
        proxy_pass   http://myserver;
        index  index.html index.htm;

六、Nginx动静分离配置实例

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:

  • 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
  • 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资 源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送 一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。

实现:通过nginx处理静态资源

  1. 在Linux 系统中准备 静态资源,用于进行访问。


    www文件夹中 a.html

    <h1>test html!!!</h1>
    
  2. 在 nginx配置文件中进行配置

  3. 测试

    1. 在浏览器地址栏输入地址http://192.168.2.4/www/a.html

    2. 浏览器中输入地址http://192.168.2.4/image/01.jpg

      ·3. 在浏览器中输入地址http://192.168.2.4/image/列出了文件的目录

七、Nginx的高可用集群

为了防止当Nginx代理服务器挂掉了后面的服务就都没有办法访问了。所有就引出了高可用集群。下面的实例将配置一主一从的高可用集群

  1. 配置高可用的准备工作

    1. 需要两台服务器 192.168.2.4 和 120.53.17.250,并在两台服务器安装 nginx

    2. 在台服务器安装keepalived

      使用yum命令进行安装

      yum install keepalived -y
      # 查看版本:
      rpm -q -a keepalived
      



      安装之后,在 etc 里面生成目录 keepalived,有文件 keepalived.conf

  2. 配置文件(两台服务器都得改)

    1. 修改/etc/keepalived/keepalivec.conf配置文件,主从模式主要在这个文件里配置。

      global_defs  
         notification_email  
           acassen@firewall.loc 
           failover@firewall.loc 
           sysadmin@firewall.loc 
          
         notification_email_from Alexandre.Cassen@firewall.loc 
         smtp_server 192.168.2.4
         smtp_connect_timeout 30 
         # 通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL
         router_id LVS_DEVEL 
       
        
      vrrp_script chk_http_port  
        
         script "/usr/local/src/nginx_check.sh" #用于检测的脚本文件所在位置
         
         interval 2      #(检测脚本执行的间隔) 
        
         weight 2 
        
       
        
      vrrp_instance VI_1      
      	state BACKUP   # 备份服务器上将 MASTER 改为 BACKUP       
      	interface docker0  # 绑定的网卡     
      	virtual_router_id 51   # 主、备机的 virtual_router_id 必须相同     
      	priority 90     # 主、备机取不同的优先级,主机值较大,备份机值较小 
          advert_int 1    # 每隔一秒发送一次心跳,确保从服务器是否还活着
          authentication  
              auth_type PASS  # 心跳检测需要的密码
              auth_pass 1111 
           
          virtual_ipaddress          
      		192.168.2.50 // VRRP H 虚拟地址 
           
      
      
    2. /usr/local/src添加检测脚本nginx_check.sh

      #!/bin/bash
      A=`ps -C nginx –no-header |wc -l`
      if [ $A -eq 0 ];then
          /usr/local/nginx/sbin/nginx
          sleep 2
          if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
              killall keepalived
          fi
      fi
      
  3. 把两台服务器上 nginx 和 keepalived 启动

    • 启动 nginx:./nginx
    • 启动 keepalived:systemctl start keepalived.service
  4. 测试

    1. 在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50
    2. 把主服务器(192.168.2.4)nginx 和 keepalived 停止,再输入192.168.17.50

      结果:关闭之后仍然可以访问

八、Nginx执行原理

1、mater 和 worker

Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程

过来的请求由master管理,worker进行争抢式的方式去获取请求。

2、master-workers 的机制的好处

  • 首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销, 同时在编程以及问题查找时,也会方便很多。
  • 可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作
  • 其次,采用独立的进程,可以让互相之间不会 影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当 前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

3、设置多少个 worker

Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进 程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话 下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的

4、连接数 worker_connection

这个值是表示每个worker进程所能建立连接的最大值,所以一个nginx 能建立的最大连接数,应该是worker_connections * worker_processes

而所支持的最大并发数为:

  • 普通的静态访问最大并发数是: worker_connections * worker_processes /2,
  • 而如果是 HTTP 作为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。

注意:发送请求,占用了 woker 2个或者4个链接数(静态资源2个, HTTP 作为反向代理则为4个)

参考博客:nginx学习,看这一篇就够了

nginx报错总结(代码片段)

nginx报异常"/usr/local/nginx/logs/nginx.pid"failed(2:Nosuchfileordirectory)处理方法需要停止或者重启nginx的命令如下/usr/local/nginx/sbin/nginx-sstop/usr/local/nginx/sbin/nginx-sreload发现报以下错误:nginx:[error]open()"/usr/local 查看详情

04.nginx使用(代码片段)

博客为日常工作学习积累总结:1.安装依赖包      安装pcre:yuminstallpcrepcre-devel-y          安装openssl:yuminstallopensslopenssl-devel-y          检查安装包:rpm-qapcrepc 查看详情

nginx总结(代码片段)

Nginx总结-1.前言之前一直咕掉了,这次把许多优质内容总结下,许多来自其他大佬的文章,底部有文章链接。反向代理负载均衡动静分离0.基本介绍1.Web服务器:相比Apache,Nginx使用更少的资源,支持更多的并发... 查看详情

nginx漏洞总结(代码片段)

Nginx简介Nginx(enginex)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日&... 查看详情

(最全篇)nginx.conf配置文件详解(代码片段)

...c;崇尚开源,乐于分享的【皮卡丘的猫】 最近一直在学习nginx,总结了一下学习笔记,与大家分享一下。nginx.conf配置结构如下图所示默认的nginx.conf配置文件如下#usernobody;worker_processes1;#error_loglogs/error.lo 查看详情

nginx最全操作总结(代码片段)

作者:chrootliu,腾讯QQ音乐前端开发工程师本文将会从:安装->全局配置->常用的各种配置来书写,其中常用配置写的炒鸡详细,需要的童鞋可以直接滑倒相应的位置查看。查看nginx的文件列表,可以发现里面有一个auto的目录... 查看详情

nginx常见问题总结(代码片段)

Nginx常见问题一、nginx多server优先级在开始处理一个http请求时,nginx会取出header头中的Host变量,与nginx.conf中的每个server_name进行匹配,以此决定到底由哪一个server来处理这个请求,但nginx如何配置多个相同的server_na... 查看详情

mybatis学习总结(代码片段)

 根据bilibili https://www.bilibili.com/video/av17774929/ 视频学习总结 1.mybatis学习线路 2.元素JDBC存在的问题原生JDBC代码packagedal;importjava.io.File;importjava.io.FileInputStream;importjava.sql.Con 查看详情

(总结)nginx配置文件nginx.conf中文详解(代码片段)

PS:Nginx使用有两三年了,现在经常碰到有新用户问一些很基本的问题,我也没时间一一回答,今天下午花了点时间,结合自己的使用经验,把Nginx的主要配置参数说明分享一下,也参考了一些网络的内容,这篇是目前最完整的Ngi... 查看详情

nginx总结(代码片段)

1、简介    Nginx是高性能的HTTP和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达50,000个并发连接数。    其主要功能为:正向代理、反向代理、负载均衡以及动静分... 查看详情

docker基础命令总结(代码片段)

dockerinfo显示docker详细信息dockerpullbusybox拉取镜像dockerpullnginxdockerimagesnginx查看正在运行的镜像dockerrun--namenginx01-d-p8099:80nginx用nginx镜像启动一个容器,命名为nginx01并映射了8099端口这样我们就可以直接访问nginx了:firefox127.0.0.1:8099... 查看详情

mybatis学习总结(代码片段)

1Mybatis入门1.1单独使用jdbc编程问题总结1.1.1jdbc程序publicstaticvoidmain(String[]args)Connectionconnection=null;PreparedStatementpreparedStatement=null;ResultSetresultSet=null;try//加载数据库驱动Class.forName("com.mysql 查看详情

nginx学习总结

2017年2月23日,星期四Nginx学习总结  Nginx是目前比较主流的HTTP反向代理服务器(其企业版提供了基于TCP层的反向代理插件),对于构建大型分布式web应用,具有举足轻重的作用。简单来说,nginx有2个主要的功能:动/静态资... 查看详情

十分钟学习nginx(代码片段)

启动nginx重启nginx-sreopen停止nginx-sstop热加载./nginx-sreload测试修改配置文件是否正常nginx-t默认配置文件位置/usr/local/nginx/conf/调整Nginx基本配置/usr/local/nginx/conf/nginx.conf自定义的Nginx配置放到哪里/usr/local/nginx/servers也可以自定义只要... 查看详情

[学习总结]python语言学习总结(代码片段)

用py也很久了,很多东西只知道拿来用,并没有深究,感觉这样是不够的。我决定写这么一篇总结,把很多遗忘的东西拾起来,把很多没搞懂的东西搞清楚。1.eval函数用法:eval(expression,globals=None,locals=None)解释:将字符串str当成... 查看详情

课程学习总结报告(代码片段)

课程学习总结报告目录课程学习总结报告一.准备二.学习过程ILinux内核II进程管理1进程的数据结构分析2进程创建3进程调度4数据结构:栈5进程的生命周期可以通过如下的图进行一个总结:III存储器管理IV文件系统V设备驱动程序三... 查看详情

半监督学习总结(代码片段)

半监督学习Semi-supervisedLearning简介半监督深度学习无标签数据预训练,有标签数据微调利用从网络得到的深度特征来做半监督算法MakeNetworkworkinsemi-supervisedfashionPseudo-Label:TheSimpleandEfficientSemi-SupervisedLearningMethodforDeepNeuralNetwor 查看详情

半监督学习总结(代码片段)

半监督学习Semi-supervisedLearning简介半监督深度学习无标签数据预训练,有标签数据微调利用从网络得到的深度特征来做半监督算法MakeNetworkworkinsemi-supervisedfashionPseudo-Label:TheSimpleandEfficientSemi-SupervisedLearningMethodforDeepNeuralNetwor 查看详情