首页 > 代码库 > Linux之web服务

Linux之web服务

在互联网飞速发展的今天,大家最常用的就是利用互联网访问网站,今天就来为大家介绍一下如何在Linux下搭建web站点。

 

一、WEB简介

   Web本意是蜘蛛网和网的意思,在网页中我们常称为网页,其表现形式主要有三种:超文本、超媒体、超文本传输协议。

 

 1web服务的链接是怎么实现的

      基于套接字实现:用来建立本地进程与设备的关联关系。(IP+端口)

                 众所周知的公用端口:0-1023 只有管理员才有权限,永久分配给某应用

                                     1024-41651 注册端口,只有一部分端口被注册

                                     41953-65535 动态端口(私有端口)

注:在Linux下可以手动修改临时端口的起始数字,配置文件为:/proc/sys/net/ipv4/ip_local_port_range:定义两个数字,表示可以做为临时端口的起始数字和结束数字

 

 2、套接字通信

        socket通信在domain中实现

        Domain类型:

             Unix Domain: 基于socket机制实现同一主机不同进程间通信的一种方式;AF_UNIX, AF_LOCAL,地址是一个路径名(文件)注:不需要网络封装,速度与性能比IPV4domain好很多

     IPv4 Domain: AF_INET, 基于socket机制借助于ipv4协议实现不同主机(也可以是同一主机)上的进程间通信的机制;注:同一主机的不同进程通信需要网络,地址是32位的ipv4地址+16位的端口号

     IPv6 Domain: AF_INET6, 地址是128位的Ipv6地址+16位的端口号

 

 3、系统调用

       服务器端调用:socket(): 创建一个新的socket

             bind():绑定于一个套按字地址上;

             listen(): 监听套接字;

             accept(): 接收连接请求;

       客户端调用:  connect(): 发起连接请求;

                     close(): 关闭连接

                     read()write(): recv(), send(), recvfrom(), sendto()

 

 4HTTP协议

       http协议是一种超文本传输协议

       其html框架为:

              <html>

                <head>

                      <title>TITLE</title>

                </head>

                <body>

                   <h1>H1</h1>

                      <p></p>

                    <h2>H1</h2>

                      <p> <a href="http://www.mamicode.com/a.html">ToBaidu</a> </p>

               </body>

             </html>

 

 5web服务器

       web服务器:

           理解用户请求的资源格式不仅仅是纯html格式的文档


6、web资源

   资源类型:用MIME标记

            major/minor

            text/html

            text/plain

            image/jpeg

            image/gif

            vedio/mpeg4

            application/vnd.ms-powerpoint

 

            资源名称:URI Uniform Resource Idnentifier

            URL:描述一个特定服务器上某资源的特定位置

               分为三部分:

                   scheme(方案)http://

                   服务器:www.baidu.com:80

                   特定服务器上的资源  


7、HTTP处理事务的方法

   http事务:一次请求及对应的响应

   http方法:

           GET:请求获取一个资源,需要服务器发送

           HEAD:跟GET近似,但其不需要服务响应请求的资源,而返回响应首部

           POST:基于HTML表单向服务器提交数据,服务器通常需要存储此数据;(位置:通常为关系型数据库)

           PUT:与GET相反,向服务器发送资源;服务器通常需要存储此资源;(位置:通常为文件系统)

           DELETE:删除URL指向的资源

           OPTIONS:探测服务器端对请求的URL所支持使用的请求方法

           TRACE:跟一次请求中间所经过的代理服务器、防火墙或网关等

 

8、http状态码

        1XX:信息性状态码

        2XX:成功状态码

            200OK

            201:上传成功CREATED

       3XX: 重定向类的状态码

            301: Moved Permanently, 永久重定向

            302: Found, 临时重定向,会在响应报文中使用“Location: 新位置”;

            304: 没有修改Not Modified

       4XX:客户端类错误

            403Forbidden请求拒绝

            404: Not Found请求不存在

            405: Method Not Allowed不允许使用此方法

       5XX:服务器类的错误

            500Internal Server Error, 服务器内部错误

            502Bad Gateway, 代理服务器从上游服务器收到一条伪响应;

            503Service Unavailable, 服务暂时不可用

 

9、HTTP协议首部(存放状态码以及描述响应类型)

通信首部、请求首部、响应首部、实体首部、扩展首部

 

10、HTTP请求和响应报文格式

    http请求报文:

       <method> <request-URL> <version>

          <HEADERS>

 

       <entity-body>

 

    http响应报文:

          <version> <status> <reason-phrase>

           <HEADERS>

 

          <entity-body>

    解释:

         <method>:请求方法

         <request-URL>: 请求的资源,可以是相对路径,如/images/log.jpg,也可以绝对路径,如                                                  http://www.magedu.com/images.banner.jpg

         <version>: http协议版本,格式HTTP/<major>.<minor>,例如HTTP/1.0, HTTP/1.1

         <headers>:各种所可以使用的首部

         <status>: 状态码

         <reason-phrase>: 原因短语,指状态码的易读信息

     注意:http协议是无状态,无连接


11、一次web请求的具体过程

        建立连接

        接收请求

        处理请求

        访问资源

        构建响应

        发送响应

        记录日志:异步写入,先写入内存,等处理器空闲了再移入文件中


12、web服务器的I/O结构

        单进程模型:串行

        多进程模型:每个进程响应一个用户请求实现并发的效果

        复用的I/O机制:一个进程生成多个线程,每个线程响应一个用户请求

        复用的I/O机制:多个线程,每个线程响应多个用户请求


13、httpd的特性

         高度模块化:core + modules

         MPMMultipath Processing Module

            事实上有多个实现:

              prefork: 每个进程响应一个用户请求,预先生成多个空闲进程;

              select()1024

              worker: 启动多个进程,每个进程生成多个线程,每个线程响应一个用户请求;

              event: 启动多个线程,每个线程响应N个请求;

              event-driven:事件驱动

 

        httpd的功能特性:

             丰富用户认证:基本认证和摘要认证

             CGI:原生支持perl CGI

             虚拟主机:基于端口、IP、主机名

             反向代理:负载均衡

             用户站点

             路径别名

             支持第三方模块

    

14、CentOS 6下的 httpd

        配置文件:

                   /etc/httpd/conf/httpd.conf

                   /etc/httpd/conf.d/*.conf

        服务脚本:

                   /etc/rc.d/init.d/httpd

            脚本配置文件:/etc/sysconfig/httpd

        模块目录:

                   /etc/httpd/modules: 链接文件

                   /usr/lib64/httpd/modules

        主程序:

                   /usr/sbin/httpd: prefork 

                   /usr/sbin/httpd.event: event

                   /usr/sbin/httpd.worker: worker

        日志文件目录:

                   /var/log/httpd

                   access_log: 访问日志

                   error_log: 错误日志

        站点文档根目录:

                   /var/www/html/images/a.jpg

                     http://www.magedu.com/images/index.txt



15、httpd的配置文件说明

    ### Section 1: Global Environment定义HTTP进程自己的工作特性

    ### Section 2: ‘Main‘ server configuration中心服务配置

    ### Section 3: Virtual Hosts虚拟主机配置

注:主服务器和虚拟主机一般不同时使用;默认仅启用了主服务器;

    指令参数:不区分字符大小写,但其值有可能会区分大小写

 

 

二、特性介绍

1、持久连接

KeepAlive {On|Off}开启或关闭持久连接

MaxKeepAliveRequests 100设置持久连接最大为100个请求

KeepAliveTimeout 15 设置持久连接超时时间为15

 

2MPM参数:

<IfModule prefork.c>

StartServers       8   脚本刚启动时就启动8个空闲进程

MinSpareServers    5  最少空闲进程为5个(保留5个空闲进程)

MaxSpareServers   20  最大空闲进程为20个(不能小于启动空闲进程数)

ServerLimit      256   相对于MaxClients最多启动256个服务

MaxClients       256  最多允许同时处理256个客户请求

MaxRequestsPerChild  4000 每个子进程最多处理4000个请求

</IfModule>

 

<IfModule worker.c>

StartServers         4  服务器启动时就启动4个空闲进程

MaxClients         300最多允许同时处理300个客户请求

MinSpareThreads     25 最小空闲线程为25

MaxSpareThreads     75 最大空闲线程为75

ThreadsPerChild     25  每个进程能启动25个线程

MaxRequestsPerChild  0  每个线程最多能处理多少个请求  0表示不限制

</IfModule>

 

3、指定监听的地址和端口

Listen [IP:]PORT 

此指令可重复指定多次

 

4DSO机制装载的模块

显示:

# httpd -D DUMP_MODULES

                 LoadModule Module_Name /path/to/Module_File

 

5、指定站点根目录

DocumentRoot "/path/to/somewhere"

 

6、站点路径访问控制

基于本地文件系统路径:

<Directory "/path/to/somewhere">

 

</Directory>

基于URL访问路径做访问控制

<Location "/path/to/URL">

 

</Location>



7、于Directory中可用的访问控制

(1) Options

Indexes: 当访问的路径下无默认的主页面,将所有资源以列表形式呈现给用户;危险,慎用;

FollowSymlinks: 跳跃符号链接

(2) AllowOverride

支持在每个页面目录下创建.htaccess用于实现对此目录中资源访问时的访问控制功能。

 

 

8、基于IP做访问控制

Order allow,deny

Deny from 172.16.100.17

    Allow from 172.16.0.0/16

    from后面能接受的地址格式:

    IP, Network Address

 注:表示下下边匹配的规则执行allow其他的没有匹配的默认为deny

     在172.16.网段内除了172.16.100.17被拒绝以外,此网段内的其他主机允许通过,此网段以外的注意也是拒绝。

 


9、定义默认的主页面

    DirectoryIndex

 

10、配置日志功能

    ErrorLog "/path/to/error_log"错误日志

    LogLevel {debug|info|notice|warn|error|crit|alert|emerg}日志级别

    LogFormat 

    CustomLog "/path/to/access_log" LogFormat_Name访问日志

    %h: 客户端地址

    %l: 远程登录名,通常为-

    %u: 认证时输入用户名,没有认证时为-

    %t: 服务器收到 用户请求时的时间

    %r:请求报名的起始行

    %>s: 响应状态码

    %b: 响应报文的长度,单位是字节

    %{HEADER_NAME}i: 记录指定首部对应的值

 

11、路径别名

    站点根目录:/www/html

    http://www.magedu.com/images/logo/new.gif

    此文件位置:/www/html/images/logo/new.gif

    实现URL路径的映射,从而所访问的资源不再依赖于站点根目录;

    Alias /URL/ "/path/to/somewhere/"

 


12、设定默认字符集

ASCII

字符集:GB2312, GB18030, GBK

UTF

AddDefaultCharset 

 

13CGI脚本

CGI脚本路径别名

/var/www/cgi-bin/

http://server/cgi-bin/

bashCGI脚本:

所有文本都使用命令输出:echo, printf, cat 

执行程序:命令引用

Content-Type: text/html

<pre>

</pre>

FastCGI: 协议

 

14、基于用户访问控制

用户认证:

基本认证: Basic

摘要认证:digest

 

虚拟用户:仅用于访问某服务或获取某资源的凭证;

文本文件:.htpasswd

SQL数据库

dbm: 数据库引擎,提供API

ldap: 

authentication provider: 账号和密码的存储机制;

authn

authorization provider: 授权

 

15、虚拟主机

虚拟主机:使用不同访问路径

基于端口

基于IP

基于主机名

(1) 使用虚拟的前提:取消主服务器

注释主服务器的站点根路径指定:DocumentRoot

(2) 定义虚拟主机

NameVirtualHost IP:PORT

<VirtualHost IP:PORT>

ServerName 

DocumentRoot 

ServerAlias

ErrorLog

CustomLog

</VirtualHost>

配置文件语法检查:

httpd -t

service httpd configtest

配置示例:

<VirtualHost 172.16.100.7:80>

    ServerName www.mageedu.com

    DocumentRoot "/web/hosta"

</VirtualHost>

<VirtualHost 172.16.100.8:80>

    ServerName www.mageedu.com

    DocumentRoot "/web/hostb"

</VirtualHost>

<VirtualHost 172.16.100.8:8080>

    ServerName www.mageedu.com

    DocumentRoot "/web/hostc"

</VirtualHost>

测试:elinks

-dump: 获取到页面数据后直接退出进程;

 

16https协议

ssl(安全的套接字层), tls(传输层安全)

    httpd: ssl

ssl模块

单独成包

ssl会话基于IP地址创建,所以,每一个IP仅创建一个SSL会话;

ssl握手要完成的工作:

交换协议版本号

选择双方都支持的加密方式

客户端对服务器端实现身份验正

密钥交换

https协议基于SSL二进制编码, 443/tcp

openssl s_client 

客户端验正服务器端证书:

有效性检测:证书是否仍然在有效期内

CA的可信度检测:

证书的完整性检测:

持有者的身份检测

配置httpd工作于https

(1) 安装mod_ssl模块

# yum install mod_ssl

(2) 为服务端生成私钥,并为其提供证书;

# mkdir /etc/httpd/ssl && cd /etc/httpd/ssl

# (umask 077; openssl genrsa -out httpd.key 1024)

# openssl req -new -key httpd.key -out httpd.csr

签署后的证书为:/etc/httpd/ssl/httpd.crt

(3) 配置使用https的虚拟主机;

SSLCertificateFile

SSLCertificateKeyFile

<VirtualHost IP:443>

DocumentRoot

ServerName

</VirtualHost>

(4) 重新装载配置

(5) 测试

# openssl s_client -connect IP:PORT -CAfile /path/to/ca_certificate

 

17status页面

httpd内嵌有handler,其中有一个handler用于输出当前httpd服务相关状态信息

handler: server-status

启用handler要使用SetHandler指令

handler: 当文件被调用时,apache内部表示形式;一般每种文件类型都有其隐式处理器

 

18、访问属性配置总结

配置文件系统访问路径:

<Directory [~] "">

</Directory>

<File [~] "">

</File>

配置URL访问路径:

<Location [~] "">

</Location>

<LocationMatch "">

</LocationMatch>

/var/www/html/

images/

 

19curl命令

curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILELDAP等协议。curl支持HTTPS认证,并且支持HTTPPOSTPUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传,http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。

curl的常用选项:

    -A/--user-agent <string> 设置用户代理发送给服务器

    -basic 使用HTTP基本认证

    --tcp-nodelay 使用TCP_NODELAY选项

    -e/--referer <URL> 来源网址

    --cacert <file> CA证书 (SSL)

    --compressed 要求返回是压缩的格式

    -H/--header <line>自定义头信息传递给服务器

    -I/--head 只显示响应报文首部信息

    --limit-rate <rate> 设置传输速度

    -u/--user <user[:password]>设置服务器的用户和密码

    -0/--http1.0 使用HTTP 1.0

 

20、使用mod_deflate模块压缩页面优化传输速度

SetOutputFilter DEFLATE

# mod_deflate configuration

# Restrict compression to these MIME types

AddOutputFilterByType DEFLATE text/plain 

AddOutputFilterByType DEFLATE text/html

AddOutputFilterByType DEFLATE application/xhtml+xml

AddOutputFilterByType DEFLATE text/xml

AddOutputFilterByType DEFLATE application/xml

AddOutputFilterByType DEFLATE application/x-javascript

AddOutputFilterByType DEFLATE text/javascript

AddOutputFilterByType DEFLATE text/css


 

 

21httpd程序包自带的工具介绍

httpd: 

apache服务器程序

-t: 测试配置文件

-l: 列表静态模块

-D DUMP_MODULES:列出DSO模块

-M

-D DUMP_VHOSTS: 列出所有虚拟主机

htpasswd:为基于文件的basic认证创建和更新用户认证文件

apachectl: 脚本,httpd服务控制工具;

ab: apache benchmarkhttpd的基准性能测试工具

apxs: httpd得以扩展使用第三方模块的工具;

htcacheclean: 磁盘缓存清理工具;

htdigest: digest认证创建和更新用户认证文件

httxt2dbm:rewrite map创建dbm格式的文件

rotatelogs: 不关闭httpd而切换其使用日志文件的工具

suexec:

User apache

Group apache

httpd进程需要以另外的用户的身份去访问某些资源时,可以以suexec作临时切换

 

 

22ab工具的初步使用

同类工具:http_load, webbench, seige

Usage: ab [options] [http[s]://]hostname[:port]/path

-c #: 模拟的并发数;

-n #: 总的请求数

-n的值一定要大于等于-c的值;

 

 

23、资源限定

软限定:可临时超出一定时长的上限

硬限定:绝对不可超出的上限

管理员可使用ulimit命令临时性地修改各种资源的软限制;

ulimit -n #:能同时打开的文件数

   -u #: 能同时启动的进程数

配置文件:

/etc/security/limits.conf

/etc/security/limits.d/*.conf

 

 

24、编译安装httpd-2.4

httpd-2.0, httpd-2.2, httpd-2.4

httpd程序依赖于aprapr-util

apr: apache portable runtime

httpd-2.4的新特性:

1MPM支持在运行时装载;

--enable-mpms-shared=all --with-mpm={prefork|worker|event}

2)支持event mpm

3)异步读写

4)在每模块及每目录分别使用不同的日志级别

5)每请求的配置;<If>,<Elseif>

6)增强版的表达式分析器

7)毫秒级的keep alivetimeout

8)基于FQDN的虚拟主机不再需要NameVirtualHost指令;

9)支持用户使用自定义变量

新增了一些模块:mod_proxy_fcgi, mode_ratelimit, mod_request, mod_remoteip

修改了一些配置机制:

不再支持使用order, allow, deny定义基于ip的访问控制;改为require

编译安装httpd-2.4

# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-mpms-shared=all --with-mpm=event --enable-modules=most

# make && make install

基于IP做访问控制:

允许所有主机访问:Require all granted

拒绝所有主机访问:Require all deny

控制某特定主机的访问:

Require ip IPADDR

Require not ip IPADDR

IPADDR:

单个ip

Network/Netmask: 

Network/Length: 172.16.0.0/16

Net: 172.16

Require host HOSTNAME

Require not host HOSTNAME

HOSTNAME:

FQDN:具体的主机

DOMAIN: 域内的所有主机