首页 > 系统相关 >nginx相关

nginx相关

时间:2024-09-09 11:04:15浏览次数:4  
标签:http server nginx proxy 相关 服务器 devel

Nginx工具

Web网络服务

我们平时访问的网站服务就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务。

web网络服务是被动的网络服务,通过网络传输资源,流程如下:

用户发起网络请求 --> 网络服务器接受到请求 --> 网络服务器取资源 --> 将资源通过http(超文本传输协议)和https(安全超文件传输协议)返回。
img

web服务器与web框架的关系

  1. web服务器:接受http/https请求,返回数据。
  2. web框架:开发web应用程序,处理得到的数据。

nginx是什么

优点:

  1. 开源
  2. 高性能,高并发
  3. 资源消耗少
  4. 可以做http反向代理
  5. 负载均衡
  6. 支持异步网络i/o事件模型epoll
  • Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。

nginx下载安装

  • 可以直接npm安装,这里介绍源码包安装
  1. 源码包下载

    摘一句话:淘宝网是开源软件的用户和受益者,我们也想成为开源软件的贡献者。这就是我们决定开源Tengine的原因。

    tengine:http://tengine.taobao.org/download/tengine.tar.gz、https://tengine.taobao.org/download/tengine-3.0.0.tar.gz

    nginx:http://hg.nginx.org/nginx.org/archive/tip.tar.gz

    官网:https://nginx.p2hp.com/en/download.html

    img

  2. 安装依赖:

    # 其中有一些重要的库:gcc、pcre(正则表达式库)、zlib、OpenSSL
    yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
    
    # ubuntu
    apt install openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev make
    

    img

  3. 释放Makefile

    ./configure --prefix=/opt/tengine12/
    

    img

  4. 编译安装

    make && make install 
    

    img

  5. 设置环境变量,并记一些常用命令
    img
    nginx #启动
    nginx -s stop #关闭
    nginx -s reload #重新加载

nginx目录结构

[root@iZ2vchdoid8iit383hsodtZ tengine12]# ls
client_body_temp  conf  fastcgi_temp  html  include  logs  modules  proxy_temp  sbin  scgi_temp  uwsgi_temp
  1. conf 存放nginx配置文件
  2. html 存放前端文件目录
  3. logs 存放nginx运行日志,错误日志
  4. sbin nginx执行脚本

nginx主要配置

参考文章:nginx配置

配置的位置处于conf当中的nginx.conf

# 核心配置模块
user nginx; # nginx进程所用的用户
worker_processes 1; # nginx占几个进程
error_log /var/log/nginx/error.log; # 错误日志在哪
pid /run/nginx.pid; # 进程生成的pid放哪

events # 事件模块

http # 内核模块

event模块:

    #事件模型:use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; 
    #epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。
    use epoll;

    #根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
    worker_connections 65535;

http模块:

    #文件扩展名与文件类型映射表,基本上不变
    include mime.types;
    # include /etc/nginx/conf.d/*.conf;  #包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件

    #日志格式设定
    #$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
    #$remote_user:用来记录客户端用户名称;
    #$time_local: 用来记录访问时间与时区;
    #$request: 用来记录请求的url与http协议;
    #$status: 用来记录请求状态;成功是200,
    #$body_bytes_sent :记录发送给客户端文件主体内容大小;
    #$http_referer:用来记录从那个页面链接访问过来的;
    #$http_user_agent:记录客户浏览器的相关信息;
    #通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
    log_format access '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';
        
    #定义本虚拟主机的访问日志
    access_log  /usr/local/nginx/logs/host.access.log  main;
    access_log  /usr/local/nginx/logs/host.access.404.log  log404;

    #开启限制IP连接数的时候需要使用
    #limit_zone crawler $binary_remote_addr 10m;
    #负载均衡配置
    upstream jh.w3cschool.cn {
        ......
    }
    # 虚拟主机,也就是服务配置(可以多个)
    server
    {
        #监听端口
        listen 80;

        #域名可以有多个,用空格隔开,ip或者localhost(本机地址)
        server_name www.w3cschool.cn w3cschool.cn;
        index index.html index.htm index.php;

        #对 "/" 启用反向代理
        location / {
            root   html; # 定义root根目录 
            index  index.html index.htm; # 主页

            proxy_pass http://127.0.0.1:88;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
             
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             
            #以下是一些反向代理的配置,可选。
            proxy_set_header Host $host;

            #允许客户端请求的最大单文件字节数
            client_max_body_size 10m;

            #高负荷下缓冲大小(proxy_buffers*2)
            proxy_busy_buffers_size 64k;

            #设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
            #设定缓存文件夹大小,大于这个值,将从upstream服务器传
            proxy_temp_file_write_size 64k;
        }
        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file confpasswd;
            #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        }
        # 错误页面,当页面返回404时返回404.html(/指的网页根目录)
        error_page  404              /404.html;
    }

nginx限制访问功能

在nginx.conf当中,编辑server当中添加

deny ip; # 把某ip禁用访问,写在location底下

nginx状态信息

状态信息功能,监测当前有多少连接数。

使用如下(在server当中添加一个location):

    location /status {
        stub_status on;

img

  • 压测命令ab
yum install httpd-tools

# 1000个并发,100000次请求
ab -kc 1000 -n 100000 http://192.168.119.10/

基于域名和更改server_name实现基于域名的虚拟主机

添加http模块当中server参数:

  • 例如我有两个域名:www.htsp.com、www.djsidsjd.com

可以这样修改配置文件

   server {
        listen       80;
        server_name  www.htsp.com;
        location /{
            root   html/gtsp;
            index  index.html index.htm;
        }
    }
       server {
        listen       80;
        server_name  www.djsidsjd.com;
        location /{
            root   html/djsidsjd;
            index  index.html index.htm;
        }
    }

这样的话,重启以后,通过域名的不同,我可以访问不同的页面。同样暴露在80端口。

路径url的正则匹配

匹配符 匹配规则 优先级
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
!~ 区分大小写不匹配的正则 5
!~* 不区分大小写不匹配的正则 6
/ 通用匹配,任何请求都会匹配到 7

举个栗子:

    server {
    listen 80;
    server_name pythonav.cn;

    #优先级1,精确匹配,根路径
    location =/ {
        return 400;
    }

    #优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写
    location ^~ /av {
       root /data/av/;
    }

    #优先级3,区分大小写的正则匹配,匹配/media*****路径
    location ~ /media {
          alias /data/static/;
    }

    #优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
    location ~* .*\.(jpg|gif|png|js|css)$ {
       root  /data/av/;
        }

    #优先7,通用匹配
    location / {
        return 403;
    }
}

负载均衡

什么是集群

指一组或者若干个相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统。(一堆服务器共同做一件事)

简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。这些服务器之间可以彼此通信,协同向用户提供应用程序、系统资源和数据,并以单一系统的模式加以管理。当用户客户机清求集群系统时,集群给用户的感觉就是一个单一独立的服务器,而实际上用户请求的是一组集群服务器。
打开谷歌、百度的页面,看起来好简单,也许你觉得用几分钟就可以制作出相似的网页,而实际上,这个页面的背后是由成千上万台服务器集群协同工作的结果。而这么多的服务器维护和管理,以及相互协调工作也许就是读者你未来的工作职责了。
若要用一句话描述集群,即一堆服务器合作做同一件事,这些机器可能需要整个技术团队架构、设计和统一协调管理,这些机器可以分布在一个机房,也可以分布在全国全球各个地区的多个机房。

优点

  1. 高性能

    一些需要大量计算的业务,即便是一台算力很强的计算机,计算能力也是有限的。但是,集中几十台甚至万-十万台的服务器,可以极大的提高性能。

  2. 价格有效性

    通过几台性能较低的服务器集群,可以媲美较高配置的服务器,具有更高的性价比。

  3. 可伸缩性

    当系统性能不足时,对集群中的较低性能机器进行升配,比提高一个高性能服务器的性能,相对来说更加简单,花销也较少

  4. 高可用性

    单一计算机可能会面临设备损坏的情况,一旦损坏,业务全挂。而计算机集群,其中一台计算机的失效,不会使得所有业务都挂了。几乎可以实现7*24的服务。

  5. 透明性(安全性)

    对于服务器集群,用户访问集群系统时,就像访问一台高性能服务器一样,不会暴露所有服务器的情况。同时,部分服务器的上下线,也不会中断整个系统服务。

负载均衡

可以通过下文详细了解:https://www.cnblogs.com/funcquery/p/16009094.html

  1. 工作情况:通过集群,将web服务器分为多个,从而减少单个服务器的负担
    img

  2. 工作原理

    用户对负载均衡器发送请求(大流量,多用户),通过均衡器(根据算法将流量分发)。以轮询(一个一个发)或者加入权重的方式分发请求,让多个服务共同工作,减少单台服务器的负荷,提高响应效率。
    img

  3. 负载均衡和代理

    img
    从图中看,代理与负载均衡几乎是一样的。最大的区别是:

    • 代理将请求转发给了一台服务器。
    • 负载均衡是通过算法,将请求转发到了多台一模一样的服务器,从而实现单台设备负载的减少。(upstream虚拟代理池)

实现负载均衡、动静分离的效果

  1. 将代码/服务跑在不同的机器,或者是跑在不同的端口。(相同的服务)

    • 负载均衡(被分配的服务器跑相同的服务。)
    • 动静分离(分为跑动态页面和跑静态页面的服务器组。)
  2. 对于不同的服务器组(提供相同服务的服务器)

    配置:

        # 动态页面服务器
        upstream django {
            server 10.0.0.10:8000;
            # 也可以是自己服务器的不同端口
            # server 127.0.0.1:2481;
            server 10.0.0.11:9000;
        }
        # 静态页面服务器
        upstream static {
            server 192.168.119.11:80;
        }
    
    • 默认的情况下,对服务器组的分发是轮询规则。
      所有的规则如下:
      调度算法 概述
      轮询 按时间顺序逐一分配到不同的后端服务器(默认)
      weight 加权轮询,weight值越大,分配到的访问几率越高
      ip_hash 每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
      url_hash 按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器
      least_conn 最少链接数,那个机器链接数少就分发

    例子:

        # 轮询
        upstream django {
            server 10.0.0.10:8000;
            server 10.0.0.11:9000;
        }
        # 权重
        upstream django {
            server 10.0.0.10:8000 weight=5;
            server 10.0.0.11:9000 weight=10;#这个节点访问比率是大于8000的
        }
        # ip_hash
        # 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器
        upstream django {
            ip_hash;
            server 10.0.0.10:8000;
            server 10.0.0.11:9000;
        }
        # backup
        # 在非backup机器繁忙或者宕机时,请求backup机器,因此机器默认压力最小
        upstream django {
            server 10.0.0.10:8000 weight=5;
            server 10.0.0.11:9000;
            server node.oldboy.com:8080 backup;
        }
    
    1. 在虚拟主机当中设置规则

    这里以动静分离为例子

    server {
        listen       80;
        server_name  192.168.119.12;
        # 当请求到达192.168.119.12:80/时,转发给flask的8080应用
        location / {
            proxy_pass http://django;
            include proxy_params;
        }
        # 当判断资源请求是 192.168.119.12/girl.jpg时候,转发请求给static地址池 # 的服务器192.168.119.11/
    
        location ~ .*\.(png|jpg|gif)$ {
         proxy_pass http://static;
            include proxy_params;
        }
    }
    
    1. 这样就完成了负载均衡的配置。

标签:http,server,nginx,proxy,相关,服务器,devel
From: https://www.cnblogs.com/lmlsh/p/18310331

相关文章

  • Transformer、RNN和SSM的相似性探究:揭示看似不相关的LLM架构之间的联系
    通过探索看似不相关的大语言模型(LLM)架构之间的潜在联系,我们可能为促进不同模型间的思想交流和提高整体效率开辟新的途径。尽管Mamba等线性循环神经网络(RNN)和状态空间模型(SSM)近来备受关注,Transformer架构仍然是LLM的主要支柱。这种格局可能即将发生变化:像Jamba、Samba和G......
  • 腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 状态管理相关
    文章目录1.概念介绍2.功能与用法2.1主要功能2.2使用方法3.示例代码4.内容总结我们在上一章回中介绍了"四个bublue包对比与总结"相关的内容,本章回中将介绍Get包.闲话休提,让我们一起TalkFlutter吧。1.概念介绍我们在本章回中将介绍Get包,它是一个三方插件,......
  • Transformer图解以及相关的概念解析
    前言transformer是目前NLP甚至是整个深度学习领域不能不提到的框架,同时大部分LLM也是使用其进行训练生成模型,所以transformer几乎是目前每一个机器人开发者或者人工智能开发者不能越过的一个框架。接下来本文将从顶层往下去一步步掀开transformer的面纱。transformer概述Transforme......
  • Linux文件属性及相关命令
    1.Linux文件体系概述2.inode和block的概述2.1inodeinode索引节点,inode号码类似于身份证号码,通过inode号码可以找到文件的内容。inode是一个空间,inode号是空间的位置,inode空间中存放的是文件属性信息,文件大小,修改时间,权限,所有者inode空间中存放block的位置(指向......
  • Jenkins+Github+Nginx实现前端项目自动部署
    前言最近在搭建一个自己的网站,网站框架搭好了要把项目放到服务器运行,但是每次更新网站内容就要手动部署一次,实在很麻烦,于是就想搭建一套自动化部署的服务。看了一些案例最后选用现在比较主流的Jenkins+Github+Nginx的方案来搭建,于是跟着教程去做,看了很多教程其实不是太......
  • yum安装nginx没有某一模块,该如何添加第三方模块
    本文将以添加--with-stream模块为例,演示如何去添加新的模块进去。需求:生产有个接口是通过socket通信。nginx1.9开始支持tcp层的转发,通过stream实现的,而socket也是基于tcp通信。实现方法:Centos7.5下yum直接安装的nginx,添加新模块支持tcp转发;重新编译Nginx并添加--with-stream参数。......
  • 网络属性及相关配置工具\shel脚本编程-进阶 \进程-系统性能和计划任务
    一、通过网络配置命令让主机上网1.查看网络接口信息:  -`ipa`或者`ifconfig`显示系统中所有网络接口的详细信息,包括IP地址、子网掩码、MAC地址等。2.配置IP地址、子网掩码、网关和DNS:  -IP地址:使用`ifconfig`或`ipaa`命令来设置IP地址。例如,`ifconfig......
  • 安卓framework单屏幕Display秒双/多屏互动相关需求改进-wms实战开发
    背景前面已经给学员朋友们分享过单屏秒变双屏的成果展示,具体详情可以点击这里:https://mp.weixin.qq.com/s/KdYTLMuXiBdjM0kZmYKzPg一些vip学员朋友也纷纷求助马哥的实现patch代码,想用于公司的实战项目实现。但是在公司需求实现要求和马哥这边的实现还是会有一些需求上的......
  • docker php和nginx的通信
    1安装网络dockernetworkcreatephpClassExamples_network2安装nginx2.1生成临时容器dockerrun-it--nametest_nginx-dnginx查看临时容器内部,找到关键目录1、工作目录:lsusr/share/nginx/html 2、配置目录lsetc/nginx/conf.d3、日志目录lsvar......