美文网首页
Nginx总结之基础概念

Nginx总结之基础概念

作者: 夜醉梦紅尘 | 来源:发表于2019-10-09 21:31 被阅读0次

    Nginx (engine x) 是一个高性能的 HTTP 和 反向代理 服务,也是一个IMAP/POP3/SMTP服务,Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

    Nginx功能特点

    1.作为 Web 服务器
    2.作为负载均衡服务器
    3.作为邮件代理服务器
    4.Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器

    Nginx处理高并发两种方法

    1.当一个新的I/O流进来就会分配一个新的进程进行管理
    2.I/O多路复用,就是单线程追踪单个sock流来管理多个I/O流,在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流


    image.png
    image.png

    Nginx处理请求的过程

    • select, poll, epoll 都是I/O多路复用的具体的实现,其实是他们出现是有先后顺序的。

    I/O多路复用这个概念被提出来以后, 相继出现了多个方案

    select是第一个实现 (1983 左右在BSD里面实现的)。

    select 被实现以后,很快就暴露出了很多问题。

    • select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。

    • select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍...

    • select 只能监视1024个链接。

    • select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现,这个sock不用,要收回,这个select 不支持的,如果你丧心病狂的竟然关掉这个sock, select的标准行为是不可预测的

    于是14年以后(1997年)一帮人又实现了poll, poll 修复了select的很多问题,比如

    • poll 去掉了1024个链接的限制,于是要多少链接呢, 主人你开心就好。

    • poll 从设计上来说,不再修改传入数组,不过这个要看你的平台了,所以行走江湖,还是小心为妙。

    其实拖14年那么久也不是效率问题, 而是那个时代的硬件实在太弱,一台服务器处理1千多个链接简直就是神一样的存在了,select很长段时间已经满足需求。

    但是poll仍然不是线程安全的, 这就意味着,不管服务器有多强悍,你也只能在一个线程里面处理一组I/O流。

    epoll 可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题, 比如:

    • epoll 现在是线程安全的。

    • epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。

    Nginx内部结构

    image.png

    1个master主进程,2个work工作进程,处理方式为异步,非阻塞 原理(即一个request请求过来,当一个线程不能立即处理完成时,并不会阻止其他request的访问,而是让未完成的request在旁边等待,让线程继续在后台处理,直到完成才会离去)

    Nginx部署

    nginx官方网站:http://www.nginx.org

    方式一,yum安装

    1.yum install yum-utils
    2.vim /etc/yum.repos.d/nginx.repo 写入:

    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    
    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    

    3.yum-config-manager --enable nginx-mainline
    4.yum install nginx
    5.查看防火墙状态 getenforce,关闭防火墙 systemctl stop firewalld,
    或者 vim /etc/selinux/config 设置SELINUX=disabled
    6.nginx -v 查看版本
    nginx -V 查看nginx安装的模块

    方式二,编译安装

    1、安装编译环境
    yum -y install gcc gcc-c++
    2、安装pcre软件包(使nginx支持http rewrite模块)
    yum install -y pcre pcre-devel
    3、安装openssl-devel(使nginx支持ssl)
    yum install -y openssl openssl-devel
    4、安装zlib
    yum install -y zlib zlib-devel
    5.安装包下载
    wget http://120.52.51.15/nginx.org/download/nginx-1.14.2.tar.gz
    tar -vzxf nginx-1.14.2.tar.gz -C /usr/local
    cd nginx-1.14.2/
    ./configure \
    make &&make install
    6.了解安装中需要指定的参数

    --prefix=/usr/share/nginx                        # 指向安装目录
    --conf-path=/etc/nginx/nginx.conf                # 指定配置文件
    --http-log-path=/var/log/nginx/access.log        # 指定访问日志
    --error-log-path=/var/log/nginx/error.log        # 指定错误日志
    --lock-path=/var/lock/nginx.lock                 # 指定lock文件
    --pid-path=/run/nginx.pid                        # 指定pid文件
    
    --http-client-body-temp-path=/var/lib/nginx/body    # 设定http客户端请求临时文件路径
    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi     # 设定http fastcgi临时文件路径
    --http-proxy-temp-path=/var/lib/nginx/proxy         # 设定http代理临时文件路径
    --http-scgi-temp-path=/var/lib/nginx/scgi           # 设定http scgi临时文件路径
    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi         # 设定http uwsgi临时文件路径
    
    --with-debug                                        # 启用debug日志
    --with-pcre-jit                                     # 编译PCRE包含“just-in-time compilation”
    --with-ipv6                                         # 启用ipv6支持
    --with-http_ssl_module                              # 启用ssl支持
    --with-http_stub_status_module                      # 获取nginx自上次启动以来的状态
    --with-http_realip_module                 # 允许从请求标头更改客户端的IP地址值,默认为关
    --with-http_auth_request_module           # 实现基于一个子请求的结果的客户端授权。如果该子请求返回的2xx响应代码,所述接入是允许的。如果它返回401或403中,访问被拒绝与相应的错误代码。由子请求返回的任何其他响应代码被认为是一个错误。
    --with-http_addition_module               # 作为一个输出过滤器,支持不完全缓冲,分部分响应请求
    --with-http_dav_module                    # 增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法 默认关闭,需编译开启
    --with-http_geoip_module                  # 使用预编译的MaxMind数据库解析客户端IP地址,得到变量值
    --with-http_gunzip_module                 # 它为不支持“gzip”编码方法的客户端解压具有“Content-Encoding: gzip”头的响应。
    --with-http_gzip_static_module            # 在线实时压缩输出数据流
    --with-http_image_filter_module           # 传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd库要用到)
    --with-http_spdy_module                   # SPDY可以缩短网页的加载时间
    --with-http_sub_module                    # 允许用一些其他文本替换nginx响应中的一些文本
    --with-http_xslt_module                   # 过滤转换XML请求
    --with-mail                               # 启用POP3/IMAP4/SMTP代理模块支持
    --with-mail_ssl_module                    # 启用ngx_mail_ssl_module支持启用外部模块支持
    

    7.修改配置文件 /etc/nginx/nginx.conf

    # 全局参数设置 
    worker_processes  1;          # 设置nginx启动进程的数量,一般设置成与逻辑cpu数量相同 
    error_log  logs/error.log;    # 指定错误日志 
    worker_rlimit_nofile 102400;  # 设置一个nginx进程能打开的最大文件数 
    pid        /var/run/nginx.pid; 
    events {                      # 事件配置
        worker_connections  1024; # 设置一个进程的最大并发连接数
        use epoll;                # 事件驱动类型
    } 
    # http 服务相关设置 
    http { 
        include      mime.types; 
        default_type  application/octet-stream; 
        log_format  main  'remote_addr - remote_user [time_local] "request" '
                          'status body_bytes_sent "$http_referer" '
                          '"http_user_agent" "http_x_forwarded_for"'; 
        access_log  /var/log/nginx/access.log  main;    #设置访问日志的位置和格式 
        sendfile          on;      # 用于开启文件高效传输模式,一般设置为on,若nginx是用来进行磁盘IO负载应用时,可以设置为off,降低系统负载
        tcp_nopush        on;      # 减少网络报文段数量,当有数据时,先别着急发送, 确保数据包已经装满数据, 避免了网络拥塞
        tcp_nodelay       on;      # 提高I/O性能,确保数据尽快发送, 提高可数据传输效率                           
        gzip              on;      # 是否开启gzip压缩 
        keepalive_timeout  65;     # 设置长连接的超时时间,请求完成之后还要保持连接多久,不是请求时间多久,目的是保持长连接,减少创建连接过程给系统带来的性能损                                    耗,类似于线程池,数据库连接池
        types_hash_max_size 2048;  # 影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。                                            types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升
        include             /etc/nginx/mime.types;  # 关联mime类型,关联资源的媒体类型(不同的媒体类型的打开方式)
        default_type        application/octet-stream;  # 根据文件的后缀来匹配相应的MIME类型,并写入Response header,导致浏览器播放文件而不是下载
    # 虚拟服务器的相关设置 
        server { 
            listen      80;        # 设置监听的端口 
            server_name  localhost;        # 设置绑定的主机名、域名或ip地址 
            charset koi8-r;        # 设置编码字符 
            location / { 
                root  /var/www/nginx;           # 设置服务器默认网站的根目录位置 
                index  index.html index.htm;    # 设置默认打开的文档 
                } 
            error_page  500 502 503 504  /50x.html; # 设置错误信息返回页面 
                location = /50x.html { 
                root  html;        # 这里的绝对位置是/var/www/nginx/html 
            } 
        } 
     }
    

    8.启动检查Nginx
    /usr/local/nginx/sbin/nginx || systemctl start nginx
    usr/local/nginx/sbin/nginx -t || nginx -t 检查配置文件是否有错

    9.了解nginx日志
    nginx 日志文件分为 log_format 和 access_log 两部分,​ log_format 定义记录的格式,access_log记录访问日志

    Nginx一些高级应用

    编辑 /etc/nginx/nginx.conf 配置文件

    #添加以下内容~~ 
    location /nginx-status { 
          stub_status on; 
          access_log    /var/log/nginx/nginxstatus.log;    #设置日志文件的位置 
          auth_basic    "nginx-status";    #指定认证机制(与location后面的内容相同即可) 
          auth_basic_user_file    /etc/nginx/htpasswd;     #指定认证的密码文件 
          }     
    

    ​创建认证口令文件并添加用户 lys 和 admin,密码用md5加密

    htpasswd -c -m /etc/nginx/htpasswd lys 
    htpasswd -m /etc/nginx/htpasswd admin
    

    重启服务,客户端访问 http:// 启动服务的ip / nginx-status 即可

    了解虚拟主机

    虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响。


    image.png

    nginx可以实现虚拟主机的配置,nginx支持三种类型的虚拟主机配置。
    1、基于域名的虚拟主机 (server_name来区分虚拟主机——应用:外部网站)
    2、基于ip的虚拟主机, (一块主机绑定多个ip地址)
    3、基于端口的虚拟主机 (端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台)

    1基于域名的虚拟主机配置

    1.cd /etc/nginx/conf.d/
    vim web.conf

    server {
        listen 80;
        server_name  www.1000phone01.com;
        root         /usr/share/nginx/web1;
        access_log   /var/log/www.1000phone01.com.log main;
        error_log   /var/log/www.1000phone01.com.error.log;
    location / {
        index index.html;
        }
    }
    
    

    2.为 域名为 www.1000phone01.com 的虚拟机,创建 index 文件
    mkdir /var/share/nginx/web
    echo " 这是web的测试" > web/index.html

    3.systemctl reload nginx.service 或者 systemctl restart nginx.service
    4.vim /etc/hosts
    10.0.122.57 www.1000phone01.com
    5.浏览器输入www.1000phone01.com就能看到
    这是web的测试
    6.如果不能正常运行,一定要记得去查看报错日志 cat logs/error.log

    2.基于IP的虚拟主机

    其实就是一块网卡绑定多个ip
    1.建立多个虚拟ip
    ifconfig enp0s25:1 10.0.122.101
    ifconfig enp0s25:2 10.0.122.102
    ifconfig 查看
    2.类似与前面的方法,在/etc/nginx/conf.d的目录下创建两个app1.conf,app2.conf,并写入

    app1.conf:
    server {
        listen 10.0.122.101:80;
        server_name  www.app1.com;
        root         /usr/share/nginx/app1;
        access_log   /var/log/www.app1.com.log main;
        error_log   /var/log/www.app1.com.error.log;
    location / {
        index index.html;
        }
    }
    --------------------------------
    
    app2.conf:
    server {
        listen 10.0.122.102:80;
        server_name  www.app2.com;
        root         /usr/share/nginx/app2;
        access_log   /var/log/www.app2.com.log main;
        error_log   /var/log/www.app2.com.error.log;
    location / {
        index index.html;
        }
    }
    

    3.再进入到 /var/share/nginx/下创建两个目录app1,app2,写入
    echo " app1 test html" > app1/index.html
    echo " app2 test html" > app2/index.html

    4.重新载入nginx,浏览器输入10.0.122.101/102即可得到内容

    3.基于端口的虚拟主机

    (端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台)
    同上步骤,在port.conf写入

    server {
        listen 8080;
        server_name  www.port1.com;
        root         /usr/share/nginx/port1;
        access_log   /var/log/www.port1.com.log main;
        error_log   /var/log/www.port1.com.error.log;
    location / {
        index index.html;
        }
    }
    
    

    输入www.port1.com:8080 即可得到内容

    相关文章

      网友评论

          本文标题:Nginx总结之基础概念

          本文链接:https://www.haomeiwen.com/subject/fhfnpctx.html