Nginx总结之基础概念

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总结之基础概念)