RHCE --- 第三节

第四章 Web服务器(1)

1.www简介

Web网络服务也叫WWW(World Wide Web 全球信息广播)万维网服务,一般是指能够用户 通过浏览器访问到互联网中文档等资源服务

用于提供服务程序的 Web 服务器会通过 HTTP(超文本传输协议)或 HTTPS(安全超文本 传输协议)把请求的内容传送给用户,如图:

常见Web服务程序介绍:

Windows系统中默认Web服务程序是 IIS(Internet Infirmation Services),这是一款图形化的网站管理工具,IIS 程序不光能提供Web网站服务,还能够提供FTP、NMTP、SMTP等服务功能,但只能在Windows系统中使用

2004年10月4日,为俄罗斯知名门户站点而开发的 Web 服务程序 Nginx 横空出世;Nginx 程序作为一款轻量级的网站服务软件,因其稳定性和丰富的功能而快速占领服务器市场,但Nginx最被认可的还当是低系统资源占用、内存少且并发能力强,因此得到了国内诸如新浪、网易、腾讯等门户站的青睐

Apache --- 取自美国印第安人土著语Apache,寓意着拥有高超的作战策略和无穷的耐性,由于其跨平台和安全性广泛被认可且拥有快速、可靠、简单的API扩展;目前拥有很高的Web服务软件市场占用率,全球使用最多的Web服务软件,开源,跨平台(可运行于Unix,linux,windows中)

Tomcat --- 属于轻量级的Web服务软件,一般用于开发和调试JSP代码,通常认为Tomcat是Apache的扩展程序

服务器主机

网站是由域名、网页源程序和主机空间组成的,其中主机空间则是用于存放网页源代码并能够将网页内容展示给用户,虽然本小节与Apache服务没有直接关系,但如果你想要在互联网中搭建网站并被顺利访问,主机空间一定不能选错

虚拟主机:在一台服务器中分出一定的磁盘空间供用户放置网站、存放数据等,仅提供基础的网站访问、数据存放与传输流量功能,能够极大的降低用户费用,也几乎不需要管理员维护除网站数据以外的服务,适合小型网站

VPS(Virtual Private Server):在一台服务器中利用OpenVZ、Xen或KVM等虚拟化技术模拟出多个"主机",每个主机都有独立的IP地址、操作系统,实现不同VPS之间磁盘空间、内存、CPU资源、进程与系统配置间的完全隔离,管理员可自由使用分配到的主机中的所有资源,所有需要有一定的维护系统的能力,适合小型网站

云服务器(ECS):是一种整合了计算、存储、网络,能够做到弹性伸缩的计算服务,其使用起来与VPS几乎一样,但差别是云服务器建立在一组集群服务器中,每个服务器都会保存一个主机的镜像(备份),大大的提升了安全稳定性,另外还具备了灵活性与扩展性,用户只需按使用量付费的即可,适合大中小型网站

独立服务器:这台服务器仅提供给你使用,详细来讲又可以区分为租用方式与托管方式

租用方式:用户只需将硬件配置要求告知IDC服务商,服务器硬件设备由机房负责维护,运 维管理员一般需要自行安装相应的软件并部署网站服务,租期可以为月、季、年,减轻了 用户初期对硬件设备的投入,适合大中型网站

托管方式:用户需要自行购置服务器后交给IDC服务器供应商的机房进行管理(缴纳管理服 务费用),用户对服务器硬件配置有完全的控制权,自主性强,但需要自行维护、修理服务 器硬件设备,适合大中型网站

主要数据

服务器所提供的最主要数据是超文本标记语言(Hyper Text Markup Language,HTML)、多媒体文件(图片、影像、声音、文字等,都属于多媒体或称为超媒体),HTML只是一些纯文本数据,通过所谓的标记来规范所要显示的数据格式

浏览器

客户端收到服务器的数据之后需要软件解析服务器所提供的数据,最后将效果呈现在用户的屏幕上,那么著名的浏览器就有内建在Windows操作系统内的IE浏览器(淘汰)和Microsoft Edge,还有Firefox浏览器和Google的chrome浏览器

网址及HTTP简介

web服务器提供的这些数据大部分都是文件,那么我们需要在服务器端先将数据文件写好,并且放置在某个特殊的目录下面,这个目录就是我们整个网站的首页,在redhat中,这个目录默认在/var/www/html;浏览器就是通过你在地址栏中输入你所需要的网址来取得这个目录的数据的

URL

Uniform Rescource Locator,统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址

网址格式:<协议>://<主机或主机名>[:port]/<目录资源,路径>

协议::http、https、ftp等

主机地址或主机名:主机地址就是服务器在因特网所在的IP地址;如果是主机名的话,那么就需要域名解析

端口号(port):http为80,(IANA:互联网数字分配机构)

0-1023:永久的分配给固定的应用程序使用

1024-41951:注册端口,但要求不是特别严格,分配给程序注册为某应用使用

41952-60000:客户端程序随机使用的端口,动态端口,或私有端口

http请求方法:

工作机制:

在http通信中,每个http请求报文都包含一个方法,用以告诉web服务器端需要执行哪些具体的动作,这些动作包括:获取指定web页面、提交内容到服务器、删除服务器上资源文件等。

状态代码:由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值

1xx:指示信息 ------ 表示请求已接收,继续处理

2xx:成功 ------ 表示请求已被成功接收、理解

3xx:重定向 ------ 要完成请求必须进行更进一步的操作

4xx:客户端错误 ------ 请求有语法错误或请求无法实现

5xx:服务器端错误 ------ 服务器未能实现合法的请求

常见状态代码、状态描述的说明如下:

200 OK:客户端请求成功

400 Bad Request:客户端请求有语法错误,不能被服务器所理解

401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起 使用

403 Forbidden:服务器收到请求,但是拒绝提供服务

404 Not Found:请求资源不存在,举个例子:输入了错误的URL

500 Internal Server Error:服务器发生不可预期的错误

503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常

HTTP协议请求的工作流程:

特点

www服务器的类型

静态网站

仅提供用户浏览的单向静态网页,单纯是由服务器单向提供数据给客户端,Server不需要与client端有互动,可以浏览网站,但是无法数据上传。

动态网站

该站可以让服务器与用户互动,常见的例如留言板,博客。这种类型的网站需要通过"网页程序语言"来实现与用户互动的行为。常见的例如:PHP网页程序语言,配合数据库系统来进行数据的读、写。当你在向服务器请求数据时,其实是通过服务器端同一个网页程序在负责将数据读出或写入数据库,变动的是数据库的内容,网页程序并没有任何改变。

另外一种交互式的动态网页主要是在客户端实现。服务端将可执行的程序代码(JavaScript)传送给客户端,客户端的浏览器如果提供JavaScript的功能,那么该程序就可以在客户端的计算机上面工作了;另外一种可在客户端执行的就是flash动画格式,在这种动画格式内还可以进行程序设计。

使用nginx搭建web网站

nginx简介

概念

特点

nginx架构

注意:默认情况下,nginx会建立和服务器CPU核心数相等的worker进程,woker进程之间相互独立,若一个进程故障不会影响其它进程

nginx关键工作机制

抢占机制:当客户端发起请求时,会激活accept_mutex互斥锁,那个worker抢占了该互斥 锁,该客户端的请求就由那个worker响应和处理

异步非阻塞模式:在传统事件处理模式下,如果所有的worker被客户端阻塞后,新来的客户 就需要等待,直到原来的客户端释放worker后才能被处理请求,在异步非阻塞模式下,底层 使用了linux的epoll模型,就算worker被阻塞,新的客户端请求也会被正常处理

nginx正向代理功能

分析:它的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问 一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服 务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我,从网站的 角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用 户的资料,这取决于代理告不告诉网站。

nginx反向代理功能

理解:

A租房人(客户端)想租C真实房东的房子,但不认识C真实房东(服务端)

B房产中介(代理)认识C真实房东(服务端),并且从C真实房东(服务端)租到了房

A租房人(客户端)通过B房产中介(代理)租到了C真实房东(服务端)的房

C真实房东(服务端)只知道房子租给了B房产中介(代理),并不知道A租房人(客户 端)租了自己的房子

结论:正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。就像要访问google用vpn代理翻墙去访问(用户知道要访问真正的服务器)

nginx反向代理功能

分析:反向代理正好相反,它也是在客户端和服务器端的一个代理服务器,但是这个代理服务器的目的是用来保护服务器端的,当外网客户端来访问我们的服务器时为了避免暴露应用服务器的实际ip地址,我们会让客端访问代理服务器,然后代理服务器再根据客户端的请求去实际的应用服务器获取响应内容并返回客户端

代理的总结
nginx负载均衡功能

2.2.部署Nginx

bash 复制代码
[root@master ~]# setenforce 0 # 临时关闭
[root@master ~]# systemctl stop firewalld # 临时关闭防火墙
[root@master ~]# systemctl disable firewalld # 关闭防火墙自启
[root@master ~]# yum install nginx -y # 安装nginx
[root@master ~]# nginx -v # 查看版本、编译器、配置参数等信息
[root@master ~]# systemctl start nginx # 启动Niginx
[root@master ~]# systemctl enable nginx # 设置开机启动
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@master ~]# systemctl status nginx # 查看状态,q键退出
[root@master ~]# ps -ef | grep nginx # 查看进程
root        5326       1  0 22:43 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx       5327    5326  0 22:43 ?        00:00:00 nginx: worker process
nginx       5329    5326  0 22:43 ?        00:00:00 nginx: worker process
nginx       5330    5326  0 22:43 ?        00:00:00 nginx: worker process
nginx       5331    5326  0 22:43 ?        00:00:00 nginx: worker process
root        5369    5172  0 22:46 pts/0    00:00:00 grep --color=auto nginx
# 测试Windows中打开浏览器输入服务器IP地址

2.3.常用命令

2.3.1.systemctl系列

bash 复制代码
[root@master ~]# systemctl start nginx # 启动服务
[root@master ~]# systemctl restart nginx # 重启服务
[root@master ~]# systemctl enable nginx # 开启启动
[root@master ~]# systemctl stop nginx # 停止服务
[root@master ~]# systemctl disable nginx # 取消开机启动
[root@master ~]# systemctl status nginx # 查看状态

2.3.2.nginx自带命令

bash 复制代码
[root@master ~]# nginx # 启动nginx
[root@master ~]# nginx restart # 重启服务
[root@master ~]# nginx -s reload # 重新加载配置文件
[root@master ~]# nginx -s stop # 强行停止服务
[root@master ~]# nginx -s quit # 所有请求处理完后退出服务
[root@master ~]# nginx -v # 查看版本号
[root@master ~]# nginx -t # 检查配置文件的语法错误,无错返回OK

2.4.nginx配置文件

bash 复制代码
[root@master ~]# cd /etc/nginx # 服务目录
[root@master nginx]# yum install tree -y # 安装目录树服务软件
[root@master nginx]# tree # 输出当前目录的树形结构
.
├── conf.d # 子配置文件
├── default.d
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── koi-utf # KOI8-R编码(俄语)转换的映射文件
├── koi-win # KOI8-R编码(俄语)转换的映射文件
├── mime_mailcap.types # 配置支持的媒体类型
├── mime.types # 样例文件
├── mime.types.default # 主配置文件
├── nginx.conf # 样例文件
├── nginx.conf.default
├── scgi_params
├── scgi_params.default
├── uwsgi_params
├── uwsgi_params.default
└── win-utf # KOI8-R编码(俄语)转换的映射文件

2 directories, 16 files
网页默认目录:/usr/share/nginx/html
访问日志:/var/log/nginx/access.log
错误日志:/var/log/nginx/error.log

2.5.主配置文件

bash 复制代码
[root@master ~]# vim /etc/nginx nginx.conf # 查看主配置文件

2.5.1.结构

2.5.2.分析

层级结构图

配置分析

bash 复制代码
# main配置段(全局配置)
user nginx; # 运行的账户,默认即是nginx,可以不进行设置
worker_processes auto; # worker进程数,根据硬件调整,通常等于CPU数量或者2倍于CPU
error_log /var/log/nginx/error.log; # 错误日志存放目录
pid /run/nginx.pid; # 指定运行Nginx master主进程的pid文件存放路径

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf; # 导出的外部文件位置
# events配置段,性能模块设置,其中可以设置时间处理模式
events {
    use epoll; # 使用epoll事件驱动模型,但不推荐配置它,让nginx自己选择
    worker_connections 1024; # 每个进程的最大连接数量(并发数)
    accept_mutex on # 默认是off关闭的,这里推荐打开
}
# http配置段,包含全局快和server块,使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http {
    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; # 高效文件传输模式,默认开启
    tcp_nopush          on; # 性能优化参数,数据是否立刻发送
    tcp_nodelay         on; # 性能优化参数,小数据包是否延迟发送
    keepalive_timeout   65; # 超时时间
    types_hash_max_size 4096; # 性能优化参数,影响散列表的冲率

    include             /etc/nginx/mime.types; # 可解析的静态资源类型
    default_type        application/octet-stream; # 默认文件类型

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf; # 加载子配置项

    server {
        listen       80; # 监听IPV4端口
        listen       [::]:80; # 监听IPV6端口
        server_name  _; # 访问的域名
        root         /usr/share/nginx/html; # 网页默认目录
        
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf; # 子配置文件存储路径
        # location配置段,一般用来匹配不同的URI请求
        location / {
        root   /usr/share/nginx/html; # 相对路径网站根目录
        alias  /usr/share/nginx/html/; # 绝对路径网站根目录
        index  index.html index.htm; # 默认首页文件 
        deny 192.168.182.147; # 禁止访问的ip地址,可以为all 
        dney 192.168.182.148; # 允许访问的ip地址,可以为all
        autoindex  on; # 开启目录文件列表
        autoindex_exact_size on; # 显示出文件的确切大小,单位是bytes 
        autoindex_localtime on; # 显示的文件时间为文件的服务器时间 
        charset utf-8,gbk; # 避免中文乱码  
        auth_basic "xxxx"; # 加密网页验证时的提示信息   
        auth_basic_user_file   /路径/文件名; # 加密网页使用的密码验证文件  
        error_page 404 /404.html; # 404时返回给客户端的页面
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html; # 50x错误返回给客户端的页面
            location = /50x.html {
        }
    }

# Settings for a TLS enabled server. # https虚拟主机定义
#
#    server {
#        listen       443 ssl http2; # 监听的IPV4端口
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html; # 网页默认目录
#
#        ssl_certificate "/etc/pki/nginx/server.crt"; # 证书存储路径
#        ssl_certificate_key "/etc/pki/nginx/private/server.key"; # 密钥存储
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#    }

}
注意

server_name指令一般用于指定虚拟主机的域名,在匹配时有以下四中写法

精确匹配:server_name http://www.nginx.com ;

左侧匹配:server_name *.http://nginx.com ;

右侧匹配:server_name www.nginx.* ;

正则匹配:server_name ~^www.nginx.*$ ;

注:匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配

root指令与alias指令区别

root指令用于静态资源目录位置,它可以写在 http 、 server 、 location 等配置中,root指令定义的路径会与 URI 叠加产生最终访问路径,如:

bash 复制代码
location /image {
  root /opt/nginx/static;
}

# 当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png

alias也是指定静态资源目录位置,但只能访问指定的绝对路径,不会叠加目录,只能写在 location 中且末尾一定要添加 / , 如:

bash 复制代码
location /image {
  alias /opt/nginx/static/image/;
}

#当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png

location匹配路径

格式:

bash 复制代码
location   [ = | ~ | ~* | ^~ ] uri {
  ...
}

匹配规则:

= 精确匹配;

~ 正则匹配,区分大小写;

~* 正则匹配,不区分大小写;

^~ 匹配以某个字符串开头,不是正则匹配;

/ 通用匹配,如果没有其它匹配,任何请求都会匹配到

注:匹配优先级:= > ^~ > ~ > ~* > 不带任何字符。

示例

bash 复制代码
server {
  listen  80;
  server_name  www.nginx-test.com;

  # 只有当访问 www.nginx-test.com/match_all/ 时才会匹配到/usr/share/nginx/html/match_all/index.html
  location = /match_all/ {
      root  /usr/share/nginx/html
      index index.html
  }

  # 当访问 www.nginx-test.com/1.jpg 等路径时会去 /usr/share/nginx/images/1.jpg 找对应的资源
  location ~ \.(jpeg|jpg|png|svg)$ {   
    root /usr/share/nginx/images;
  }

  # 当访问 www.nginx-test.com/bbsapp/ 时会匹配上 /usr/share/nginx/html/bbs/index.html
  location ^~ /bbs/ {
    root /usr/share/nginx/html;   
    index index.html index.htm;
  }
}

# 注意:
location / {
    root html;
    index index.html index.htm;
  }
# 其/不是根目录而是统统都匹配到指定路径,而指定路径为html ,即nginx的默认网页目录/usr/share/nginx/html

uri的斜线,如:

bash 复制代码
location /test {      # 尾部无/
    ...
}

location /test/ {
  ...
}

不带 / 当访问 http://www.nginx-test.com/test 时, Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html ;如果没有 test 目录, nginx则会找是否有 test 文件。

带 / 当访问 http://www.nginx-test.com/test/时, Nginx先找是否有 test 目录,如果有则找 test 目录下的 index.html ,如果没有它也不会去找是否存在 test 文件。

nginx.conf 配置文件的语法规则

配置文件由指令与指令块构成

每条指令以 ";" 分号结尾,指令与参数间以空格符号分隔

指令块以 {} 大括号将多条指令组织在一起

include 语句允许组合多个配置文件以提升可维护性

通过 # 符号添加注释,提高可读性

通过 $ 符号使用变量

部分指令的参数支持正则表达式,例如常用的 location 指令

实验操作

实验1

快速搭建网站

bash 复制代码
[root@master ~]# yum install nginx -y
[root@master ~]# echo "welcome to www.openlab.com" > /usr/share/nginx/html/index.html # 写入网页数据
[root@master ~]# systemctl restart nginx
# 打开windows中打开火狐浏览器输入主机IP测试
bash 复制代码
# 或者通过curl命令查看网站的网页数据,验证网站是否能访问
[root@master ~]# curl 192.168.182.147
welcome to www.openlab.com

实验2

替换网页目录

bash 复制代码
[root@master ~]# yum install nginx -y
# 新建网页存储目录
[root@master ~]# mkdir -p /www/sxhkt # 网页存储目录不能放在/root下
# 使用xftp将windows端的sxhkt文件夹中的数据上传到Linux端的/www/sxhkt目录内
[root@master ~]# vim /etc/nginx/nginx.conf
# 定位第42行,修改如下:
root         /www/sxhkt;
[root@master ~]# systemctl restart nginx # 重启服务
# 测试:打开windows端浏览器输入服务端IP地址

实验3

搭建网站使用花生壳的内网穿透实现公网访问

第一步:准备工作

bash 复制代码
[root@master ~]# setenforce 0 # 临时关闭SELinux
[root@master ~]# systemctl stop firewalld # 临时关闭防火墙
[root@master ~]# systemctl disable firewalld # 禁用防火墙开机自启
[root@master ~]# yum install nginx -y # 安装Nginx
[root@master ~]# systemctl start nginx # 启动Nginx
[root@master ~]# systemctl enable nginx # 设置开机自启 

第二步:搭建网站

bash 复制代码
# 新建网页存储目录
[root@master ~]# mkdir -p /www/zy 
# 使用xftp将zy网站数据上传到linux的/www/zy目录中
[root@master ~]# vim /etc/nginx/nginx.conf   
# server端中使用location模块
server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        location / {
        root         /www/zy;
        index   index.html      index.htm;
        }
[root@master ~]# systemctl restart nginx # 重启服务
# 测试:打开windows端浏览器输入服务端IP地址

第三步:使用花生壳进行内网穿透

bash 复制代码
# 注册,登录,完成身份证的实名认证
bash 复制代码
# 内网穿透第一步
# 创建内网映射,如下:
# 应用名称:自定
# 映射类型:https
# 外网域名:系统指定,不能更改
# 外网端口:443,默认
# 内网主机:本机linux服务的IP地址
# 内网端口:本地linux端的http端口,默认80
bash 复制代码
# 内网穿透第二步,linux系统安装花生壳客户端
# 下载客户端,选择应用平台RedHat,"点击复制"
bash 复制代码
# 客户端下载
[root@server ~]# yum  install  net-tools  -y # 安装网络工具包可以使用netstat
[root@server ~]# wget "https://dl.oray.com/hsk/linux/phddns_5.2.0_amd64.rpm" -O phddns_5.2.0_amd64.rpm # 客户端安装
[root@server ~]# rpm  -ivh  phddns_5.2.0_amd64.rpm 
[root@server ~]# phddns  start # 启动
# 复制下图"右下角的网址"
# 重新打开浏览器,输入http://b.oray.com,完成账户登录,激活
bash 复制代码
# 登录激活后花生壳的管理平台效果:
bash 复制代码
# 点击绿色公网域名访问网站:https://40a09234i8.imdo.co/

使用cpolar实现内网穿透

使用nginx建立网站

部署文档:https://dashboard.cpolar.com/get-started

实验4

搭建密码验证功能来访问网站数据

第一步:准备工作

bash 复制代码
[root@master ~]# setenforce 0
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# yum install nginx httpd-tools -y
[root@master ~]# systemctl start nginx
[root@master ~]# systemctl enable nginx

第二步:新建用户

bash 复制代码
[root@master ~]# useradd t1
[root@master ~]# passwd t1
更改用户 t1 的密码 。
新的密码: 
无效的密码: 密码少于 8 个字符
重新输入新的密码: 
passwd:所有的身份验证令牌已经成功更新。

第三步:增加密码访问控制

bash 复制代码
[root@master ~]# htpasswd -c /etc/nginx/passwd t1
New password: # 密码123456
Re-type new password: 
Adding password for user t1
# htpasswd:生成密码数据的命令
# -c:表示第一次生成,会创建存储密码的文件,第二次创建密码时不能增加-c参数,否则会覆盖
# /etc/httpd/passwd:存储访问网站的密码文件,passwd为文件名,名称可以自定
# t1:需要验证密码访问的账户名称

第四步:设置访问网站时需要验证密码

bash 复制代码
[root@master ~]# mkdir /www
# 使用xftp将zy网页上传到/www 
[root@master ~]# vim /etc/nginx/nginx.conf
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /www/zy;

        auth_basic      "Please input password";
        auth_basic_user_file    /etc/nginx/passwd;

[root@master ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

第五步:重启服务,测试

bash 复制代码
[root@master ~]# systemctl restart nginx
# 打开windows浏览器输入192.168.182.149时会有验证密码的对话框弹出,输入密码验证访问

实验5

新建文件目录==列表==的网站,用于下载数据

第一步:安装nginx

bash 复制代码
# 恢复快照
[root@master ~]# setenforce 0
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# yum install nginx -y
[root@master ~]# systemctl start nginx # 启动httpd
[root@master ~]# systemctl enable nginx # 设置开机启动

第二步:配置文件

bash 复制代码
[root@master ~]# vim /etc/nginx/nginx.conf
    server {
        listen       80;
        listen       [::]:80;
        root         /vat/log; # 选择一个开放的目录用于查看并下载
        autoindex    on; # 开启目录访问列表

第三步:重启服务测试

bash 复制代码
[root@master ~]# systemctl restart nginx

实验6

nginx负载均衡

环境准备:至少 3 台 Linux 服务器

1 台作为 Nginx 负载均衡器(LB)

2 台作为 后端应用服务器(Web/APP)

负载均衡算法(替换默认轮询)

权重轮询upstream backend_servers { server 后端1的IP weight=2; server 后端2的IP weight=1;}(权重比 2:1,后端 1 接收更多请求)

IP 哈希upstream backend_servers { ip_hash; server 后端1的IP; server 后端2的IP; }(同一客户端 IP 固定访问同一后端,适用于会话保持)

最少连接upstream backend_servers { least_conn; server 后端1的IP; server 后端2的IP; }(请求分发到连接数最少的后端)

第一步:所有主机安装nginx

bash 复制代码
[root@master ~]# yum install nginx -y

第二步:后端2台主机部署网站

bash 复制代码
# node1操作
[root@master ~]# mkdir -p /www/test
[root@master ~]# echo "第一台机子,192.168.182.149." > index.html
[root@master ~]# vim /etc/nginx/nginx.conf
        root         /www/test;
[root@master ~]# systemctl enable --now nginx
bash 复制代码
# node2操作
[root@master ~]# mkdir -p /www/test
[root@master ~]# echo "第二台机子,192.168.182.150." > index.html
[root@master ~]# vim /etc/nginx/nginx.conf
        root         /www/test;
[root@master ~]# systemctl enable --now nginx

第三步:配置Nginx负载均衡器(核心步骤)

bash 复制代码
[root@master ~]# vim /etc/nginx/nginx.conf
http {
   upstream backend_servers {
        # 后端服务器1(weight=1,表示权重,默认轮询)
        server 192.168.182.149 weight=1 max_fails=3 fail_timeout=30s;
        # 后端服务器2(weight=1,权重相同则轮询)
        server 192.168.182.150 weight=1 max_fails=3 fail_timeout=30s;
        # max_fails=3:3次请求失败视为节点故障
        # fail_timeout=30s:故障节点30秒后重试
    }
    server {
        listen       80;
        server_name  192.168.182.147;
        location / {
                proxy_pass      http://backend_servers; # 对应upstream名称
                # 可选:传递客户端真实IP(后端服务器可获取客户端IP)
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}
[root@master ~]# systemctl enable --now nginx
指令 主要用途 适用场景
Host $host 传递客户端请求的域名 后端是虚拟主机(多网站共享一个 IP)
X-Real-IP $remote_addr 传递客户端真实 IP 单级代理,需要简单记录客户端 IP
X-Forwarded-For $proxy_add_x_forwarded_for 传递完整的代理链路 IP 多级代理(如 CDN + Nginx),需要追溯请求来源

第四步:Windows的命令行中测试

bash 复制代码
C:\Users\Administrator>curl  192.168.182.147
第二台机子,192.168.182.149.

C:\Users\Administrator>curl  192.168.182.147
第一台机子,192.168.182.150.

C:\Users\Administrator>curl  192.168.182.147
第二台机子,192.168.182。149.

C:\Users\Administrator>curl  192.168.182.147
第一台机子,192.168.182.150.

虚拟主机功能

概述

如果每台运行 Linux 系统的服务器上只能运行一个网站,那么人气低、流量小的草根站长就要被迫承担着高昂的服务器租赁费用了,这显然也会造成硬件资源的浪费。在虚拟专用服务器(Virtual Private Sever,VPS)与云计算技术诞生以前,IDC 服务供应商为了能够更充分地利用服务器资源,同时也为了降低购买门槛,于是纷纷启用了虚拟主机功能

利用虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个"虚拟的服务器"。但是,该技术无法实现目前云主机技术的硬件资源隔离

nginx务器基于用户请求的不同 IP 地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术,也就是说用户请求的方式不同,最终获取到的网页内容也各不相同

基于 IP 地址的虚拟主机

原理

如果一台服务器有多个IP地址,而且每个IP地址与服务器上部署的每个网站一一对应,当用户请求的IP地址不同,则会访问到不同网页,且每个网站都有一个独立的IP地址。(常用)

注意:主机必须有多个IP地址

实验6

增加多个IP地址,实现基于不同IP地址的虚拟主机功能

第一步:准备工作

bash 复制代码
# 恢复快照
[root@master ~]# setenforce 0
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# yum install nginx -y
[root@master ~]# systemctl start nginx # 启动httpd
[root@master ~]# systemctl enable nginx # 设置开机启动
# 给网卡增加2个IP地址
[root@master ~]# nmcli c modify ens32 +ipv4.addresses 192.168.182.151/24
[root@master ~]# nmcli c modify ens32 +ipv4.addresses 192.168.182.152/24
[root@master ~]# nmcli c reload
[root@master ~]# nmcli c up ens32
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:0b:3b:53 brd ff:ff:ff:ff:ff:ff
    inet 192.168.182.147/24 brd 192.168.182.255 scope global noprefixroute ens32
       valid_lft forever preferred_lft forever
    inet 192.168.182.151/24 brd 192.168.182.255 scope global secondary noprefixroute ens32
       valid_lft forever preferred_lft forever
    inet 192.168.182.152/24 brd 192.168.182.255 scope global secondary noprefixroute ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe0b:3b53/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

第二步:新建2个存储网页的目录,写入网页文件

bash 复制代码
[root@master ~]# mkdir -p /www/ip151
[root@master ~]# mkdir -p /www/ip152
[root@master ~]# echo "ip151" > /www/ip151/index.html
[root@master ~]# echo "ip152" > /www/ip152/index.html

第三步:修改配置文件,建立基于IP地址的虚拟主机

bash 复制代码
# 在/etc/nginx/conf.d目录下建立子配置文件实现,更加精简,执行时会被主配置文件加载
[root@master ~]# vim /etc/nginx/conf.d/vshost.conf
server {
        listen  80;
        server_name     192.168.182.151;
        root    /www/ip151;
        }
server{
        listen  80;
        server_name     192.168.182.152;
        root    /www/ip152;
        }

第四步:重启服务,测试

bash 复制代码
[root@master ~]# nginx -t
[root@master ~]# systemctl restart nginx # 重启服务
[root@master ~]# curl 192.168.182.151 # 测试网页
ip151
[root@master ~]# curl 192.168.182.152
ip152

基于端口号的虚拟主机

原理

基于端口号的虚拟主机功能,可以让用户通过一个IP地址的不同端口号来访问不同的网站

实验7

基于不同端口的虚拟主机

第一步:准备工作

bash 复制代码
# 恢复快照
[root@master ~]# setenforce 0
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# yum install nginx -y
[root@master ~]# systemctl start nginx # 启动httpd
[root@master ~]# systemctl enable nginx # 设置开机启动

第二步:新建2个存储于网页的目录,使用xftp将网页文件上传

bash 复制代码
[root@master ~]# mkdir -p /www/port{5111,5222}
[root@master ~]# ls /www
port5111  port5222
# 使用xftp将2个网页文件sczl及zy上传到上述目录

第三步:编辑主配置文件

bash 复制代码
# 可直接在主配置文件中修改
[root@master ~]# vim /etc/nginx/nginx.conf
server {
        listen       5111;
        server_name  _;
        root         /www/port5111;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
    server {
        listen       5222;

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
    server {
        listen       5222;
        server_name  _;
        root         /www/port5222;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

第四步:重启服务,测试

bash 复制代码
[root@master ~]# systemctl restart nginx # 重启服务
# 打开windows的浏览器输入192.168.182.147:5111或者192.168.182.147:5222进行测试
 

基于域名的虚拟主机

原理

当服务器无法给每个网站都分配一个独立的IP地址时,可以通过用户请求的域名不同实现传输不同的网页数据

域名解析:

功能:域名<==>IP地址

浏览器如何通过域名去查询URL对应的IP(对应服务器地址):

浏览器缓存:浏览器会按照一定的频率缓存DNS记录

操作系统缓存:如果浏览器缓存中找不到需要的DNS记录,那就去操作系统中的hosts文件找。hosts是一个没有扩展名的系统文件,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。

windows下的hosts文件路径:C:\Windows\System32\drivers\etc\hosts

Linux下的hosts文件路径:/etc/hosts

路由缓存:路由器也有DNS缓存。

ISP的DNS服务器:ISP是互联网服务提供商(Internet Service Provider)的简称,ISP有专门的DNS服务器应对DNS查询请求

根服务器:ISP的DNS服务器还找不到的话,它就会向根服务器发出请求,进行查询(DNS服务器先问根域名服务器.com域名服务器的IP地址,然后再问.com域名服务器,依次类推)

实验8

使用2个域名建立虚拟主机网站

第一步:准备工作:

bash 复制代码
# 恢复快照
[root@master ~]# setenforce 0
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# yum install nginx -y
[root@master ~]# systemctl start nginx # 启动httpd
[root@master ~]# systemctl enable nginx # 设置开机自启

第二步:新建2个存储网页文件的目录,使用xftp将网页文件上传

bash 复制代码
[root@master ~]# mkdir -p /www # 可直接上传文件夹

第三步:手动配置IP地址与域名的映射关系

bash 复制代码
# Linux端
[root@master ~]# vim /etc/hosts
# 添加如下内容:
192.168.182.148 www.zy.com
192.168.182.148 www.sczl.com
# windows端,打开:
C:\Windows\System32\drivers\etc\hosts文件,添加如下内容:
192.168.182.148  www.zy.com
192.168.182.148  www.sczl.com

第四步:编辑主配置文件

bash 复制代码
    server {
        listen       80;
        server_name  www.zy.com; # 重点,需要写域名
        root         /www/zy;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
   server {
        listen       80;
        server_name  www.sczl.com;
        root         /www/sczl;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

第五步:重启服务,测试

bash 复制代码
[root@master ~]# systemctl restart nginx # 重启服务
# windows端打开浏览器输入域名测试
相关推荐
Vinton_Liu2 小时前
NAT 类型详解:四种 NAT 的数据流与原理解析
运维·服务器
一个处女座的程序猿O(∩_∩)O2 小时前
如何保持nginx配置与前端打包dist的路径保持一致、解决页面刷新白屏以及页面跳转问题
运维·前端·nginx
想唱rap2 小时前
五种IO模型和非阻塞IO
linux·运维·服务器·网络·数据库·tcp/ip
环流_2 小时前
nacos:负载均衡 3大核心操作
运维·nacos·负载均衡
阿洛学长2 小时前
CSDN、掘金、简书博客文章如何转为Markdown?
运维·数据库·架构·php·持续部署
方安乐2 小时前
交换机的自学机制
运维·服务器·网络
MXsoft6184 小时前
**智能运维如何实现全栈监控与****AI****告警?****——****一体化平台实战解析**
运维·人工智能
MXsoft6184 小时前
**运维体系升级:筑牢企业数字化转型的稳定底座**
运维