目录
第四章 Web服务器(1)
www简介
Web网络服务也叫WWW(World Wide web全球信息广播)万维网服务,一般是指能够让用户通过浏览器访问到互联网中文档等资源的服务
Web网络服务是一种被动访问的服务程序,即只有接受到互联网中其他主机发出的亲求后才会响应,最终用于提供服务程序的Web服务器会通过HTTP(超文本传输协议)或HTTPS(安全超文本传输协议)那清秀的内容传送给用户,如图:
常见Web服务程序介绍
Windows系统中默认Web服务程序IIS(internet information 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扩展程序
服务器主机
网站是由域名、网页源程序和主机空间组成的,其中主机空间则是用于存放网页源代码并能够将网页内容展示给用户
虚拟主机:在一台服务器中分出一定的磁盘空间供用户放置网站、存放数据等,仅提供基础的网站访问、数据存放于传输流量功能,能够极大的降低用户费用,也几乎不需要管理员维护除网站数据意外的服务,适合小型网站
VPS(Virtual Private Server):在一台服务器中利用 OpenVZ、Xen或KVM 等虚拟化技术模拟出多个“主机”,每个主机都又独立的 IP 地址、操作系统,实现不通 VPS 之间磁盘空间、内存、CPU 资源、进程于系统配置间的完全隔离,管理员可自由使用分配到的主机中的所有资源,所以需要有一定的维护系统的能力,适合小型网站
云服务器(ECS):是一种整合了计算、存储、网络,能够做到弹性伸缩的计算服务,其使用起来于VPS几乎一样,但差别是云服务器建立在一组集群服务器中,每个服务器都会保存一个主机镜像(备份),大大的提升了安全稳定性,另外还具备了灵活性于扩展性,用户需按使用付费的即可,适合大中小型网站
独立服务器:这台服务器仅提供给您使用,详细来讲又可以区分为租用方式与托管方式
租用方式:用户只需要将硬件要求告知IDC服务商,服务器硬件设备由机房负责维护,运维管理员一般需要自行安装相应的软件并不说网站服务、租期可以为月、季、年,减轻了用户初期对硬件设备的投入,适合大中型网站
托管方式:用户需要自行购置服务器后交给IDC服务供应商的机房进项管理(缴纳管理服务费用),用户对服务器硬件配置有完全的控制权,自主性强,需要自行维护、修理服务器硬件设备,适合大中型网站
主要数据
服务器所提供的最主要是超文本标记语言(Hyper Text Markup Language,HTML)、多媒体文件(图片、影像、声音、文字等,都属于多媒体或称为超媒体),HTML只是一些纯文本数据,通过所谓的标记来规范索要显示的数据格式
浏览器
客户端收到服务器的数据之后需要软件解析服务器所提供的数据,最后将效果呈现在用户屏幕上
那么著名的浏览器由内建在Win造作系统内的IE浏览器和Microsoft Edg,还有Firefox浏览器和Google的chrome浏览器
网址及HTTP简介
web服务器提供的这些数据大部分都是文件,那么我们需要在服务器端先将数据文件写好,并且放置在某个特殊的目录下面,这个目录就是我们整个网站的首页,在redhat中,这个目录默认 /var/www/html
浏览器是通过你在地址栏中输入你所需要的网址来取得这个目录的数据的
URL
Uniform Resource Locator,统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网标准资源的地址
网址格式:
<协议>://<主机或主机名>[:port]/<目录资源,路径>
协议:http、https、ftp
主机地址或主机名:主机地址就是服务器在因特网所在的IP地址。如果是主机名的化,那么久就需要域名解析
端口号:http80,https443
0-1023:永久的分配给固定的应用程序使用
1024-41951:注册端口,但要求不是特别严格,分配给程序注册为某应用使用
41952-60000:客户端程序随机使用的端口,动态端口,或私有端口
http请求方式
在http通信中,每个Http请求报文都包含一个方法,用以告诉web服务端需要执行哪些具体的动作,这些动作包括:获取指定web页面、提交内容到服务器、删除服务器上资源文件等
序号 方法 描述 1 get 请求指定的页面信息,并返回实体主题 2 head 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 3 post 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求实体中,post请求可能会导致新的资源的建立和/或已有资源的修改 4 put 从客户端向服务器传送的数据取代指定的文档的内容 5 delete 请求服务器删除指定的页面 6 connect HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 7 options 允许客户端查看服务器的性能 8 trace 回显服务器收到的请求,主要用于测试或诊断 状态代码:有单位数字组成,第一个数字定义了响应得类别,且有五种可能取值
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协议请求得工作流程
终端客户在web浏览器地址栏输入访问地址
web浏览器亲求DNS服务器把域名解析成web服务器得IP地址
web浏览器将端口号从访问地址中解析出来
web浏览器通过解析后得ip地址及端口号于web服务器之间建立一条tcp连接
建立tcp连接后,web浏览器向web服务器发送一条http请求报文
web服务器响应并读取浏览器得请求信息,然后返回一条HTTP响应报文
web服务器关闭http连接,关闭tcp连接,web浏览器显示访问的网站内容到屏幕上
WWW服务器的类型
静态网站
仅提供用户浏览的单项静态网页,单纯是由服务器单向提供数据给客户端,Server不需要于client端有互动,可以浏览网站,但是无法数据上传
动态网站
该站可以让服务器于用户互动,常见的例如留言板,博客。这种类型的网站需要通过“网页程序语言”来实现于用户互动的行为。常见的例如:PHP网页程序语言,配合数据库系统来进行数据的读,写。当你在向服务器请求数据时。其实是通过服务器端同一个网页程序在负责将数据读出或写入数据库,变动的是数据库的内容,网页程序并没有任何改变
另外一种交互式的动态网页主要是在客户端实现。服务端将可执行的程序代码传(JavaScript)送给客户端,客户端的浏览器如果提供JavaScript的功能,那么该程序就可以在客户端的计算机上面工作了;另外一种可在客户端执行的就是Flash动画格式,在这种动画格式内还可以进行程序设计
搭建动态网站需求:LNMP(linux + nginx + mysql+php)
nginx 主要提供www的服务器平台
mysql 传统的文件读取时麻烦的,如果只要读取该文件当中的一小部分,系统还是会将整个文件读出来,若多个用户同时读取同一个文件时,那就会造成效率与系统上的问题,所以才会有数据库系统的推出。数据库其实是一种特殊格式的文件,这种文件要通过特殊接口(数据库软件)来进行读写,优于这个特殊接口已经针对数据的查询、写入做高优化设计因此很适合多人同时写入查询工作
php:php可以配用来建立东涛网页,php程序代码可以直接在HTML网页中嵌入,像编辑HTML网页一样简单。php是一种“程序语言”,这种程序语言可以直接在网页中编写,不需要经过编译即可执行
使用nginx搭建web网站
nginx简介
概念
Nginx是一款轻量级HTTP服务器,也是一款邮箱代理服务器,同时具备方向代理、通用TCP/UDP代理功能
Nginx可以运行在x86、ARM等多种平台上,同时支持Linux、Windows等主流的操作系统
特点
支持高并发
单机nginx可支持十万级的并发连接,经过优化后最高支持百万级并发连接
内存资源消耗低
在同级web服务器种,nginx占用的内存最少,一万非活跃的http keep-alive连接仅消耗2.5M内存
高扩展性
和Apache一样,nginx采用模块化设计,并支持非常丰富的第三方模块
高可靠性
nginx采用master-worker模式,如果worker出现故障,master可以快速开启一个新的worker来提供服务
nginx架构
主进程:master
检查nginx配置是否正确
创建、监控worker进程的数量和状态
接受对nginx的管理指令,并作出对应操作
工作进程:worker
处理客户端请求
接受master发来的指令,并做对应操作
注意:默认情况下,nginx会建立和服务器cpu核心数相等的worker进程,worker进程之间相互独立,若一个进程故障不会影响其他进程
Nginx关键工作机制
抢占机制:当客户端发起请求时,会激活accept_mutex互斥锁,那个worker抢占了该互斥锁,该客户端的请求就由那个worker响应和处理
异步非阻塞模式:在传统实际处理模式下,如果所有的worker被客户端阻塞后,新来的客户就需要等待,直到原来的客户端释放worker后才能被处理请求,在异步非阻塞模式下,底层使用了linux的epoll模型,就算worker被阻塞,新的客户端请求也会正常处理
nginx正向代理功能
图:
分析:他的工作原理就像一个跳板,简单地说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,他能访问那个我布恩那个访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器取回来没然后返回给我,从网站的角度,只在代理服务器来去内容的时候一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决道理告不告诉网站
理解:
客户端 <一> 代理 <一> 服务端 A租房人(客户端) B房产中介(代理) C真实房东(服务端)
A租房人(客户端)想租C真实房东的房子,但不认识C真实房东(服务端)
B房产中介(代理)认识C真实房东(服务端),并且从C真实房东(服务端)租到了房
A租房人(客户端)通过B房产中介(代理)租到了C真实房东(服务端)的房
C真实房东(服务端)只知道房子租给了B房产中介(代理),并不知道A租房人(客户端)租了自己的房子
结论:正向代理,是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。就像要访问google用vpn代理翻墙去访问(用户知道要访问真正的服务器)
nginx方向代理功能
图:
分析:反向代理正好相反,它也是客户端和服务器端的一个代理服务器,但是这个代理服务器的目的是用来保护服务器端的,当外网客户端来访问我们的服务器时为为了避免暴露应用服务器的实际ip地址,我们会让客户端访问代理服务器,然后代理服务器再根据客户端的请求去实际的应用服务器获取响应内同并返回客户端
nginx反向代理的工作量流程
客户端向Nginx发送请求
nginx再收到客户端发送的请求后,将请求转发后端服务器
后端服务器将客户端请求的资源回复给nginx
nginx将资源返回给客户端
nginx反向代理通过位于location种的proxy_pass实现
在反向代理的工作流程中,客户端向代理请求资源时使用的端口,可以和服务器提供服务提供的端口不一致
Nginx负载均衡功能
nginx可以提供四层和七层的负载均衡
nginx的负载均衡功能通过位于http中的upstream实现
nginx提供了多种均衡算法,如轮询、权重等
轮询算法下,nginx会按照请求发送给不同的服务器,使每个服务器都均等的提供服务
权重算法下,nginx会按照的权重比例,将请求发送给服务器。性能较好的服务器将提供更多的服务,性能不好的提供少量服务
部署nginx
部署
[root@server ~]# sentenforce 0 [root@server ~]# systemctl stop firewalld [root@server ~]# systemctl disable firewalld [root@server ~]# dnf install nginx -y [root@server ~]# nginx -v # 查看版本信息 [root@server ~]# systemctl start nginx [root@server ~]# systemctl enable ngixn Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service. [root@server ~]# systemctl status nginx# 查看状态,q键退出查看 [root@server ~]# ps -ef | grep nginx root 1690 1 0 13:57 ? 00:00:00 nginx: master process /usr/sbin/nginx nginx 1691 1690 0 13:57 ? 00:00:00 nginx: worker process nginx 1692 1690 0 13:57 ? 00:00:00 nginx: worker process root 1726 1510 0 14:00 pts/0 00:00:00 grep --color=auto nginx # 测试,Windows中打开浏览器输入服务器IP地址
常用命令
systemcel系列
命令:
systemctl start nginx # 启动服务 systemcctl restart nginx # 重启服务 systemctl enable nginx # 开机启动 systemctl stop nginx # 停止服务 systemctl disable nginx # 取消开机启动 systemctl status nginx # 查看状态
nginx自带命令
命令:
nginx # 启动nginx nginx restart # 重启服务 nginx -s reload # 重新加载配置文件 nginx -s stop # 强行停止服务 nginx -s quit # 优雅停止服务,即所有请求处理完后退出服务 nginx -v # 查看版本号 nginx -t # 检查配置文件的语法错误,无错返回ok
nginx配置文件
配置文件
[root@server ~]# cd /etc/nginx #服务目录 [root@server ~]# dnf install tree -y [root@server ~]# tree . ├── conf.d # 子配置文件目录 ├── default.d ├── fastcgi.conf ├── fastcgi.conf.default ├── fastcgi_params ├── fastcgi_params.default ├── koi-utf # KOI8-R 编码(俄语)转换的映射文件 ├── koi-win # # KOI8-R 编码(俄语)转换的映射文件 ├── 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, 15 files 网页默认目录: /usr/share/nginx/html 访问日志: /var/log/nginx/access.log 错误日志: /var/log/nginx/error.log
主配置文件
主配置文件
[root@server ~]# vim /etc/nginx/nginx.conf
结构
全局配置
运行用户
worker数量
日志参数
include导入的外部配置文件
性能配置
工作模式
TCP连接数
HTTP模块配置
HTTP请求和响应的参数
路由配置
虚拟主机配置
负载均衡配置
分析
层级结构图
配置分析
[root@server ~]# vim /etc/nginx/nginx.conf # 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配置段,虚拟主机设置 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 172.168.22.11; # 禁止访问的ip地址,可以为all allow 172.168.33.44; # 允许访问的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 { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # } }
注意
server_name指令一般用于指定虚拟主机的域名,在匹配时由一下四种写法
精确匹配:server_name Advanced Load Balancer, Web Server, & Reverse Proxy - NGINX ;
左侧匹配:server_name *.Advanced Load Balancer, Web Server, & Reverse Proxy - NGINX ;
右侧匹配:server_name www.nginx.* ;
正则匹配:server_name ~^www.nginx.*$ ;
注:匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
root指令与alias指令区别
root指令用于静态资源目录位置,它可以写在http、server、location等配置中,root指令定义的路径会与URI叠加产生最终访问路径,如:
location /image{ root /opt/nginx/static; } # 当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png
alias也是指定静态资源目录位置,但只能访问指定的绝对路径,不会叠加目录,只能写在location中且末尾一定要添加/,如
location /image { alias /opt/nginx/static/image/; } #当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png
location匹配路径
格式
location [ = | ~ | ~* | ^~ ] uri { ... }
匹配规则
= 精确匹配
~ 正则匹配
~* 正则匹配,不区分大小写
^~ 匹配以某个字符串开头,不是正则匹配
/ 通用匹配,如果没有其他匹配,任何请求都会匹配到
注:匹配优先级 = > ^~ > ~ > ~* > 不带任何字符
示例
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/bbs/ 时会匹配上 /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中的斜线如:
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
快速搭建网站
[root@server ~]# dnf install nginx -y echo "welcome to www.openlab.com" > /usr/share/nginx/html/index.html [root@server ~]# systemctl restart nginx
# 打开windows中打开火狐浏览器输入主机IP测试
[root@server ~]# cutl 127.0.0.1 welcome to www.openlab.com
实验2
替换网页目录
[root@server ~]# dnf install nginx -y [root@server ~]# mkdir -p /www/sxhkt # 网页存储目录不能放在/root下 # 使用xftp将windows端的sxhkt文件夹中的数据上传到Linux端的/www/sxhkt目录内 [root@server ~]# vim /etc/nginx/nginx.conf # 定位第42行,修改如下: root /www/sxhkt; [root@server ~]# systemctl restart nginx# 重启服务 # 测试:打开windows端浏览器输入服务端IP地址