nginx-web服务器

一、学习nginx前

有两个概念需要明白,同步和异步,阻塞和非阻塞

同步异步

同步和异步得终点在消息通知的方式上,也就是调用结果的通知方式不同。

同步

当一个同步调用发出去后,调用者要一直等待调用的结果通知后,才能进行后续的执行。

异步

当一个异步调用发出去后,调用者不必一直等待调用结果的返回,异步调用,要想获取结果,一般存在两种方式:
1.主动轮询异步调用结果
2.被调用方通过callback(回调通知)来通知调用方调用结果。

实例解释

同步取快递:小明收到快递将送达的短信,在楼下一直等待快递宋大
异步取快递:小明收到快递将送达的短信,快递到下楼后,小明再下楼去取。

异步取快递时,小明知道快递到楼下有两种方式。
1.不停的电话问快递小哥到没到,即主动轮询。
2.快递小哥到楼下后,打电话通知小明,然后小明下楼取快递,即回调通知。

阻塞与非阻塞

阻塞与非阻塞的终点在于进/线程等待消息时的行为,也就是在等待消息时,当前线/进程是挂起状态,还是非挂起状态。

阻塞

调用在发出后,在消息返回之前,当前线/进程会被挂起,直到有消息返回,当前进/线程才会被激活。

非阻塞

调动在发出去后,不会阻塞当前进程/线程,而会立即返回。

实例解释

阻塞取快递:小明收到快递即将送达的消息后,什么事都不做,一直专门等快递
非阻塞取快递:小明收到快递即将送达的消息后,一边敲代码,一边刷微信等快递。

同步和异步,重点在于消息通知方式。
阻塞与非阻塞,重点在于等消息时候的行为。
所以,有了4种组合方式:

同步阻塞:小明收到快递将送达的消息后,啥都不干,一直等快递。
同步非阻塞:小明收到信息后,一边刷微博,一边等着取快递。
异步阻塞:小明收到消息后,啥都不干,就等着快递员通知后再取快递。
异步非阻塞:小明收到消息后,刷着抖音,等着快递员通知他后再去取快递。

大部分程序的I/O模型都是同步阻塞型的,单个进程每次只在一个文件描述符上执行I/O才足以,每次I/O系统调用都会阻塞,直到完成数据传输。传统的服务器就是采用的同步阻塞的多进程模型。一个server采用一个进程负责一个request的方式,一个进程负责一个request,直到会话结束。进程数就是并发数,而操作系统支持的进程数是优先的,且进程数越多,调度开销也就越大,因此无法面对高并发。

nginx就是采用了异步非阻塞方式工作。先了解一下I/O多路复用种的epoll模型。

epoll模型

当连接有I/O事件产生的时候,epoll就会告诉进程哪个连接有I/O事件,然后进程就会去处理这个事件。
例如,小明家楼下有一个收发室,每次有快递到了,门卫就会先代收并做了标记,然后通知小明去取快递。

为什么nginx比其他web服务器并发高(工作原理)

nginx配置use epoll后,以异步非阻塞方式工作,能轻松处理百万级的并发连接。

处理过程:

每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到可能发生阻塞的地方。比如向后端服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:如果后端服务器返回了,告诉这个worker,worker继续解这处理这个请求。遇是worker就去休息了。此时,如果再有新的request进来,他就可以很快再按照这种方式处理。而一旦后端服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的。

二、nginx详解

nginx(engine x)是一个高性能的HTTP和反向代理服务器,同时也提供了IMAP和SMTP服务。nginx是由伊戈尔·赛索耶夫为俄罗斯访问量地儿的Rambler.ru站点开发的,第一个公布版本0.1.0发布于2004.10.4。

nginx是一款轻量级的web服务器/反向代理服务器及电子邮件代理服务器(IMAP/POP3),在BSD-like协议下发行。其特点是占有内存少,并发能力强。

工作模式:

nginx有另种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式各有各自的特点和适用场景。

master-worker模式(默认模式):

该模式下,nginx启动成功后,会有一个master进程和至少一个worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号灯功能)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为此模式有以下优点:

1.稳定性高,只要还有worker进程存货,就能提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数不变,降低服务中断的概率。
2.配置linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能。
3.处理信号/配置 重加载/升级时可以做到尽可能少或者不中断服务(热重启/热部署)

单进程模式

该进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地里用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何信号处理都可能造成服务中断,并且由于时单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。

配置文件结构
user  nginx;
#程序运行用户
worker_processes  1;
#worker进程数,一般按照cpu核心数指定。auto自动,可以自己指定

#error_log  logs/error.log;
#报错日志路径
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
#pid保存的pid文件。里面是nginx运行起来后master进程的pid

events {
    use epoll;
    #使用epoll模型,对于2.6以上的内核建议使用,有助于提高性能
    worker_connections  1024;
    #工作进程最大连接数量,一个工作进程可以处理最大的连接数量,正常应该是启动进程数x51200。
    #也就是worker processes x 51200。
}


http { #网站优化参数
    include       mime.types;
    #设置浏览器处理服务器传给浏览器的文件的方式;
    default_type  application/octet-stream;
    #默认为下载,浏览器访问到未定义的扩展名的时候,就默认为下载该文件
    #如果将这个设置改成default_type text/html;那就是告诉浏览器默认的打开方式是把所有未设置的扩展名当HTML文件打开。

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #记录日志log文件的格式设置


    #access_log  logs/access.log  main;
    #成功日志目录位置和格式

    sendfile        on;
    #设置http接收和发送文件 开启
    #tcp_nopush     on;
    #用来提升网络包的传输'效率,只有设置sendfile开启的时候才生效

    #keepalive_timeout  0;
    keepalive_timeout  65;
    #设置http连接超时时间,65s

    #gzip  on;
    #文件数据压缩

    server { #具体某一网站的配置信息
        listen       80;
        #监听端口
        
        server_name  localhost;
        #代理服务器名称,localhost就是本机

        #charset koi8-r;
        #指定编码格式

        #access_log  logs/host.access.log  main;
        #日志文件目录及日志文件格式

        location / {  #正向代理"/"路径和相关配置,/表示路径,用正则表示,这里匹配到访问对象,其下配置就是具体操作的配置
            root   html;
            #当指定/时,指向的目录

            index  index.php index.html index.htm;
            #默认加载页面文件和优先级
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ { #识别php
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server { #这里配置的https
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

三、实例配置

注:配置文件中的结尾有分号作为结束。需改完配置文件后需重启nginx才会生效。
pkill -HUP nginx

1.nginx的状态统计(查看指定时间内有多少用户连接请求进来,处理了多少请求)

a.安装nginx时将stub_status模块开启,也就是–with-http_stub_status_module

b.修改nginx配置文件(写入要访问的server标签中)
location /nginx_status {
stub_status on; #开启stub_status访问统计
access_log off; #状态统计访问不记录到日志中
}
nginx-web服务器_第1张图片

c.客户端网文网址:http://IP:端口/nginx_status
nginx-web服务器_第2张图片
active connection,表示当前活动连接数
server accepts handled requests,表示当前已处理的连接信息
最后三个数字依次表示:已处理链接数;成功的TCP握手次数;已处理的请求数

2.目录保护

a.原理和apache的目录保护原理一样

b.在需要保护的location中加入
auth_basic “welcome to myNginx!”;
auth_basic_user_file /usr/local/nginx/html/htpasswd.nginx;

c.使用http命令htpasswd进行用户密码文件的创建
htpasswd -c /usr/local/nginx/html/htpasswd.nginx user
#这种生产文件的话需要httpd服务

d.重启nginx并再次访问页面即可。

3.基于IP的身份验证(访问控制)

a.在需要的location中添加:
allow 192.168.1.130;
仅允许这个IP访问
deny 192.168.1.0;
不允许1网段的访问

4.nginx的虚拟主机(基于域名,端口)

a.准备域名,规划好两个网站网页存放目录
www.laoli.com,/usr/local/html/laoli
www.laolicb.com /usr/local/html/laolicb

b.在nginx主配置文件中并列编写两个server标签,并分别写好各自信息
nginx-web服务器_第3张图片

c.分别访问两个不同域名端口的验证结果
在这里插入图片描述

5.nginx的反向代理

代理和反向反历

代理:找别人代替你去完成一件你完不成的事,代理的对象是客户端(例如:代购)。
反向代理:替厂家卖东西的人就叫反向代理,代理的对象是服务器端(例如:烟酒代理)。

a.在另外一台服务器上安装apache,启动并填写测试页面
192.168.1.131
为了方便测试直接yum -y install httpd即可,注意rpm安装的页面位置。

b.在nginx服务器的配置文件中添加(单独写server,单独添加location)
nginx-web服务器_第4张图片

c.重启nginx,并使用客户端访问,这时候访问的内容是apache的页面内容即为成功。

6.负载调度(负载均衡)

负载均衡(Load Balance)其意思就是将任务分摊到多个操作单元进行执行,例如web服务器,FTP服务器、企业关键应用服务器,从而共同完成任务。
nginx-web服务器_第5张图片

a.使用默认的rr轮询算法,修改nginx配置文件
nginx-web服务器_第6张图片

重启nginx,使用客户端访问测试

扩展
rr算法实现加权轮询
upstream bbs{
server 192.168.x.x:80 weight=1;
server 192.168.x.x:80 weight=2;
#加权weight,可以理解是访问第一个服务器1次,访问第二台服务器两次,类似比例。
}

7.nginx实现https(证书+rewrite)

a.安装nginx时,需要将ssl模块开启,–with-http_ssl_module

b.在对应要进行加密的server标签中添加以下内容开启ssl
nginx-web服务器_第7张图片

c.生成证书文件,按照路径放进去
然后出来可以nginx -t检查语法是否正常。
在这里插入图片描述
一切正确就可以进行下一步

d.设置http自动跳转为https
新增以下server标签(利用虚拟主机+rewrite的功能)
nginx-web服务器_第8张图片

e.重启nginx,直接访问http://www.laoli.com,会自动跳转至https即可。

你可能感兴趣的:(Linux教程,服务器,nginx)