导语:人往高处走,水往低处流。技术发展往高层堆叠,技术学习则往底层深处探索。
参考文章:
1、 百度百科:
IIS:https://baike.baidu.com/item/iis/19755079
Apache:https://baike.baidu.com/item/Apache/6265
Nginx:https://baike.baidu.com/item/nginx
2、 博客:https://www.cnblogs.com/vipyoumay/archive/2017/08/31/7455431.html
3、 菜鸟教程:https://www.runoob.com/w3cnote/nginx-setup-intro.html
学习是具有主观能动性的一种行为(学习是需要目的的),为什么要学习并了解web服务器呢?在之前的文章中,我已经能在自己的电脑上开发出简单的web网站了,但是网站具体是怎么在电脑上运行的,却不得而知,如果要把网站发布给其它的网友看又该怎么办呢?这篇文章就是为了尝试回答这些问题的。
链接文章:
a、php基础知识
b、web客户端编程基础-HTML、css
c、web客户端编程基础-JAVAScript
d、数据库基础笔记-SQL
e、 web网站开发基础
来源:
1989年,互联网之父Berners-Lee向其雇主CERN提出了一个新项目,目的是通过使用超文本系统来缓解科学家之间的信息交流。该项目导致Berners-Lee在1990年编写了两个方案:
a、一个名为WorldWideWeb的浏览器。
b、世界上第一个网络服务器,后来被称为CERN httpd,它运行在NeXTSTEP上。在1991年至1994年期间,用于通过万维网冲浪和交换数据的早期技术的简单性和有效性有助于将其移植到许多不同的操作系统,并将其用于科学组织和大学,然后传播到行业。
1994年,Berners-Lee决定组建万维网联盟(W3C),通过标准化过程来管理涉及的许多技术(HTTP,HTML等)的进一步发展。
功能定义:
Web服务器的主要功能是存储,处理和传递网页给客户。客户端和服务器之间的通信使用超文本传输协议(HTTP)进行。交付的页面最常见的是HTML文档,除了文本内容之外,还可能包含图像,样式表和脚本。
一个用户代理,通常是web浏览器或web爬虫,通过发起一个HTTP请求以获取服务器资源,服务器根据请求返回该资源或由于某种原因响应错误消息。
虽然主要功能是提供内容,但HTTP的完整实现还包括从客户端接收内容的方式。此功能用于提交Web表单,包括上传文件。许多通用Web服务器还支持使用Active Server Pages(ASP),PHP或其他脚本语言的服务器端脚本。这意味着Web服务器的行为可以在单独的文件中脚本化,而实际的服务器软件保持不变。通常,此函数用于动态生成HTML文档(“即时”),而不是返回静态文档。前者主要用于从数据库检索或修改信息。后者通常快得多,并且更容易被缓存,但不能提供动态内容。
Web服务器不仅用于为万维网服务。它们也可以被嵌入到诸如打印机,路由器,网络摄像机等设备中,并且仅服务于本地网络。然后,web服务器可以用作用于监视或管理所讨论的设备的系统的一部分。这通常意味着客户端计算机上不需要安装其他软件,因为只需要一个网络浏览器(现在大多数操作系统都包含在内)。
web服务器工作原理:
HTTP协议基于TCP协议上,是一个应用层协议,用于用户代理和Web服务器进行通信。Web服务器通常采用一问一答的方式进行工作。
主流web服务器:Apache、IIS、Nginx
在Web服务器发展的同一个时期,应用服务器已经存在并发展很长一段时间了。一些公司为Unix开发了Tuxedo(面向事务的中间件)、TopEnd、Encina等产品,这些产品都是从类似IMS和CICS的主机应用管理和监控环境衍生而来的。大部分的这些产品都指定了“封闭的”产品专用通信协议来互连胖客户机(“fat” client)和服务器。在90年代,这些传统的应用服务器产品开始嵌入HTTP通信功能,刚开始要利用网关来实现。不久后它们之间的界线开始变得模糊了。
同时,web服务器越来越成熟,可以处理更高的负载、更多的并发和拥有更好的特性;应用服务器开始添加越来越多的基于HTTP的通信功能。所有的这些导致了web服务器与应用服务器的界线变得更窄了。
目前,“应用服务器”和“web服务器”之间的界线已经变得模糊不清了。但是人们还把这两个术语区分开来,作为强调使用。
当有人说到“web服务器”时,你通常要把它认为是以HTTP为核心、web UI为向导的应用。当有人说到“应用服务器”时,你可能想到“高负载、企业级特性、事务和队列、多通道通信(HTTP和更多的协议)”。但现在提供这些需求的基本上都是同一个产品。
那么什么是容器呢?
容器是位于应用程序/组件和服务器平台之间的接口集合,使得应用程序/组件可以方便部署到服务器上运行。
Web服务器的出现的标志着WWW时代的带来,世界变得更加平面化。当初尝到甜头的开创者们开始不满足与在互联网上获取静态资源,于是出现了CGI脚本来动态获取资源。再后来网络发展方向也是朝着增强Web服务器动态获取资源的能力前进。代表性的动态技术:CGI(Common Gateway Interface,公用网关接口)、PHP、JSP、ASP
反向代理是代理服务器的一种。它根据客户端的请求,从后端的服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端。与前向代理不同,前向代理作为一个媒介将互联网上获取的资源返回给相关联的客户端,而反向代理是在服务器端(如Web服务器)作为代理使用,而不是客户端。客户端通过前向代理可以访问很多不同的资源,而反向代理是很多客户端都通过它访问不同后端服务器上的资源,而不需要知道这些后端服务器的存在,而以为所有资源都来自于这个反向代理服务器。
Web服务器是提供WWW服务的程序;Web容器是提供给开发者的框架;Web应用程序服务器内容丰富得多,既可用各厂商通常遵循一定的工业标准并自定义扩展功能而成,也可以利用开源组件轻量级拼装打造;反向代理服务器在企业级应用中表现突出,具有解决集中式安全,负载均衡等等优点。
IIS(Internet Information Services) 是一个支持HTTP和FTP发布服务的Web服务器。它是由微软开发的web服务器,需要收费,主要用来跑asp.net asp php,只能在windows下运行。
在稳定性上来说,IIS在实际使用中经常出现500错误,而且有时候会出现莫名其妙的假死现象,用户需要不定期的重新启动IIS服务才能保证网站的正常。安全性来说,IIS6以前的版本有安全隐患,之后的版本已经优化。因为IIS是Windows系统的一部分,所以并不开源,但是这好处是对熟悉windows的用户来说,配置和开启操作简单。
首先,操作系统是windows
Vista开启IIS 7.0
在Vista中,我们可以看得到新版本的IIS 7.0看上去比6.0有了很大的改进。你可以自由开启IIS 7.0,并在个人电脑上架设自己的网站。
下面是开启方法:
1、热键WinKey+R—输入"cmd.exe" (不带引号)。
2、输入下列命令:
start /w pkgmgr.exe /iu:IIS-WebServerRole;IIS-WebServerFeature;IIS-FTPServerFeature
然后,就会自动安装IIS 7.0。而且,IIS 7.0已经完全组件化,类似于Apache。
Win7开启IIS 7.0
默认情况下,windows7安装时是不会自动安装iis,只能手动安装,需要有安装盘。
安装方法:
开始-控制面板-程序-打开或关闭windows功能-internet信息服务-Web管理工具
如下图所示:
1、打开IIS管理器,如下图所示:
2、新增网站:鼠标右击“网站”这个文件夹>>点击“添加网站”,出现如下弹窗:
网站名称:这个自定义,是为区分不同网站使用。
物理路径:网站代码的位置,html代码等
绑定:分配IP和端口、解析指定的域名,如果要绑定多个域名,可以在后面“编辑”中操作
3、填写无误后,点击确定,“网站”文件夹下就出现新增的网站了,如下图所示:
左侧列表是IIS服务器目前所有的网站列表
中间项目是针对某个网站所提供的服务和设置
右侧列表是这个网站的操作:
浏览:打开网站代码的根目录
编辑权限:设置网站代码对外的权限
绑定:IP及端口、域名绑定的设置,新增的弹窗只能设置一个域名,这里就可以设置多个
基本设置:修改网站名称、代码路径地址
管理网站:对网站服务器的重新启动、启动、停止、删除等操作
浏览网站:这里就可以点击查看网站代码运行的对外实际效果
高级设置:略
限制:宽带等限制
就这么点点点,IIS就能很快很简单地把网站部署好了。若中间遇到了什么不可描述的问题~~就自行google吧。
很多框架或者网站代码,是需要在web服务器上配置路由寻址的。IIS的也不是很麻烦:
1、首先,得自己写好 .htaccess 文件(一般框架都有自带的),例如:
```
Options +FollowSymLinksRewriteRule ^(w{2})/diy/com/ep365/assets/images/left/tab/(.+).png$ /diy/com/ep365/assets/images/left/tab/$2.png [L]RewriteRule ^(w{2})/diy/fontimage/(.+).png$ /diy/fontimage/$2.png [L]IndexIgnore */*RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule .index.php
```
2、IIS导入规则,双击”URL重写”>>点击“导入规则”>>选择.htaccess文件,确定生成如下图所示:
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。同时Apache音译为阿帕奇,是北美印第安人的一个部落,叫阿帕奇族,在美国的西南部。也是一个基金会的名称、一种武装直升机等等。
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。
1.支持最新的HTTP/1.1通信协议
2.拥有简单而强有力的基于文件的配置过程
3.支持通用网关接口
4.支持基于IP和基于域名的虚拟主机
5.支持多种方式的HTTP认证
6.集成Perl处理模块
7.集成代理服务器模块
8.支持实时监视服务器状态和定制服务器日志
9.支持服务器端包含指令(SSI)
10.支持安全Socket层(SSL)
11.提供用户会话过程的跟踪
12.支持FastCGI
13.通过第三方模块可以支持JavaServlets
“我们在使用Apache作为web服务器的过程中,只有对Apache服务器进行适当的优化配置,才能让Apache发挥出更好的性能;再反过来说,如果Apache的配置非常糟糕,Apache可能无法正常为我们服务。因此,针对我们的应用需求对Apache服务器的配置进行一定的优化是必不可少的。” --百度百科
目前apache和nginx好像还没有看到像IIS一样的可视化配置。在windows和linux上,apache和nginx 都是以编辑配置文件的形式来配置。
1、目录结构详解
一般情况下,apache安装好后,其目录结构大致如图(linux也差不多):
conf #主要存放了配置文件httpd.conf
logs #日志文件存放的目录
bin #执行文件存放的目录,比如:(ab 常用压测工具),(apachectl 控制apache启动的,实际调用的httpd),(apxs apache扩展编译的工具),(htpasswd 为网站设置用户名密码),(httpd apache的控制命令程序),(rotatelogs apache的日志轮询工具)等
cgi-bin #CGI处理程序的存放目录
manual #一些帮助及说明文档
modules #apache加载的module文件存放目录(缺省配置)
可能还有这么几个目录:
conf.d #里面存放的是一些额外的参数文档,比如php.conf,可以自定义设置一定配置参数放置到该目录
vhost #虚拟主机配置文件存放的目录,这个也是自定义的—phpstudy则直接把配置放到conf/vhost.conf 这个文件里,效果是一样的。
run #PID文件存放的目录(可以自行更改)
htdocs #apache网站程序文件存放目录(可以自定义)
2、httpd.conf 主配置文件详解
```
ServerRoot"D:/phpStudy/PHPTutorial/Apache"// apache安装目录Listen 80//监听端口# Example:# LoadModule foo_module modules/mod_foo.so//拓展加载<IfModule unixd_module>User daemon//apache运行用户Group daemon//apache运行组</IfModule>ServerAdmin admin@php.cn//管理员邮箱ServerName localhost//管理地址-本地根目录地址DocumentRoot"D:phpStudyPHPTutorialWWW"//根目录<Directory />//根目录配置Options +Indexes +FollowSymLinks +ExecCGIAllowOverride AllOrder allow,denyAllow from allRequire all granted</Directory><IfModule dir_module>DirectoryIndex index.html index.php index.htm l.php//站点目录首页文件</IfModule><Files ".ht*">//防止WEB用户查看以.ht开头的隐藏文件Require all denied</Files>ErrorLog "logs/error_log"//错误日志LogLevel error//错误日志等级<IfModule log_config_module>//错误日志配置LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combinedLogFormat "%h %l %u %t "%r" %>s %b" common<IfModule logio_module>LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %I %O" combinedio</IfModule></IfModule><IfModule alias_module>//别名设置#ScriptAlias /cgi-bin/ "H:/adsdv01/php/Apache/cgi-bin/"//CGI别名设置</IfModule><IfModule cgid_module></IfModule><IfModule mime_module>TypesConfig conf/mime.typesAddType Application/x-compress .ZAddType application/x-gzip .gz .tgz</IfModule>Include conf/extra/httpd-mpm.conf//引入文件Include conf/extra/httpd-php.confInclude conf/vhosts.conf//****引入vhosts虚拟机配置文件SSLSessionCache"shmcb:logs/ssl_scache(512000)"SSLSessionCacheTimeout300<IfModule ssl_module>//ssl证书配置SSLRandomSeed startup builtinSSLRandomSeed connect builtin</IfModule><IfModule setenvif_module>BrowserMatch "MSIE 10.0;" bad_DNT</IfModule><IfModule headers_module>RequestHeader unset DNT env=bad_DNT</IfModule>
```
3、vhosts.conf 虚拟机配置文件详解
先直接上配置:
```
<VirtualHost _default_:80>默认localhost根目录,监听80端口DocumentRoot "D:phpStudyPHPTutorialWWW"<Directory "D:phpStudyPHPTutorialWWW">Options -Indexes +FollowSymLinks +ExecCGIAllowOverride AllOrder allow,denyAllow from allRequire all granted</Directory></VirtualHost><VirtualHost *:80>DocumentRoot "D:phpStudyPHPTutorialWWW网站代码根目录"ServerName www.域名.comServerAlias 服务别名<Directory "D:phpStudyPHPTutorialWWW网站代码根目录">Options FollowSymLinks ExecCGIAllowOverride AllOrder allow,denyAllow from allRequire all granted</Directory></VirtualHost>
```
VirtualHost: 表示基于名称的虚拟主机 *:80表示监听本机所有IP的80端口上提供HTTP服务,*可以设置为具体IP
DocumentRoot: 网站代码目录
ServerName: 解析的域名地址
< Directory ></ Directory> 配置目录权限
AllowOverride:禁止用户对目录配置文件.htaccess修改,一般为none
DirectoryIndex: 站点目录首页文件多个文件用空格隔开
Order和Allow: IP限制
Options:主要作用是控制特定目录将启用哪些服务器特性,参数有:All、None、FollowSymLinks、Indexes、MultiViews、SymLinksIfOwnerMatch、ExecCGI、Includes、IncludesNOEXEC。参数说明如下图:
Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
目前apache和nginx好像还没有看到像IIS一样的可视化配置。在windows和linux上,apache和nginx 都是以编辑配置文件的形式来配置。
1、反向代理
正向代理:某些情况下,代理我们用户去访问服务器,需要用户手动的设置代理服务器的ip和端口号。
反向代理:是用来代理服务器的,代理我们要访问的目标服务器。代理服务器接受请求,然后将请求转发给内部网络的服务器(集群化),并将从服务器上得到的结果返回给客户端,此时代理服务器对外就表现为一个服务器。
2、负载均衡
多在高并发情况下需要使用。其原理就是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,多台服务器(集群)共同完成工作任务,从而提高了数据的吞吐量。
3、动静分离
Nginx提供的动静分离是指把动态请求和静态请求分离开,合适的服务器处理相应的请求,使整个服务器系统的性能、效率更高。
1、 目录结构
相对而言,nginx的目录结构比较简单、松散。在
conf:文件夹包含了nginx的所有配置文件,在nginx安装目录下
log: 包含nginx的访问日志和错误日志,可在配置中自定义
html: 网站根目录地址,可在配置中自定义
sbin: nginx命令的目录
proxy_temp,scgi_temp,uwsgi_temp,临时目录
2、nginx.conf 主配置文件详解
```
user nginx nginx; #定义Nginx运行的用户和用户组worker_processes 1; #nginx进程数,建议设置为等于CPU总核心数。events{use epoll; #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; worker_connections 65535; #单个进程最大连接数(最大连接数=连接数*进程数)}error_log /var/log/nginx/error.log info; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]pid /var/run/nginx.pid; #进程文件worker_rlimit_nofile 1024; #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以#建议与ulimit -n的值保持一致http {#HTTP区块开始includemime.types;#Nginx支持的媒体类型库文件default_typeapplication/octet-stream;#默认的媒体类型sendfileon;#开启高效传输模式keepalive_timeout65;#连接超时server {#第一个Server区块开始,表示一个独立的虚拟主机站点listen80;#提供服务的端口,默认80server_namelocalhost;#提供服务的域名主机名location / {#第一个location区块开始roothtml;#站点的根目录,相当于Nginx的安装目录indexindex.html index.htm;#默认的首页文件,多个用空格分开} error_page504/50x.html;#出现对应的http状态码时,使用50x.html回应客户location = /50x.html {#location区块开始,访问50x.htmlroothtml; #指定对应的站点目录为html}}include vhosts.conf;#虚拟机配置引用}
```
3、vhosts.conf 虚拟机配置文件详解
```
server{listen 80; #监听端口server_name localhost; #提供服务的域名主机名indexindex.php index.html;#站点目录首页文件root"D:/phpStudy/PHPTutorial/WWW/网站代码";#网站代码根目录#sslon;#ssl服务开启#ssl_certificatecert.pem;#ssl证书#ssl_certificate_keycert.key;#ssl 证书keylocation / { #第一个location区块开始root html; #站点的根目录,相当于Nginx的安装目录index index.html index.htm index.jsp; #默认的首页文件,多个用空格分开} #第一个location区块结果#charset utf-8; #默认编码server_names_hash_bucket_size 128; #服务器名字的hash表大小client_header_buffer_size 32k; #上传文件大小限制large_client_header_buffers 4 64k; #设定请求缓client_max_body_size 8m; #设定请求缓sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为o #ff,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。tcp_nopush on; #防止网络阻塞tcp_nodelay on; #防止网络阻塞keepalive_timeout 120; #连接超时,单位是秒#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。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 128k;#gzip模块设置gzip on; #开启gzip压缩输出gzip_min_length 1k; #最小压缩文件大小gzip_buffers 4 16k; #压缩缓冲区gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)gzip_comp_level 2; #压缩等级gzip_types text/x-JavaScript text/css application/xml; #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。gzip_vary on;#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用#图片缓存时间设置location ~ .*.(gif|jpg|jpeg|png|bmp|swf)${expires 10d;}#JS和CSS缓存时间设置location ~ .*.(js|css)?${expires 1h;}#日志格式设定log_format access '$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_$(data+%F -d -1day).log access; #定义本虚拟主机的访问日志location / {#对 "/" 启用反向代理proxy_pass http://127.0.0.1:88;proxy_redirect off;proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#以下是一些反向代理的配置,可选proxy_set_header Host $host;client_max_body_size 10m; #允许客户端请求的最大单文件字节数client_body_buffer_size 128k;#缓冲区代理缓冲用户端请求的最大字节数,proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传}#设定查看Nginx状态的地址location /NginxStatus {stub_status on;access_log on;auth_basic "NginxStatus";auth_basic_user_file conf/htpasswd; #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。}#本地动静分离反向代理配置#所有jsp的页面均交由Tomcat或resin处理location ~ .(jsp|jspx|do)?$ {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://127.0.0.1:8080;}#所有静态文件由nginx直接读取不经过tomcat或resinlocation ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)${ expires 15d; }location ~ .*.(js|css)?${ expires 1h; }}}
```