• Linux----------nginx基础


    一、nginx简介

    nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。

    nginx由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用。

    第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

    nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

    nginx的官网:

    1.1 nginx的特性:

    nginx的特性:

    • 模块化设计,较好的扩展性
    • 外围支持好:文档全,二次开发和模块较多
    • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
    • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需要2.5M内存
    • 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化
    • 配置通俗易懂
    • 稳定性高:用于反向代理,宕机的概率微乎其微
    • 在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应
    • 使用epoll and kqueue作为开发模型
    • nginx采用C进行编写,不论系统资源开销还是CPU使用效率都比Perlbal要好很多

    1.2 nginx的基本功能

    nginx的基本功能:

    • 静态资源的web服务器
    • http协议反向代理服务器
    • pop3/imap4协议反向代理服务器
    • FastCGI(LNMP),uWSGI(python)等协议
    • 模块化(非DSO),如zip,SSL模块

    1.3 web服务相关的功能:

    • 虚拟主机(server)
    • 支持 keep-alive 和管道连接
    • 访问日志(支持基于日志缓冲提高其性能)
    • url rewirte
    • 路径别名
    • 基于IP及用户的访问控制
    • 支持速率限制及并发数限制
    • 重新配置和在线升级而无须中断客户的工作进程
    • Memcached 的 GET 接口

    1.4 nginx的优点

    nginx的优点:

    • 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
    • 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)
    • 配置文件非常简单:风格跟程序一样通俗易懂
    • 成本低廉:nginx为开源软件,可以免费使用。
    • 支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组-
    • 内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
    • 节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
    • 稳定性高:用于反向代理,宕机的概率微乎其微
    • 模块化设计:模块可以动态编译
    • 外围支持好:文档全,二次开发和模块较多
    • 支持热部署:可以不停机重载配置文件
    • 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化

    二、nginx的组成

    nginx由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

    2.1 nginx的程序结构

    nginx的程序结构: master/worker结构

    一个master进程:负责加载和分析配置文件、管理worker进程、平滑升级
    一个或多个worker进程:处理并响应用户请求
    缓存相关的进程:
    cache loader:载入缓存对象
    cache manager:管理缓存对象

    2.2 nginx模块

    nginx由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

    nginx模块分类: 模块分类:

    • 核心模块:core module(处理类)
    • 标准模块: (过滤类)
      HTTP 模块: ngx_http_*
      HTTP Core modules 默认功能
      HTTP Optional modules 需编译时指定
      Mail 模块 ngx_mail_*
      Stream 模块 ngx_stream_*
    • 第三方模块(代理类)

    三、工作原理

    • nginx工作原理

    • nginx模块一次常规的HTTP请求和响应的过程

    • web服务请求过程

    四、配置文件

    Nginx的配置文件nginx.conf位于其安装目录的conf目录下。
    nginx.conf由多个块组成,main(全局设置)、event(事件驱动设置)、server(主机设置)、upstream(负载均衡服务器设置)和 location(URL匹配特定位置的设置)。这五者之间的关系式:server继承main,location继承server,upstream既不会继承其他设置也不会被继承。

    4.1 Main全局配置

    Main 全局配置段常见的配置指令分类:

    • 正常运行必备的配置
    • 优化性能相关的配置
    • 用于调试及定位问题相关的配置
    • 事件驱动相关的配置

    4.1.1 正常运行必备的配置

    正常运行必备的配置:
    帮助文档:http://nginx.org/en/docs/ngx_core_module.html
    1、user
    Syntax: user user [group];
    Default: user nobody nobody;
    Context: main
    指定worker进程的运行身份,如组不指定,默认和用户名同名

    2、pid /PATH/TO/PID_FILE
    指定存储nginx主进程PID的文件路径

    3、include file | mask
    指明包含进来的其它配置文件片断

    4、load_module file
    模块加载配置文件:/usr/share/nginx/modules/*.conf
    指明要装载的动态模块路径: /usr/lib64/nginx/modules

    4.1.2 性能优化相关的配置

    性能优化相关的配置:
    1、worker_processes number | auto
    worker进程的数量;通常应该为当前主机的cpu的物理核心数

    2、worker_cpu_affinity cpumask ...
    worker_cpu_affinity auto [cpumask] 提高缓存命中率
    CPU MASK: 00000001:0号CPU
    00000010:1号CPU
    10000000:8号CPU
    worker_cpu_affinity 0001 0010 0100 1000;
    worker_cpu_affinity 0101 1010;

    3、worker_priority number
    指定worker进程的nice值,设定worker进程优先级:[-20,20]

    4、worker_rlimit_nofile number
    worker进程所能够打开的文件数量上限,如65535

    4.2 事件驱动相关的配置

    events {
             ...
    }
    

    1、worker_connections number
    每个worker进程所能够打开的最大并发连接数数量,如10240
    总最大并发数:worker_processes * worker_connections

    2、use method
    指明并发连接请求的处理方法 ,默认自动选择最优方法
    use epoll;

    3、accept_mutex on | off 互斥
    处理新的连接请求的方法;on指由各个worker轮流处理新请求,Off指每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊群”,影响性能

    • 调试和定位问题:
      1、daemon on|off 是否以守护进程方式运行nignx,默认是守护进程方式
      2、master_process on|off 是否以master/worker模型运行nginx;默认为on,off 将不启动worker
      3、error_log file [level] 错误日志文件及其级别;出于调试需要,可设定为debug;但debug仅在编译时使用了“--with-debug”选项时才有效
      方式:file /path/logfile;
      stderr:发送到标准错误
      syslog:server-address[,parameter=values]:发送到syslog
      memory:size 内存
      level:debug|info|notice|warn|error|crit|alter|emerg

    4.3 http协议的相关配置

    http协议的相关配置:

    http {
              ... ...
             server {
                           ...
                          server_name
                          root
                         location [OPERATOR] /uri/ {
                                        ...
                         }
            }
            server {
                            ...
    }
    

    此配置请看随笔----nginx-http协议具体配置

    4.4 stream服务器相关配置段

    nginx的其它的二次发行版:
    Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始,Tengine成为一个开源项目,官网 http://tengine.taobao.org/
    OpenResty:基于 Nginx 与 Lua 语言的高性能 Web平台

    nginx_stream_core_module模块
    模拟反代基于tcp或udp的服务连接,即工作于传输层的反代或调度器

    • 1、stream { ... }
      定义stream相关的服务;Context:main
    stream {
           upstream mysqlsrvs {
               server 192.168.22.2:3306;
               server 192.168.22.3:3306;
               least_conn;
           }
          server {
               listen 10.1.0.6:3306;
                proxy_pass mysqlsrvs;
           }
    }
    
    • 2、listen
      listen address:port [ssl] [udp] [proxy_protocol][backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

    • 可实现代理基于TCP,UDP (1.9.13), UNIX-domain sockets的数据流
      1 proxy_pass address; 指定后端服务器地址
      2 proxy_timeout timeout; 无数据传输时,保持连接状态的超时时长,默认为10m
      3 proxy_connect_timeout time; 设置nginx与被代理的服务器尝试建立连接的超时时长,默认为60s

    • 示例:

    stream {
                upstream mysqlsrvs {
                           server 192.168.0.10:3306;
                           server 192.168.0.11:3306;
                           hash $remote_addr consistent;
                }
                server {
                          listen 172.16.100.100:3306;
                          proxy_pass mysqlsrvs;
                          proxy_timeout 60s;
                          proxy_connect_timeout 10s;
                }
    }
    

    4.5 常需要调整的参数

    • worker_processes //启动n个worker进程,这里的n为了避免上下文切换,通常设置为cpu总核心数-1或等于总核心数
    • worker_connections //进程能够接受的最大连接数(最大32000)
    • worker_cpu_affinity 01 10 //表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核
    • worker_priority 0 //进程的静态优先级,范围在-20~19,-20为最高优先级

    五、编译安装nginx

    //创建系统用户nginx
    [root@localhost ~]# useradd -r -M -s /sbin/nologin nginx
    
    //安装依赖环境
    [root@localhost ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
    [root@localhost ~]# yum -y groups mark install 'Development Tools'
    
    //创建日志存放目录
    [root@localhost ~]# mkdir -p /var/log/nginx
    [root@localhost ~]# chown -R nginx.nginx /var/log/nginx
    
    //下载nginx
    [root@localhost ~]# cd /usr/src/
    [root@localhost src]# wget http://nginx.org/download/nginx-1.12.0.tar.gz
    
    //编译安装
    [root@localhost src]# ls
    debug  kernels  nginx-1.12.0.tar.gz
    [root@localhost src]# tar xf nginx-1.12.0.tar.gz
    [root@localhost src]# cd nginx-1.12.0
    [root@localhost nginx-1.12.0]# ./configure 
    --prefix=/usr/local/nginx 
    --user=nginx 
    --group=nginx 
    --with-debug 
    --with-http_ssl_module 
    --with-http_realip_module 
    --with-http_image_filter_module 
    --with-http_gunzip_module 
    --with-http_gzip_static_module 
    --with-http_stub_status_module 
    --http-log-path=/var/log/nginx/access.log 
    --error-log-path=/var/log/nginx/error.log
    
    [root@localhost nginx-1.12.0]# make -j 2 && make install
    
    //设置环境变量
    [root@localhost ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
    [root@localhost ~]# . /etc/profile.d/nginx.sh
    
    //启动nginx 
    [root@localhost ~]# nginx   -t           //j检查配置文件是否有问题
    [root@localhost ~]# nginx                //启动nginx
    [root@localhost ~]# nginx -s stop    //停止nginx
    
  • 相关阅读:
    广告小程序后端开发(8.发布免费广告或店铺,以及上传图片)
    广告小程序后端开发(7.获取价格表数据)
    广告小程序后端开发(6.获取类别逻辑)
    广告小程序后端开发(5.安装配置django-rest-framework,编写后台登录逻辑)
    广告小程序后端开发(4.导入地区数据,修改adminx,修改models,手动添加模拟数据)
    广告小程序后端开发(3.xadmin的引入)
    广告小程序后端开发(2.Models设计)
    使用django执行数据更新命令时报错:django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.00 01_initial on database 'default'.
    广告小程序后端开发(1.新建项目、连接数据库)
    pycharm的Database连接新的Mysql5.7报错[08001]
  • 原文地址:https://www.cnblogs.com/wangchengshi/p/10912185.html
Copyright © 2020-2023  润新知