• 【web服务】nginx为什么这么受企业欢迎?看完这边文章你就懂了


    ?? 个人简介
    ?? 作者简介:大家好,我是小鹏linux,运维领域创作者,阿里云ACE认证高级工程师??
    ?? 个人主页:小鹏linux??
    ?? 支持我:点赞??+收藏+留言??
    ??格言:你未必出类拔萃,但一定与众不同!??
    ?? 系列专栏:
    ?? 阶段一:windows基础 目前原创16篇
    ?? 阶段二:Linux基础知识 目前原创38篇
    ?? 阶段三:shell基础+shell高级 目前原创23篇
    ?? 阶段四:python基础及自动化应用 目前原创4篇
    ?? 阶段五:Linux网络服务 目前原创1篇
    ?? 阶段六:集群原理及架构 原创未开始
    ?? 阶段七:云计算虚拟化技术 原创未开始

    目录

    一. 讲在Nginx之前

    ???1.同步与异步

    ???1.1实例解释

    ???2.阻塞与非阻塞

    ???2.1实例解释

    ???3.epoll模型

    ???4.为什么Nginx比其他web服务器并发高(Nginx工作原理)

    ???4.1进程管理上的区别

    ???4.2网络IO模型的选择

    ???4.3进程的阻塞方式的区别

    ???4.4模块开发方向不同

    ???5.nginx和apache的差异对比

    ???6.nginx配置文件详解

    ?二.?Nginx详解

    1.概述?

    ???2.工作模式

    ???2.1master-worker

    ???2.2单进程模式

    三.Nginx相关搭建实验

    ???1.yum安装nginx

    ???1.2主配置文件

    ???1.3子配置文件

    ???2.源码包安装nginx

    ???实验1:Nginx的状态统计

    ???实验2:nginx目录保护

    ???实验3:基于IP的身份验证

    ???实验4:nginx的虚拟主机(基于域名)

    ???实验5:nginx的反向代理

    ???实验6:负载调度(负载均衡)

    ???实验7:samba服务-网络共享存储(CIFS文件系统)

    ???实验8:nginx实现https {证书+rewrite}


    一. 讲在Nginx之前

    1.同步与异步

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

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

    **异步:**当一个异步调用发出去后,调用者不必一直等待调用结果的返回,异步调用,要想获得结果,一般有两种方式:

    1、主动轮询异步调用的结果;

    2、被调用方通过callback(回调通知)来通知调用方调用结果。

    1.1实例解释

    **同步取快递:**小明收到快递将送达的短信,在楼下一直等到快递送达。

    **异步取快递:**小明收到快递将送达的短信,快递到楼下后,小明再下楼去取。

    异步取快递,小明知道快递到达楼下有两种方式:

    1、不停的电话问快递小哥到了没有,即主动轮询;

    2、快递小哥到楼下后,打电话通知小明,然后小明下楼取快递,即回调通知。

    **2.**阻塞与非阻塞

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

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

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

    2.1实例解释

    **阻塞取快递:**小明收到快递即将送达的信息后,什么事都不做,一直专门等快递。

    **非阻塞取快递:**小明收到快递即将送达的信息后,等快递的时候,还一边敲代码、一边刷微信。

    同步与异步,重点在于消息通知的方式;阻塞与非阻塞,重点在于等消息时候的行为。

    所以,就有了下面4种组合方式

    1. 同步阻塞:小明收到信息后,啥都不干,等快递;
    2. 同步非阻塞:小明收到信息后,边刷微博,边等着取快递;
    3. 异步阻塞:小明收到信息后,啥都不干,一直等着快递员通知他取快递;
    4. 异步非阻塞:小明收到信息后,边刷着微博,边等快递员通知他取快递。

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

    Nginx采用了异步非阻塞的方式工作。我们先来先了解一下I/O多路复用中的epoll模型。

    3.epoll模型

    当连接有I/O事件产生的时候,epoll就会去告诉进程哪个连接有I/O事件产生,然后进程就去处理这个事件。

    例如:小明家楼下有一个收发室,每次有快递到了,门卫就先代收并做了标记;然后通知小明去取送给小明的快递。

    **4.**为什么Nginx比其他web服务器并发高(Nginx工作原理)

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

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

    4.1进程管理上的区别

    Apache:

    默认采用的是一个主进程 多个工作进程 每个工作进程管理一个线程 每

    个线程管理一个连接

    并发数 = 工作进程数 x 1

    Nginx:

    一个主进程 多个工作进程 每个工作进程管理多个线程(最大到65535)

    并发数 = 工作进程数 x 单进程开启的线程数

    淘宝等电商用的web浏览器 Tengine ,相当与Nginx的换皮,通过nginx开源项目针对电商优化的产品

    4.2网络IO模型的选择

    Apache:select模型

    Nginx:epoll模型

    select就是一个简单的选择模型(如排队请求网络资源,第一个人阻塞住第二个人

    依然要排着)

    epoll更智能的网络管理模型(如排队第一个人阻塞住,会先把第二个人网络的 IO

    请求提交出来)

    4.3进程的阻塞方式的区别

    Apache:同步 阻塞型

    Nginx:异步 非阻塞型

    4.4模块开发方向不同

    Apache:安全模块众多

    Nginx:高性能模块众多

    总结:如果网站并发量不高但是稳定性要求严格,选择Apache(政府网站、

    网络服务——Apache & Nginx

    5.nginx和apache的差异对比

    Apache

    Nginx

    配置繁琐

    配置相对简单

    原生支持动态和静态页面

    支持静态页面

    模块相对安全

    高性能模块出产迅速、社区活跃

    BUG 相对较少,消耗资源较多

    BUG相对较多,节省资源

    对加密支持较好

    反向代理支持较好

    同步阻塞型应用

    异步非阻塞型应用

    6.nginx配置文件详解

    user www www;
    #程序运行用户和组

    worker_processes auto;
    #启动进程,指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般等于cpu核心数目

    error_log /home/wwwlogs/nginx_error.log crit;
    #全局错误日志

    pid /usr/local/nginx/logs/nginx.pid;
    #主进程PID保存文件

    worker_rlimit_nofile 51200;
    #文件描述符数量

    events
    {
    use epoll;
    #使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能

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

    http
    #整体环境配置–网站配置
    {
    include mime.types;
    default_type application/octet-stream;
    #设定mime类型,文件传送类型由mime.type文件定义
    server_names_hash_bucket_size 128;
    #保存服务器名字的hash表大小
    client_header_buffer_size 32k;
    #客户端请求头部缓冲区大小
    large_client_header_buffers 4 32k;
    #最大客户端头缓冲大小
    client_max_body_size 50m;
    #客户端最大上传文件大小(M)

    sendfile on;
    #sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    tcp_nopush on;
    #这个是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。(只在sendfile on时有效)

    keepalive_timeout 60;
    #连接超时时间

    tcp_nodelay on;
    #禁用nagle算法,也即不缓存数据。有效解决网络阻塞

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 256k;
    #fastcgi设置

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application xml+rss;
    gzip_vary on;
    gzip_proxied expired no-cache no-store private auth;
    gzip_disable “MSIE [1-6].”;

    #limit_conn_zone $binary_remote_addr zone=perip:10m;
    ##If enable limit_conn_zone,add “limit_conn perip 10;” to server section.
    server_tokens off;
    #隐藏nginx版本号(curl -I 192.168.4.154可以查看,更加安全)

    #log format
    log_format access '$remote_addr - KaTeX parse error: Undefined control sequence: \[ at position 14: remote\_user \̲[̲time_local] “KaTeX parse error: Double superscript at position 13: request"' '̲status b o d y _ b y t e s _ s e n t " body\_bytes\_sent " body_bytes_sent"http_referer” ’
    ‘“$http_user_agent” $http_x_forwarded_for’;
    #定义日志格式

    server
    {
    listen 80 default_server;
    #listen [::]:80 default_server ipv6only=on;
    #监听80端口,WEB服务的监听设置,可以采用"IP地址:端口"形式
    server_name www.lnmp.org lnmp.org;
    #服务器名,可以写多个域名,用空格分隔
    index index.html index.htm index.php;
    #默认网页文件
    root /home/wwwroot/default;
    #网页主目录

    #error_page 404 /404.html;
    include enable-php.conf;

    location /nginx_status
    {
    stub_status on;
    access_log off;
    }
    #开启status状态监测
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
    {
    expires 30d;
    }
    #静态文件处理,保存期30天
    location ~ .*.(js|css)$
    {
    expires 12h;
    }
    #js和css文件处理,保存期12小时
    location ~ /.
    {
    deny all;
    }

    access_log /home/wwwlogs/access.log access;
    #正确访问日志
    }
    include vhost/*.conf;
    #vhost/下子配置文件生效
    }

    二.Nginx详解

    1.概述

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

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

    2.工作模式

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

    2.1master-worker

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

    1. 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。

    2. 配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能

    3. 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)

    2.2单进程模式

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

    三.N****ginx相关搭建实验

    1.yum安装nginx

    主配置文件:/etc/nginx/nginx.conf

    网站文件存放默认目录 :/usr/share/nginx/html

    <注意事项>

    1. 注意配置文件中的结尾有;作为结束~!(切记!)

    2. 每次实验修改完配置文件后需要热重启nginx才会生效

    # pkill -HUP nginx

    1.1nginx安装流程

    yum -y install wget
    mv  /etc/yum.repos.d/CentOS-Media.repo  /etc/yum.repos.d/CentOS-Media.repo.bak
    cd  /etc/yum.repos.d/
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    yum clean all
    yum makecache
    yum -y install	nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.2********主配置文件

    vim /etc/nginx/nginx.conf
    
    • 1

    1.3********子配置文件

    vim /etc/nginx/conf.d/default.conf	#直接新建,添加下面内容即可
    server {
        listen       80;
        server_name  www.hongfuedu.com;
    
        location / {
            root   /www;
            index  index.html index.htm index.php;
        }
    
        location ~ .php$ {
            root           /www;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /www/$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.源码包安装nginx

    实验准备:CentOS7.6版本192.168.132.163

    [root@localhost ~]# mkdir  /lnmp/
    [root@localhost ~]# cd /lnmp/
    [root@localhost lnmp]# rz -E	#上传nginx-1.21.3.tar.gz源码包
    [root@localhost lnmp]# vim  /etc/shells	#打开文件,在文件末尾添加/sbin/nologin
    [root@localhost lnmp]# useradd -r -s /sbin/nologin nginx	#创建nginx用户
    [root@localhost lnmp]# yum -y install gcc gcc-c++ cmake3 pcre pcre-devel libxml2 libxml2-devel zlib zlib-devel openssl openssl-devel  autoconf automake bison ncurses ncurses-devel php-mcrypt libmcrypt libmcrypt-devel freetype gd libpng libpng-devel libjpeg zlib curl curl-devel re2c net-snmp-devel libjpeg-devel freetype-devel  #解决依赖
    [root@localhost lnmp]# tar -xf nginx-1.21.3.tar.gz 	#解压缩
    [root@localhost lnmp]# cd nginx-1.21.3/
    [root@localhost nginx-1.21.3]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx  --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module	#执行文件
    [root@localhost nginx-1.21.3]# echo $?
    [root@localhost nginx-1.21.3]# make && make install		#编译安装
    [root@localhost nginx-1.21.3]# echo $?
    [root@localhost nginx-1.21.3]# cd  /usr/local/nginx/conf
    [root@localhost conf]# vim nginx.conf		#进入配置文件
    #将#user  nobody;修改为user  nginx nginx;
    #将worker_processes  1;修改为worker_processes  auto;
    [root@localhost conf]# vim  /etc/init.d/nginx		#创建命令管理脚本,添加如下内容:
    #!/bin/bash
    #Author:liu
    #chkconfig: 2345 99 33
    #description: nginx server control tools
    
    ngxc="/usr/local/nginx/sbin/nginx"
    ngxc_fpm="/usr/local/php/sbin/php-fpm"
    case "$1" in
        start)
            $ngxc -t &> /dev/null
            if [ $? -eq 0 ];then
                    $ngxc
                    $ngxc_fpm
                    echo "nginx service start success!"
            else
                    $ngxc -t
            fi
            ;;
        stop)
            $ngxc  -s  stop
            killall  php-fpm
            echo "nginx service stop success!"
            ;;
        restart)
            $0 stop
            $0 start
            ;;
        reload)
            $ngxc -t &> /dev/null
            if [ $? -eq 0 ];then
                   $ngxc  -s  reload
                    pkill  -HUP  php-fpm
                    echo "reload nginx config success!"
            else
                    $ngxc -t
            fi
            ;;
        *)
            echo "please input stop|start|restart|reload."
            exit 1
    esac
    [root@localhost conf]# chmod  +x  /etc/init.d/nginx 		#添加权限
    [root@localhost conf]# service  nginx  start	#测试启动脚本
    [root@localhost conf]# service  nginx  restart	#结束进程,重新加载
    [root@localhost conf]# service  nginx  reload	#不结束进程,只重新加载
    [root@localhost conf]# chkconfig nginx on	#设为开机自启动
    [root@localhost conf]# netstat  -antp		#查看发现nginx的80端口开启了
    [root@localhost conf]# ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin
    [root@localhost conf]# nginx
    [root@localhost conf]# ps  aux | grep nginx		#查看启动了
    [root@localhost conf]# nginx  -s  reload		#重启正常
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    Windows浏览器中输入192.168.132.163访问,发现如下页面,nginx运行正常:

    实验1:Nginx的状态统计

    实验步骤:

    首先安装nginx服务

    [root@localhost ~]# nginx -s stop		停止服务
    [root@localhost ~]# cd /lnmp/nginx-1.21.3/	进入解压后的文件夹
    [root@localhost nginx-1.18.0]# make clean	清空缓存
    [root@localhost nginx-1.18.0]# yum -y install openssl-devel	安装openssl依赖
    [root@localhost nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module	需要什么模块就在执行文件加指向路径后面跟上--with+相应的模块即可
    [root@localhost nginx-1.18.0]# cd /usr/local/nginx/conf/
    [root@localhost conf]# vim nginx.conf	打开主配置文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    搜素/root找到如下图的内容,在光标下方新增一行:

    新增一行下方添加如下内容:

    location /status {
                stub_status on;
                access_log  off;
            }
    [root@localhost conf]# nginx -t	检查配置文件语法错误无错误,如图:
    
    • 1
    • 2
    • 3
    • 4
    • 5

    [root@localhost conf]# nginx -s stop		关闭服务
    [root@localhost conf]# nginx	启动服务。 直接重启可能有些模块不会重新加载,关闭再启动会重新加载所有模块。
    
    • 1
    • 2

    Windows浏览器访问192.168.132.163,访问首页成功,如下图:

    Windows浏览器访问192.168.1321.63/status/访问结果如下图:

    此时状态统计功能开启了,每刷新一次。第三列的数字便会+1,代表的是访问次数,如图:前两列是TCP连接次数,与配置文件中设置的keepalive_timeout=65有关,代表着每65秒会断开TCP连接,所以等到65秒后再刷新页面,会变成2 +2+访问次数,如图

    "Active connections"表示当前的活动连接数;

    "server accepts handled requests"表示已经处理的连接信息

    三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数

    实验2:nginx目录保护

    实验步骤:接上一个实验,对状态统计页面的目录进行保护

    [root@localhost conf]# vim nginx.conf	#打开主配置文件
    
    • 1

    找到如下图内容:

    在access_log off;下方添加如下两行内容:

    auth_basic "Welcome to nginx_status!";
    auth_basic_user_file /usr/local/nginx/conf/htpasswd.status;
    
    [root@localhost conf]# yum -y install httpd	安装Apache,需要用Apache服务中的htpasswd命令
    [root@localhost conf]# htpasswd -c /usr/local/nginx/conf/htpasswd.status lisi	进行用户密码文件的创建	
    [root@localhost conf]# nginx -s reload		重启服务
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    再次用windows浏览器访问192.168.132.163/status/页面,则弹出了需要输入账号密码的页面,如图:

    输入刚刚创建的用户lisi,密码123456就可以进入状态统计页面了。

    实验3:基于IP的身份验证

    实验步骤:接上一个实验进行

    [root@localhost conf]# vim nginx.conf	打开主配置文件
    
    • 1

    找到如图内容:

    在光标下方新增如下内容:

    allow 192.168.132.1;		只允许192.168.132.1访问
    deny 192.168.132.0/24;		不允许132网段的其他所以ip访问
    
    [root@localhost conf]# nginx -t	检查语法错误
    [root@localhost conf]# nginx -s reload		重启服务
    
    • 1
    • 2
    • 3
    • 4
    • 5

    用windows浏览器访问192.168.132.163/status/能访问到输入账号密码界面,输入账号密码后能访问到状态统计页面,再打开一条Linux图形化界面版本,用Linux的浏览器访问192.168.132.163/status/,能访问到输入账号密码界面,输入账号密码后不能访问到状态统计页面。

    实验4:nginx的虚拟主机(基于域名)****

    实验步骤:接上一个实验继续做

    [root@localhost conf]# vim nginx.conf	打开配置文件
    
    • 1

    找到如图中的内容,将其删除

    找到如下图内容,

    将location / { 和 } 删除,删除后如图:

    将如下图中不必要的内容删除:

    删除后如下图:

    然后对上图进行修改:

    将server_name localhost;修改为server_name blog.hongfuedu.com;

    将access_log logs/host.access.log main; 修改为access_log logs/blog.access.log main;

    将root html; 修改为root html/blog;

    修改为如下图:

    将上图7行未注释内容复制粘贴到后面进行修改

    将其中的blog都修改成bbs即可,如图:

    找到如图中的三行内容,将其取消注释,不然会报错

    [root@localhost conf]# cd ../html/	进入到上级目录的html目录中
    [root@localhost html]# mkdir blog  创建指向和绑定域名的网页目录
    [root@localhost html]# mkdir bbs	创建指向和绑定域名的网页目录
    [root@localhost html]# echo "blog..." >> blog/index.html	
    [root@localhost html]# echo "bbs..." >> bbs/index.html
    [root@localhost html]# vim /etc/hosts	进入域名解析文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    新增192.168.132.163 blog.hongfuedu.com和192.168.132.163 bbs.hongfuedu.com两行内容

    在windows的hosts文件中也要添加这两行内容

    用windows的cmd窗口ping blog.hongfuedu.com,可以ping通。说明解析没问题

    [root@localhost html]# nginx -t	检查语法错误
    [root@localhost html]# nginx -s stop	停止服务
    [root@localhost html]# nginx	启动服务
    
    • 1
    • 2
    • 3

    用windows浏览器分别访问blog.hongfuedu.com和bbs.hongfuedu.com,结果如下图:

    a、提前准备好两个网站的域名,并且规划好两个网站网页存放目录

    b、在Nginx主配置文件中并列编写两个server标签,并分别写好各自信息

    server {
    	listen 80;
    	server_name blog.kernel.com;
    	index index.html index.htm index.php;
    	root  html/blog;
    	access_log  logs/blog-access.log  main;
    }
    server {
    	listen 80;
    	server_name bbs.kernel.com;
    	index index.html index.htm index.php;
    	root  html/bbs;
    	access_log  logs/bbs-access.log  main;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    c、分别访问两个不同的域名验证结果

    实验5:nginx的反向代理

    代理和反向代理?

    **代理:**找别人代替你去完成一件你完不成的事(代购),代理的对象是客户端

    **反向代理:**替厂家卖东西的人就叫反向代理(烟酒代理) ,代理的对象是服务器端,

    反向代理+负载均衡:比如windows客户端访问Nginx服务器,然后Nginx服务器将请求转发到后台的服务器组内,实现任务均摊的模式。

    **完全反向代理:**所有的来自客户端的请求都由192.168.88.100服务器来处理

    location / {

    proxy_pass http://192.168.88.100:80;

    }

    部分反向代理:(动静态分离)来自客户端的.php的网页请求才由192.168.88.100服务器来处理

    location .php${

    proxy_pass http://192.168.88.100:80;

    }

    **静态算法:**仅考虑算法本身的工作方式,不考虑后台服务器的运行状况,缺点是很可能导致某些低配置服务器压力过大或者某些高配置服务器闲置。

    **动态算法:**详见负载均衡服务(集群阶段)

    Nginx:高并发特点,一般用于前台接受客户端请求

    Apache:高稳定性特点,一般用于后台处理由Nginx服务请接受并转发过来的来自客户端的请求。

    a、在另外一台机器上安装apache,启动并填写测试页面

    b、在nginx服务器的配置文件中添加(写在某一个网站的server标签内)

    location /{

    proxy_pass http://ip; #此处填写apache服务器的IP地址

    }

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

    实验步骤:

    实验准备四台虚拟机

    1号机:192.168.132.163 Nginx服务器

    2号机:192.168.132.164 Apache服务器1

    3号机:192.168.132.165 Apache服务器2

    4号机:192.168.132.166 2号机和3号机的共享存储服务器

    一号机进行如下操作:

    [root@localhost ~]# yum -y install gcc	pcre-devel	zlib-devel安装上传命令和gcc工具和pcre		扩展包及zlib依赖包
    [root@localhost ~]# rz -E	上传Nginx源码包
    [root@localhost ~]# tar -xvf nginx-1.18.0.tar.gz	解压缩
    [root@localhost ~]# cd nginx-1.18.0/
    [root@localhost nginx-1.18.0]# useradd -r -s /sbin/nologin nginx	创建一个名叫nginx 的运行用户
    [root@localhost nginx-1.18.0]# ./configure --prefix=/usr/local/nginx	执行
    [root@localhost nginx-1.18.0]# make && make install	编译并安装
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二号机进行如下操作:

    [root@localhost ~]# yum -y install httpd	安装papche服务
    [root@localhost ~]# echo "hello-164..." >> /var/www/html/index.html	创建网页目录
    [root@localhost ~]# systemctl start httpd	启动服务
    
    • 1
    • 2
    • 3

    用windows浏览器访问192.168.132.164,结果如图:

    三号机进行如下操作:

    [root@localhost ~]# yum -y install httpd	安装papche服务
    [root@localhost ~]# echo "hello-165..." >> /var/www/html/index.html	创建网页目录
    [root@localhost ~]# systemctl start httpd	启动服务
    
    • 1
    • 2
    • 3

    用windows浏览器访问192.168.132.165,结果如图:

    一号机:

    [root@localhost nginx-1.18.0]# cd /usr/local/nginx/
    [root@localhost nginx]# cd conf/
    [root@localhost conf]# vim nginx.conf	打开nginx配置文件
    
    • 1
    • 2
    • 3

    找到如下图内容:将#user nobody;修改为user nginx;将worker_processes 1;修改为worker_processes auto;

    找到如图中的内容:将# proxy_pass http://127.0.0.1;复制一下

    找到如下图中的内容:将复制到的内容粘贴到index index.html index.htm;下一行取消注释并修改为:

    proxy_pass http://192.168.132.164; (反向代理)

    [root@localhost conf]# ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin	软连接
    [root@localhost conf]# nginx -t
    [root@localhost conf]# nginx
    
    • 1
    • 2
    • 3

    此时再用windows浏览器访问192.168.132.163,结果如下图:

    实验6:负载调度(负载均衡)

    负载均衡(Load Balance)其意思就是将任务分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

    upstream 可以将多台服务器声明成一个服务器组(也叫)

    proxy 反向代理模块,可以代理一台设备或者是一组服务器,模板如下:

    http{

    upstream 服务器组名{

    server 192.168.132.164:80;

    server 192.168.132.165:80;

    }

    server {

    proxy_passhttp://服务器组名;

    }

    }

    实验步骤;在实验五的基础上做

    [root@localhost conf]# vim nginx.conf	打开主配置文件
    
    • 1

    修改为配置文件后如图:

    此时用windows浏览器访问192.168.132.163,发现第一次访问结果为hello-164…,刷新一下之后结果为hello-165…再刷新一下变成了hello-164…再刷新变成了hello-165…,两台Apache服务器依次轮询处理

    添加加权轮询:添加后如图:

    重启一号机Nginx服务:

    [root@localhost conf]# /usr/local/nginx/sbin/nginx -s reload
    
    • 1

    此时再次用windows浏览器访问192.168.132.163,发现第一次访问结果为hello-164…,刷新一下之后结果为hello-165…再刷新一下变成了hello-165…再刷新变成了hello-164…,两台Apache服务器依次轮询加权处理,因为配置文件中Apache服务器1的加权值为1,Apache服务器2的加权值为2,所以windows浏览器访问Nginx服务器时,Apache服务器1代理处理一次,Apache服务器2就代理处理两次。

    **实验7:**samba服务-网络共享存储(CIFS文件系统)

    samba主配置文件:

    配置文件路径:/etc/samba/smb.conf

    配置文件模板:

    [print$]								#共享名,给客户端提供连接的专用名字
            comment = Printer Drivers		#对共享名的描述
            path = /var/lib/samba/drivers   	#共享目录
            write list = @printadmin root		#可写列表,相当于白名单
            writable = Yes					#是否可写
            browseable = Yes				#是否可见
            force group = @printadmin		
            create mask = 0664
            directory mask = 0775
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    实验步骤:在实验56的基础上做

    实验目的:

    将samba服务器的/data目录共享给192.168.132.164机器的/var/www/html/网页目录

    将samba服务器的/data目录共享给192.168.132.165机器的/var/www/html/网页目录

    开启四号机,并安装samba服务:

    [root@axp2 ~]# yum -y install samba
    [root@axp2 ~]# cd /etc/samba/
    [root@axp2 samba]# mkdir /data	创建一个共享目录
    [root@axp2 samba]# vim smb.conf	打开配置文件进行修改
    在文件末尾新增添加如下内容:
    [hf2106]
            comment = 2106 anxiaopeng
            path = /data
            writable = Yes
            browseable = Yes
    [root@axp2 /]# chmod 777 /data/	先给data目录777权限,然后用2号机和3号机测试,获得2号机和三号机的用户	名,然后去掉777权限,利用ACL权限加用户名的方式来使得2号机和3号机可以对data目录拥有w权限
    [root@axp2 /]# useradd lisi	创建用户
    [root@axp2 /]# pdbedit -a lisi	设置samba密码
    [root@axp2 /]# systemctl start smb  启动asmba服务
    二号机安装连接命令:[root@localhost ~]# yum -y install samba-client
    [root@localhost ~]# smbclient -U lisi //192.168.132.166/hf2106
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    ****切记先清空所有机器的防火墙规则!!!****登录4号机的samba存储服务,如图:

    登录samba之后ls查看一下是空的,然后put 文件名上传一个文件,ls查看一下上传成功了,如图:

    一般情况下要将samba服务器挂载到三号机和三号机的本地,命令:

    永久挂载:/etc/fstab:

    //服务器ip/服务器共享 /本地挂载目录 cifs defaults,username=xxx,password=xxx 0 0

    在2号机内进行如下操作:

    [root@localhost ~]# vim /etc/fstab	文件末尾新增一行添加:
    //192.168.132.166/hf2106        /var/www/html   cifs    defaults,username=lisi,password=123456  0       0
    [root@localhost ~]# df -h 发现还未挂载
    [root@localhost ~]# mount -a
    [root@localhost ~]# df -h	发现挂载成功
    [root@localhost ~]# cd /var/www/html/
    [root@localhost html]# touch index.html	
    [root@localhost html]# echo "hello world" >> index.html	准备进行测试
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Windows浏览器访问192.168.132.163继续刷新,发现会有hello world输出

    登录三号机安装命令:

    [root@localhost ~]# yum -y install samba-client
    [root@localhost ~]# smbclient -U lisi //192.168.132.166/hf2106
    
    • 1
    • 2

    登录samba服务的存储服务

    Ls查看一下发现有2号机上传的文件anaconda-ks.cfg和创建的index.html文件,如图:

    [root@localhost ~]# vim /etc/fstab	永久挂载,添加:
    //192.168.132.166/hf2106        /var/www/html   cifs    defaults,username=lisi,password=123456  0       0
    [root@localhost ~]# mount -a
    [root@localhost ~]# df -h
    [root@localhost ~]# cd /var/www/html/
    [root@localhost html]# touch index.html
    [root@localhost html]# echo "nihao pengyou" >> index.html	准备进行测试
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Windows浏览器访问192.168.132.163继续刷新,输出如下:

    登录4号机

    [root@axp2 /]# cd /data/	进入data目录
    [root@axp2 data]# ls		查看有index.html文件
    [root@axp2 data]# cat index.html	查看文件内容,发现有如下内容:
    
    • 1
    • 2
    • 3

    说明samba共享存储已实现!

    实验8:nginx实现https {证书+rewrite}

    实验步骤:

    实验准备,基于实验四,并在主配置文件中添加反向代理和负载均衡内容,如图:

    先找到如下图三行反向代理模块,将其注释掉,记得检查所有的括号是不是成对的。

    [root@blog conf]# nginx -t	检查配置文件语法
    [root@blog conf]# nginx -s reload	重启
    
    • 1
    • 2

    用windows浏览器访问blog.hongfuedu.com ,访问结果如下,说明反向代理已关闭

    [root@blog conf]# vim nginx.conf	打开主配置文件
    
    • 1

    找到加密模块并将其取消注释,如下图:

    进行修改,将server_name localhost;修改为server_name blog.hongfuedu.com;、

    将root html;修改为root html/blog;

    location / { 可以删除掉,然后进行整理,整理后的内容如下:

    [root@blog conf]# mkdir ssl
    [root@blog conf]# cd ssl/
    [root@blog ssl]# openssl genrsa -out blog.key 1024	生成密钥文件
    [root@blog ssl]# openssl req -new -key blog.key -out blog.csr	生成未签字证书
    [root@blog ssl]# openssl x509 -req -days 365 -sha256 -in blog.csr -signkey blog.key -out blog.crt生成签字证书
    [root@blog ssl]# ls	查看一下有三个文件生成
    [root@blog ssl]# cd ..
    [root@blog conf]# vim nginx.conf	打开配置文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    找到如下图内容进行修改:

    将ssl_certificate cert.pem;修改为ssl_certificate ssl/blog.crt;

    将ssl_certificate_key cert.key;修改为ssl_certificate_key ssl/blog.key;

    [root@blog conf]# nginx -t	检查配置文件语法错误
    [root@blog conf]# nginx -s reload	重启服务
    
    • 1
    • 2

    用windows浏览器访问https://blog.hongfuedu.com,访问成功,结果如下:

    [root@blog conf]# vim nginx.conf	打开配置文件
    
    • 1

    找到如下图所在的内容,在access_log logs/blog.access.log main;下一行添加:

    rewrite ^(.*)$ https://blog.hongfuedu.com/$1;

    [root@blog conf]# nginx -t	检查配置文件语法错误
    [root@blog conf]# nginx -s reload	重启服务
    
    • 1
    • 2

    再用windows浏览器访问http://blog.hongfuedu.com,但是访问成功后域名强制变成了https://blog.hongfuedu.com,如下图:

    喜欢的请来个三连支持一下吧,谢谢谢谢!!!

    您的支持是我最大的动力!!!

    ???福利来啦!???

    最后!!!

    给大家来一波福利:微信关注公众号“优加实习”,vip通道提供各种大厂实习机会

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    【Javascript】编写⼀个函数,排列任意元素个数的数字数组,按从⼩到⼤顺序输出
    5G与无人驾驶:引领未来交通的新潮流
    Linux高性能服务器——定时器
    【数据加密、解密】前后端数据传输的过程中,如何进行数据加密传输,保证数据的传输安全,防止被他人窃取
    Redis 管道
    使用 goland 开发 golang 项目环境配置
    ssm+vue+elementUI基于微信小程序的电动电动汽车车智能充电桩服务平台-计算机毕业设计
    (二)linux文件的基本属性
    Dive into TensorFlow系列(1)-静态图运行原理
    解决在CMD中执行python脚本时显示No module named ‘requests‘的问题
  • 原文地址:https://blog.csdn.net/m0_67391683/article/details/126080702