2004-11-17 10:58:00 yiyiyaya 阅读数 1306
Linux下已有的最简smtp client 程序SMTPClient: http://www.engelschall.com/sw/smtpclient/ SMTPClient 原先只支持quoted-printable MIME,参照下文的介绍对原程序稍加修改,便可支持application/octet-stream附件发送. 1.加入认证 现在大多数外发邮件服务器都需要用户认证.未经过认证的,可以给自己及同一个域的用户发邮件,但是不能外发,否则服务器会返回出错信息.如: SMTPclient: unexpected reply: 554 Service unavailable; Client host [218.79.104.4] blocked using cblless.anti-spam.org.cn; Mail from 218.79.0.0/16 refused, see http://anti-spam.org.cn/services/rblquery.php?IP=218.79.0.0 常用的认证方式在下文中有详悉介绍,实现的时候,个人认为用plain比较简单,可将用户名和密码在一行里同时发出,大多数的SMTP Server支持这种认证方式. http://www.fehcom.de/qmail/smtpauth.html 在smtpclient里添加认证时,只需多加3个选项,一个标志使用认证,另两个分别标志用户名和密码,随后在程序里与服务器交互流程中按格式增加AUTH行便可. 2. 添加MIME(multipart) MIME格式详解参见: http://dev.csdn.net/develop/article/18/18448.shtm 其中对附件进行base64编码,可使用另一个free software: base64.下载地址: http://www.fourmilab.ch/webtools/base64/ 在向smtpclient程序里添加mime代码时,需特别注意邮件头与邮件体之间必需输出空行,本人就因忽略了这点,用MUA收到的邮件可以看到回形针的附件标志,却没有显示附件及邮件内容.如果查看原文件,经过编码的内容都是有的.
2020-02-09 13:52:45 blueicex2017 阅读数 129

一、HTTP协议

1.版本历史

http:Hyper text transfer protocol 超文本传输协议, 端口:80/TCP,
http/0.9 1991原型版本,只有一个命令GET,GET /index.html ,服务器只能回应HTML格式字符串,不能回应别的格式。
http/1.0 1996年5月,支持cache,MIME,method,每个TCP连接只能发送一个请求,发送数据完毕,连接关闭,再发送其他资源,重新建立新链接。引用了POST命令和HEAD命令,头信息是ASCII码,后面数据可为任何格式,服务器回应是会告诉客户端,数据是什么格式,即content-type字段作用,这些数据类型总称为MIME多用途互联网邮件扩展,每个值包括一级类型和二级类型,预定义的类型,也可自定义类型,常见的major/minor;text/xml,text/html;images/jpg,images/png。可传输图片音频多媒体信息。
http/1.1 1997年1月,引入持久连接,不用声明connection:keep-alive,对于同一域名,大多数浏览器运输同时建立6个持久连接。引入管道机制,同一个TCP连接里,客户端可以同时发送多个请求。新增方法PUT、PATCH、OPTIONS、DELETE,同一个TCP连接里,所有的数据通信是按次序进行的。服务器只能顺序处理回应,前面的回应慢,会有许多请求排队,造成"队头堵塞"(Head-of-line blocking)
HTTP 协议不带有状态,每次请求都必须附上所有信息。请求的很多字段都是重复的,费带宽,影响速度
http/2.0 2015年,头信息和数据体都是二进制,称为头信息帧和数据帧,复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了“队头堵塞“,此双向的实时通信称为多工(Multiplexing),引入头信息压缩机制(header compression),头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度,HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)

2.HTTP工作机制

为提高HTTP连接性能,产生了几种连接方式
并行连接:通过多条TCP连接发起并发的HTTP请求 1.1支持
持久连接:keep-alive,长连接,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接 1.1支持
管道化连接:通过共享TCP连接发起并发的HTTP请求 2.0支持
复用的连接:交替传送请求和响应报文(实验阶段) 2.0支持

3.URI

URI: Uniform Resource Identifier 统一资源标识,分为URL和URN
URN: Uniform Resource Naming,统一资源命名, 示例:P2P下载使用的磁力链接是URN的一种实现 magnet:?xt=urn:btih:660557A6890EF888666。
URL: Uniform ResorceLocator,统一资源定位符,用于描述某服务器某特定资源位置。
两者区别:URN如同一个人的名称,而URL代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。URN仅用于命名,而不指定地址
URL组成

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
scheme:方案,访问服务器以获取资源时要使用哪种协议
user:用户,某些方案访问资源时需要的用户名
password:密码,用户对应的密码,中间用:分隔
Host:主机,资源宿主服务器的主机名或IP地址
port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔 (docroot)
params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔
4.网站访问数据

A. IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标

B. PV(访问量):即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量
C.UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的
QPS:request per second,每秒请求数

5.HTTP请求处理过程

A.浏览器根据域名解析IP地址

浏览器缓存:首先搜索浏览器自身的DNS缓存,看自身的缓存中是否是有域名对应的条目,而且没有过期,如果有且没有过期则解析到此结束。
系统缓存:如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。
路由器缓存:如果系统缓存也没有找到,则会向路由器发送查询请求。
ISP(互联网服务提供商) DNS缓存:如果在路由缓存也没找到,最后要查的就是ISP缓存DNS的服务器。

B. 浏览器与WEB服务器建立TCP连接

TCP的3次握手。

C.浏览器给WEB服务器发送HTTP请求

一个HTTP请求报文由请求行(request line)、请求头部(headers)、空行(blank line)和请求数据(request body)4个部分组成。
请求行:分为三个部分,请求方法、请求地址URL和HTTP协议版本,它们之间用空格分割。例如,GET /index.html HTTP/1.1。
请求方法:HTTP/1.1 定义的请求方法有8种:GET(完整请求一个资源)、POST(提交表单)、PUT(上传文件)、DELETE(删除)、PATCH、HEAD(仅请求响应首部)、OPTIONS(返回请求的资源所支持的方法)、TRACE(追求一个资源请求中间所经过的代理)。最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。
GET方法:当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,会送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号‘?’代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。通过GET方式传递的数据直接放在地址中,所以GET方式的请求一般不包含“请求内容”部分,请求数据以地址的形式表现在请求行。地址中‘?’之后的部分就是通过GET发送的请求数据,各个数据之间用‘&’符号隔开。显然这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一半最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。如果数据是英文字母/数字,原样发送;如果是空格,转换为+;如果是中文/其他字符,则直接把字符串用BASE64加密,得出:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
POST方法:允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。POST方式请求行中不包含数据字符串,这些数据保存在“请求内容”部分,各数据之间也是使用‘&’符号隔开。POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。
URL:统一资源定位符,是一种资源位置的抽象唯一识别方法。 组成:<协议>://<主机>:<端口>/<路径>, 端口和路径有事可以省略(HTTP默认端口号是80)
协议版本:协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
请求头部: 请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据。
请求数据: 请求数据不在GET方法中使用,而在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最长使用的请求头部是Cntent-Type和Content-Length。
请求报文内容

POST  /index.php HTTP/1.1    #请求行
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2  #请求头
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
username=aa&password=1234  #请求数据
D.服务器端响应HTTP请求,浏览器得到HTML代码

HTTP响应报文由状态行(status line)、相应头部(headers)、空行(blank line)和响应数据(response body)4个部分组成。
状态行:状态行由3部分组成,分别为:协议版本、状态码、状态码扫描。其中协议版本与请求报文一致,状态码描述是对状态码的简单描述。
响应数据:用于存放需要返回给客户端的数据信息。
响应报文内容

HTTP/1.1 200 OK  状态行
Date: Sun, 17 Mar 2013 08:12:54 GMT  响应头部
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
<html>  响应数据
<head>
<title>HTTP响应示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>
E.浏览器解析HTML代码,并请求HTML代码中的资源

浏览器拿到HTML文件后,开始解析HTML代码,遇到静态资源时,就向服务器端去请求下载。

F.关闭TCP连接,浏览器对页面进行渲染呈现给用户

浏览器利用自己内部的工作机制,把请求到的静态资源和HTML代码进行渲染,呈现给用户。

6.http服务器程序

httpd
nginx 现也已支持lua
lighttpd 最早支持lua脚本动态引擎配置

二、apache httpd

1.发展历史

httpd (d:doemon守护进程), 20世纪90年代初,国家超级计算机应用中心NCSA开发, 1995年开源社区发布apache(后解散由社区等人维护 a patchy server,有bug就打补丁,所以叫充满补丁的服务),ASF: apache software foundation apache软件基金会,FSF:Free Software Foundation 自由软件基金会。
高度模块化:core + modules,DSO: Dynamic Shared Object 动态加/卸载,MPM:multi-processing module多路处理模块。6系列的版本默认提供的是httpd-2.2版本的rpm包;7系列的版本默认提供的是httpd-2.4版本的rpm包

2.MPM工作模式

prefork:多进程I/O模型,每个进程响应一个请求,默认模型。
一个主进程:生成和回收n个子进程,创建套接字,不响应请求
多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个
worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:mn
event:事件驱动模型(worker模型的变种)
一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m
n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力

3.功能特性

虚拟主机
支持三种类型主机:
IP(不同的IP服务于不同的站点)
Port(不同的端口服务于不同的站点)
FQDN(不同的主机名来映射不同的站点)
CGI:Common Gateway Interface,通用网关接口
反向代理
负载均衡
路径别名
富的用户认证机制:basic 要素、digest 摘要
支持第三方模块

4. 程序机构

/var/log/httpd/access.log:访问日志
/var/log/httpd/error_log:错误日志
/var/www/html/:站点文档目录(yum)
/usr/local/apache/htdocs:站点文档目录(源码)
/usr/lib64/httpd/modules/:模块文件路径
/etc/httpd/conf/httpd.conf:主配置文件
/etc/httpd/conf.modules.d/.conf:模块配置文件
/etc/httpd/conf.d/
.conf:辅助配置文件

5. 工具程序

htpasswd:basic认证基于文件实现时,用到的帐号密码生成工具
apachectl:httpd自带的服务控制脚本,支持start,stop,restart
apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具
rotatelogs:日志滚动工具
suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户运行的工具
ab:apache benchmark,httpd的压力测试工具
curl:基于URL语法在命令行方式下工作的文件传输工具
支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等协议,功能有:https认证、http的POST/PUT等方法、ftp上传、kerberos认证、http上传、代理服务器、cookies、用户名/密码认证等。
语法:curl [options] [URL …]
-o/–output //把输出写到文件中
-e/–referer //来源网址

[root@localhost ~]# curl -o myblog.html http://blog.51cto.com/itchentao
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 67025    0 67025    0     0  87248      0 --:--:-- --:--:-- --:--:-- 87385
[root@localhost ~]# ls
myblog.html

httpd:启动程序

httpd [options]
-l	//查看静态编译的模块,列出核心中编译了哪些模块
-M	//输出一个已经启用的模块列表
-v  //显示httpd的版本,然后退出
-V	//显示httpd和apr/apr-util的版本和编译参数,然后退出
-X	//以调试模式运行httpd,ctrl+c退出
-t	//检查配置文件是否有语法错误

6. 编译安装httpd-2.4(需要耐心)

所需安装包下载位置
https://pan.baidu.com/s/1MP3Tz2C8PdbW6aKKwxWclw

A.建立安装位置
[root@master ~]# mkdir /blueicex/soft/ -p && mkdir /usr/local/{apr,apr-util,pcre,libxml2,openssl,boost,libmcrypt,mhash,mcryptgd,iconv,zlib,xmlrpc,gettext,curl,jpeg,freetype}  &&  mkdir /usr/local/httpd24/{etc,bin,sbin,libexec,com,var,lib,include,share,info,locale,man,html,pdf,dvi,ps,doc} -p
B.下载组件
[root@master ~]mkdir /blueicex/soft/httpd/ -pv
[root@master ~]cd /blueicex/soft/httpd/
[root@master ~]lftp 192.168.1.43
lftp 192.168.1.42:/> mget apr-1.6.3.tar.gz apr-util-1.6.1.tar.gz pcre-8.38.tar.gz libxml2-2.7.8.tar.gz zlib-1.2.11.tar.gz openssl-1.1.0g.tar.gz
[root@master httpd]# for a in `ls .`;  do  tar xvf $a;  done
C.编译安装各个组件
#Installing Perl  
[root@master httpd]#yum install perl -y
curl -L http://xrl.us/installperlnix | bash
[root@master httpd]# yum install -y gcc gcc-c++ cmake expat-devel 
#echo $?输出0安装成功,分别进入各安装包,编译安装
[root@master apr-1.6.3]# ./configure --prefix=/usr/local/apr && make && make install && echo $?
#官网上说明可以不编译安装,解包在/httpd_source_tree_root/srclib/apr and 
[root@master apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util  --with-apr=/usr/local/apr && make && make install && echo $?
#pcre 必须安装2.0以下的 
[root@master pcre-8.38]# ./configure --prefix=/usr/local/pcre && make && make install  && echo $?
[root@master libxml2-2.7.8]# ./configure --prefix=/usr/local/libxml2  && make && make install && echo $?
[root@master zlib-1.2.11]# ./configure --prefix=/usr/local/zlib && make && make install && echo $?
[root@master openssl-1.1.0g]./config --prefix=/usr/local/openssl && make && make install && echo $?
D.下载编译安装httpd2.4

完整安装

lftp 192.168.1.43:/> ls *http*
11-25-17  08:58PM              7684419 httpd-2.2.34.tar.gz
12-01-17  10:42PM              8638793 httpd-2.4.29.tar.gz
lftp 192.168.1.43:/> get httpd-2.4.29.tar.gz
8638793 bytes transferred                                
lftp 192.168.1.43:/> exit
[root@master httpd]# tar xf httpd-2.4.29.tar.gz 
[root@master httpd]# cd httpd-2.4.29/
[root@master httpd-2.4.29]# ./configure --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --prefix=/usr/local/httpd24 --sysconfdir=/usr/local/httpd24/etc/ --bindir=/usr/local/httpd24/bin --sbindir=/usr/local/httpd24/sbin --libexecdir=/usr/local/httpd24/libexec --localstatedir=/usr/local/httpd24/var --libdir=/usr/local/httpd24/lib --includedir=/usr/local/httpd24/include --datarootdir=/usr/local/httpd24/share --infodir=/usr/local/httpd24/info  --localedir=/usr/local/httpd24/locale --mandir=/usr/local/httpd24/man --htmldir=/usr/local/httpd24/html --dvidir=/usr/local/httpd24/dvi --pdfdir=/usr/local/httpd24/pdf --psdir=/usr/local/httpd24/ps --docdir=/usr/local/httpd24/doc --enable-module=ssl --enable-shared=ssl --enable-so --enable-ssl --enable-cgi  --enable-rewrite --with-ssl=/usr/local/openssl --with-zlib=/usr/local/zlib --with-pcre=/usr/local/pcre --with-mpm=prefork --enable-modules=most --enable-mpms-shared=all && make && make install && echo $?
#以上安装会报exports…………错误,去掉--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util继续安装
#安装不成功使用make clean
[root@master httpd-2.4.29]# make clean
[root@master httpd-2.4.29]# ./configure  --prefix=/usr/local/httpd24 --sysconfdir=/usr/local/httpd24/etc/ --bindir=/usr/local/httpd24/bin --sbindir=/usr/local/httpd24/sbin --libexecdir=/usr/local/httpd24/libexec --localstatedir=/usr/local/httpd24/var --libdir=/usr/local/httpd24/lib --includedir=/usr/local/httpd24/include --datarootdir=/usr/local/httpd24/share --infodir=/usr/local/httpd24/info  --localedir=/usr/local/httpd24/locale --mandir=/usr/local/httpd24/man --htmldir=/usr/local/httpd24/html --dvidir=/usr/local/httpd24/dvi --pdfdir=/usr/local/httpd24/pdf --psdir=/usr/local/httpd24/ps --docdir=/usr/local/httpd24/doc --enable-module=ssl --enable-shared=ssl --enable-so --enable-ssl --enable-cgi  --enable-rewrite --with-ssl=/usr/local/openssl --with-zlib=/usr/local/zlib --with-pcre=/usr/local/pcre --with-mpm=prefork --enable-modules=most --enable-mpms-shared=all && make && make install && echo $?

简易安装
也可以yum安装完成各个组件后,只编译httpd。

[root@master ~]# yum install gcc gcc-c++ cmake expat-devel apr  apr-util  openssl zlib   pcre  libxml2 perl 
[root@master httpd-2.4.29]# ./configure  --prefix=/usr/local/httpd24 && make && make install && echo $?
E.创建启动服务
#centos/redhat6系列
[root@master ~] cp /usr/local/httpd24/sbin/apachectl /etc/rc.d/init.d/httpd  #设置为系统服务
[root@master ~] ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc3.d/S80httpd   #在启动级别3中自启动  
#centos/redhat7系列
[root@master ~] mkdir  /usr/local/httpd24/etc/sysconfig/
[root@master ~] echo LANG=C >> /usr/local/httpd24/etc/sysconfig/httpd
[root@master ~] vim /usr/lib/systemd/system/httpd.service 
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:/usr/local/httpd24/sbin/httpd(8)
Documentation=man:/usr/local/httpd24/sbin/apachectl(8)
[Service]
Type=forking
EnvironmentFile=/usr/local/httpd24/etc/sysconfig/httpd
ExecStart=/usr/local/httpd24/sbin/httpd $OPTIONS -k start
ExecReload=/usr/local/httpd24/sbin/httpd $OPTIONS -k graceful
ExecStop=/usr/local/httpd24/sbin/httpd $OPTIONS -k stop
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
F.验证安装

修改配置文件
[root@master etc]# pwd
/usr/local/httpd24/etc
[root@master etc]# cp httpd.conf httpd.conf.bak

G.帮助文件关联安装
[root@master httpd24]# pwd
/usr/local/httpd24
[root@master httpd24]# cd man
[root@master man]# ls
man1  man8
[root@master man]# cd man8
[root@master man8]# ls
apachectl.8  fcgistarter.8  htcacheclean.8  httpd.8  rotatelogs.8  suexec.8
[root@master man8]# for i in `ls `; do tar czf $i.gz $i; done
[root@master man8]# ls
apachectl.8     fcgistarter.8     htcacheclean.8     httpd.8     rotatelogs.8     suexec.8
apachectl.8.gz  fcgistarter.8.gz  htcacheclean.8.gz  httpd.8.gz  rotatelogs.8.gz  suexec.8.gz
[root@master man8]# cp *.8.gz /usr/share/man/man8/
[root@master man8]# cd ..
[root@master man]# cd man
man1/ man8/ 
[root@master man]# cd man1
[root@master man1]# ls
ab.1  apxs.1  dbmmanage.1  htdbm.1  htdigest.1  htpasswd.1  httxt2dbm.1  logresolve.1
[root@master man1]# for i in `ls `; do tar czf $i.gz $i; done
[root@master man1]# cp *.1.gz /usr/share/man/man3/

7.yum安装httpd

8.httpd配置

适于yum安装的httpd

A.配置文件构成
[root@master conf]# grep -v -e  '#' -e '^$' httpd.conf 
#配置文件路径
ServerRoot "/etc/httpd"
#监听端口,增加虚拟服务器时候,需要设置
Listen 80
#动态加载模块的配置文件
Include conf.modules.d/*.conf
User apache
Group apache
#错误发送邮箱
ServerAdmin root@localhost
#服务器的名字,一般与主机扩展名相同
ServerName www.master.blueicex.com:80
#根目录权限设置
<Directory />
    AllowOverride none
    Require all denied
</Directory>
#web服务文档根路径
DocumentRoot "/var/www/html"
<Directory "/var/www">
    AllowOverride None
    Require all granted
</Directory>
<Directory "/var/www/html">
    #几个选项的复合值,Indexes索引目录,默认没有主页时允许索引目录   FollowSymLinks:支持符号链接  软连接
    Options Indexes FollowSymLinks
    #和访问权限有关,None不使用认证,all应用所有的认证指令,AuthConfig 允许使用与认证授权相关的指令 
    AllowOverride None
    访问控制
    Require all granted
</Directory>
<IfModule dir_module>
    #默认网站索引页的名称
    DirectoryIndex index.html
</IfModule>
#以所有.ht开头进行模式匹配不能进行访问,隐藏.htaccess
<Files ".ht*">
    Require all denied
</Files>
#错误日志存放位置
ErrorLog "logs/error_log" 
#错误日志级别
LogLevel warn
<IfModule log_config_module>
    #日志格式定义
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%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>
    #自定义日志格式
    CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
    #脚本路径的别名
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
  #脚本路径的权限
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<IfModule mime_module>
#支持的非二进制文件类型
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>
#默认字符集
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>
#开启线程模式
EnableSendfile on
IncludeOptional conf.d/*.conf

Options
后跟1个或多个以空白字符分隔的选项列表,在选项前的+,- 表示增加或删除指定选项。
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
FollowSymLinks:允许访问符号链接文件所指向的源文件
None:全部禁用
All: 全部允许

AllowOverride     
与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令,只对语句有效
AllowOverride All:.htaccess中所有指令都有效
AllowOverride None:.htaccess 文件无效
AllowOverride AuthConfig Indexes :除了AuthConfig和Indexes的其它指令都无法覆盖

Require
2.4新增
Require all granted:允许所有主机访问
Require all denied :拒绝所有主机访问
Require ip IPADDR :授权指定来源地址的主机访问
Require not ip IPADDR :拒绝指定来源地址的主机访问
Require host HOSTNAME:授权指定来源主机名的主机访问
Require not host HOSTNAME :拒绝指定来源主机名的主机访问
无明确授权的目录,默认拒绝。允许所有主机访问:Require all granted,拒绝所有主机访问:Require all denied。  
控制特定的IP访问
Require ip IPADDR:授权指定来源的IP访问
Require not ip IPADDR:拒绝特定的IP访问
控制特定的主机访问
Require host HOSTNAME:授权特定主机访问
Require not host HOSTNAME:拒绝
HOSTNAME
FQDN:特定主机
domin.tld:指定域名下的所有主机
不能有失败,至少有一个成功匹配才成功,即失败优先

<RequireAll>
  Require all granted
  Require not ip 172.16.1.1   #拒绝特定IP
</RequireAll>

多个语句有一个成功,则成功,即成功优先

<RequireAny>
  Require all denied
    require ip 172.16.1.1     #允许特定IP
</RequireAny>
B. 虚拟主机

虚拟主机模板文件:/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf
[root@master httpd-2.4.6]# pwd
/usr/share/doc/httpd-2.4.6
注意查看有用信息

[root@master httpd-2.4.6]# cat httpd-vhosts.conf 
# Virtual Hosts
#
# Required modules: mod_log_config

# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at 
# <URL:http://httpd.apache.org/docs/2.4/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
<VirtualHost *:@@Port@@>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "@@ServerRoot@@/docs/dummy-host.example.com"
    ServerName dummy-host.example.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "/var/log/httpd/dummy-host.example.com-error_log"
    CustomLog "/var/log/httpd/dummy-host.example.com-access_log" common
</VirtualHost>

VirtualHost *:所有Ip
@@Port@@:端口号
ServerAdmin:故障信息发送邮箱,可删除
DocumentRoot:网站存放位置
ServerName:域名
ServerAlias:别名,可删除
ErrorLog :错误日志
CustomLog:访问日志

注意查看有用信息

 [root@master conf.d]# vim /etc/httpd/conf/httpd.conf 
<Directory "/var/www/html">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks   
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    AllowOverride None
    # Controls who can get stuff from this server.
    Require all granted
</Directory>

<Directory /var/www/html/www>
    <RequireAll>
        Require not ip 192.168.1.20
        Require all granted
    </RequireAll>
</Directory>

不同端口的虚拟主机
基于port:为每个虚拟主机使用至少一个独立的port

 [root@master httpd-2.4.6]# cp httpd-vhosts.conf  /etc/httpd/conf.d/ports.conf
 [root@master httpd-2.4.6]# vim /etc/httpd/conf.d/ports.conf
Listen 81
<VirtualHost *:80>
    DocumentRoot "/blueicex/temp/port80"
    #可不设置
    ServerName port80.example.com  
    #可不设置
    ErrorLog "/blueicex/temp/port80/logs/port80.example.com-error_log"
    #可不设置
    CustomLog "/blueicex/temp/port80/logs/port80.example.com-access_log" common
</VirtualHost>
<Directory "/blueicex/temp/port80">
    Options All  
    AllowOverride None 
    Require all granted
</Directory>
<VirtualHost *:81>
    DocumentRoot  "/blueicex/temp/port81"
    ServerName port81.example.com
    ErrorLog "/blueicex/temp/port81/logs/port81.example.com-error_log"
    CustomLog "/blueicex/temp/port81/logs/port81.example.com-access_log" common
</VirtualHost>
<Directory "/blueicex/temp/port81">
    Options All  
    AllowOverride None 
    Require all granted
</Directory>
[root@master  ~]# mkdir /blueicex/temp/port80/logs -pv
[root@master  ~]# mkdir /blueicex/temp/port81/logs -pv
[root@master  ~]# systemctl restart httpd
Syntax OK
[root@master  ~]# echo "port80" > /blueicex/temp/port80/index.html
[root@master  ~]# echo "port81" > /blueicex/temp/port81/index.html
 

不同IP的虚拟主机
基于ip:为每个虚拟主机准备至少一个ip地址

[root@master ~]# ip addr add 192.168.1.135/24 dev ens33
[root@master ~]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:c5:b4:24 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.71/24 brd 192.168.1.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.1.135/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::5bd8:1c97:8ea5:8c9b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

[root@master ~]# vim /etc/httpd/conf.d/ips.conf
<VirtualHost 192.168.1.71:80>
    DocumentRoot /blueicex/temp/ips/71"
</VirtualHost>
<VirtualHost 192.168.1.135:80>
    DocumentRoot /blueicex/temp/ips/135"
</VirtualHost>
<Directory "/blueicex/temp/ips/71">
    Options All  
    AllowOverride None 
    Require all granted
</Directory>
<Directory "/blueicex/temp/ips/135">
    Options All  
    AllowOverride None 
    Require all granted
</Directory>

不同主机名或域名的虚拟主机
基于FQDN:为每个虚拟主机使用至少一个FQDN

[root@master ~]# vim /etc/httpd/conf.d/difdomain.conf
<VirtualHost *:80>
    DocumentRoot "/blueicex/temp/difdomain/master.blueicex.com"
    ServerName master.blueicex.com 
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot "/blueicex/temp/difdomain/master.blueice.com"
    ServerName master.blueice.com
</VirtualHost>
<Directory "/blueicex/temp/difdomain/master.blueice.com">
    Options All  
    AllowOverride None 
    Require all granted
</Directory>
<Directory "/blueicex/temp/difdomain/master.blueicex.com">
    Options All  
    AllowOverride None 
    Require all granted
</Directory>
[root@master ~]# vim  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.71 master master.blueice.com  master.blueicex.com  

一般虚拟机不要与main主机混用;因此,要使用虚拟主机,一般先禁用main主机,注释中心主机的DocumentRoot

C.三种模式切换

MPM配置文件模板/usr/share/doc/httpd-2.4.6/httpd-mpm.conf

[root@master usr]# cd /usr/share/doc/httpd-2.4.6
[root@master httpd-2.4.6]# cat httpd-mpm.conf 

MPM工作模式切换配置文件

[root@master conf.modules.d]# pwd
/etc/httpd/conf.modules.d
[root@master conf.modules.d]# cat 00-mpm.conf 
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#prefork工作模式,默认配置
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#work工作模式,去掉#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#event工作模式,去掉#
#LoadModule mpm_event_module modules/mod_mpm_event.so

prefork模式
prefork是Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接,效率高,但内存占用量比较大。
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。

worker模式
worker使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接,内存占用量比较小,适合高流量的http服务器。缺点是假如一个线程崩溃,整个进程就会连同其任何线程一起”死掉”,所以要保证一个程式在运行时必须被系统识别为”每个线程都是安全的”。
此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。

prefork和worker模式的比较
prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。
worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起"死掉"。由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"。

prefork模式配置详解
ServerLimit
默认的MaxClient最大是256个线程,如果想设置更大的值,就的加上ServerLimit这个参数。20000是ServerLimit这个参数的最大值。如果需要更大,则必须编译apache,此前都是不需要重新编译Apache。
生效前提:必须放在其他指令的前面
StartServers
指定服务器启动时建立的子进程数量,prefork默认为5。
MinSpareServers
指定空闲子进程的最小数量,默认为5。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。
MaxSpareServers
设置空闲子进程的最大数量,默认为10。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。此参数不要设的太大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1"。
MaxClients
限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,你必须同时增大ServerLimit。
MaxRequestsPerChild
每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。如果 MaxRequestsPerChild为"0",子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:
可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

worker模式配置详解
StartServers
服务器启动时建立的子进程数,默认值是"3"。
MaxClients
允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候队列。默认值 是"400",16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加ServerLimit的值。
MinSpareThreads
最小空闲线程数,默认值是"75"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。
MaxSpareThreads
设置最大空闲线程数。默认值是"250"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。 MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:worker要求其大于等于 MinSpareThreads加上ThreadsPerChild的。
ThreadsPerChild
每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。
MaxRequestsPerChild
设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:
可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
注意对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。

D. 路径别名
vim /etc/httpd/conf/httpd.conf
    ...
Alias /bieming/ /app/bieming/
        <Directory "/app/bieming/">
            Options none
            AllowOverride none
            Require all granted
        </Directory>
    ...

9.https配置

A.安装mod_ssl

[root@master modules]# pwd
/etc/httpd/modules
# 没有ssl模块
[root@master modules]# ls mod_ssl.so
ls: cannot access mod_ssl.so: No such file or directory
[root@master modules]# yum install mod_ssl -y
[root@master modules]# ll mod_ssl.so 
-rwxr-xr-x 1 root root 219536 Aug  8  2019 mod_ssl.so
[root@master conf.modules.d]# pwd
/etc/httpd/conf.modules.d
[root@master conf.modules.d]# vim 00-ssl.conf 
LoadModule ssl_module modules/mod_ssl.so

B.签发证书

[root@master ~]#cd /etc/pki/CA/
# 生成秘钥
[root@master CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
# 提取公钥
[root@master CA]# openssl rsa -in private/cakey.pem -pubout
# CA生成自签署证书
[root@master CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
[root@master CA]# touch index.txt && echo 01 > serial
[root@master CA]# ls
cacert.pem  certs  crl  index.txt  newcerts  private  serial
# 客户端node1生成秘钥
[root@node1 ~]# cd /etc/httpd/
[root@node1 httpd]# mkdir ssl && cd ssl
[root@node1 ssl]# ls
[root@node1 ssl]# (umask 077;openssl genrsa -out httpd.key 2048)
# 客户端node1生成申请证书
[root@node1 ssl]# openssl req -new -key httpd.key -days 365 -out httpd.csr  
# 客户端node1把申请证书文件发送给CA
[root@node1 ssl]# ls
httpd.csr  httpd.key
[root@node1 ssl]# scp httpd.csr root@master:/root
[root@master ~]#ls
httpd.csr
# 生成证书httpd.crt
[root@master ~]#openssl ca -in /root/httpd.csr -out httpd.crt -days 365
[root@master ~]#ls
httpd.crt  httpd.csr
# 将证书传回给客户端
[root@master ~]#scp httpd.crt root@node1:/root
[root@node1 ~]# mv httpd.crt /etc/httpd/ssl/
[root@node1 ~]# ll /etc/httpd/ssl/
-rw-r--r--. 1 root root 4689 420 14:05 httpd.crt
-rw-r--r--. 1 root root 1074 420 13:55 httpd.csr
-rw-------. 1 root root 1675 420 13:51 httpd.key

C.http配置文件添加证书和秘钥

[root@master conf.d]# pwd
/etc/httpd/conf.d
[root@master conf.d]# ll ssl.conf 
-rw-r--r-- 1 root root 9443 Aug  6  2019 ssl.conf
[root@master conf.d]# vim sslweb.conf 
# 443端口为默认ssl端口,不必在Listen,不可使用其他端口,否则不认,验证输入https://192.168.1.71
<VirtualHost 192.168.1.71:443>
    DocumentRoot "/blueicex/temp/sslweb"
    SSLCertificateFile "/etc/httpd/ssl/httpd.crt"
    SSLCertificateKeyFile "/etc/httpd/ssl/httpd.key"
    SSLEngine on
</VirtualHost>
<Directory "/blueicex/temp/sslweb>
    Options All
    AllowOverride None
    Require all granted
</Directory>

10.https密码账户认证

认证方式两种:basic明文,digest摘要认证,兼容性差。
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因。

A.创建安全域
安全域格式

<Directory “/path">
Options None
# 是否允许覆盖
AllowOverride None  
# 认证类型
AuthType Basic
# 认证提示
AuthName "String"   
# 认证密码文件路径,通过htpasswd生成
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE" 
# 允许的用户
Require user username  
</Directory>
[root@master conf.d]# vim userauth.conf 
Listen 8080
<VirtualHost 192.168.1.71:8080>
    DocumentRoot "/blueicex/temp/userauth"
</VirtualHost>
<Directory "/blueicex/temp/userauth">
    Options Indexes
    AllowOverride none
    AuthType basic
    AuthName "some private area..."
    AuthUserFile "/etc/httpd/conf/.htpasswd"
    Require user gege
</Directory>

也可以定义".htaccess"

[root@master ~] vim /blueicex/temp/userauth/.htaccess
Options Indexes
AllowOverride none
AuthType basic
AuthName "some private area..."
AuthUserFile "/etc/httpd/conf/.htpasswd"
Require user gege

#允许账号文件中的所有用户登录访问
Require valid-user
#组用户文件访问
AuthGroupFile “/etc/httpd/conf/.htgroup”
Require group home

[root@master ~] vim /etc/httpd/conf/.htgroup 
home: gege blueicex
[root@master ~] chmod 600 /etc/httpd/conf/.htgroup 
[root@master conf.d]# vim groupauth.conf 
Listen 8081
<VirtualHost 192.168.1.71:8081>
    DocumentRoot "/blueicex/temp/groupauth"
</VirtualHost>
<Directory "/blueicex/temp/groupauth">
    Options Indexes
    AllowOverride none
    AuthType basic
    AuthName "some private area..."
    AuthUserFile "/etc/httpd/conf/.htpasswd"
    AuthGroupFile "/etc/httpd/conf/.htgroup"
    Require group home
</Directory>

也可以定义".htaccess"
[root@master ~] vim /blueicex/temp/userauth/.htaccess
Options Indexes
AllowOverride none
AuthType basic
AuthName “some private area…”
AuthUserFile “/etc/httpd/conf/.htpasswd”
AuthGroupFile “/etc/httpd/conf/.htgroup”
Require group home

[root@master conf.d]# mkdir /blueicex/temp/groupauth
[root@master conf.d]# mkdir /blueicex/temp/userauth
[root@master conf.d]# echo '<h1><center>groupauth</center></h1>' >> /blueicex/temp/groupauth/index.html
[root@master conf.d]# echo '<h1><center>userauth</center></h1>' >> /blueicex/temp/userauth/index.html

B.htpasswd创建账号
htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
-c:自动创建文件,仅应该在文件不存在时使用
-p:明文密码
-d:CRYPT格式加密,默认
-m:md5格式加密
-s:sha格式加密
-D:删除指定用户
-b:使用命令行直接添加密码,明文输入密码

[root@master ~]# htpasswd -b -c -s /etc/httpd/conf/.htpasswd gege gege
[root@master ~]# htpasswd -b -m /etc/httpd/conf/.htpasswd  blueicex blueicex
[root@master ~] chmod 600 /etc/httpd/conf/.htpasswd

检查是否启用身份验证模块,否则验证失败

[root@master ~]# grep auth_basic_module /etc/httpd/conf.modules.d/00-base.conf       
#LoadModule auth_basic_module modules/mod_auth_basic.so
[root@master ~]# httpd -M | grep basic 

11.http优化配置

A.保持持久连接(keepAlive)

服务器负载很轻时可打开,服务器负载较重时注意关闭。
KeepAlive on包含两个方面
KeepAliveTimeout #ms 保持连接超时时长
MaxKeepAliveRequests 100 # 最大并发请求数量
同时设置,客户端满足其中一条,就保持长连接。

B.启用压缩文档模块(mod_deflate )

优化传输速度,节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持(需要排除)。 压缩适于压缩比较大的资源,例如文本文件。系统默认已启用。

[root@master conf.modules.d]# pwd
/etc/httpd/conf.modules.d
[root@master conf.modules.d]# grep mod_deflate  *
00-base.conf:LoadModule deflate_module modules/mod_deflate.so
[root@master conf.modules.d]# vim mod_deflate.conf
LoadModule deflate_module modules/mod_deflate.so # 装载mod_deflate模块
#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
#设定压缩比:1-9
DeflateCompressionLevel 9 
#排除较老浏览器(不支持)
#Netscape 4.x 只压缩text/html
BrowserMatch ^Mozilla/4 gzip-only-text/html
#Netscape 4.06-08三个版本 不压缩
BrowserMatch ^Mozilla/4\.0[678] no-gzip
#Internet Explorer标识本身为“Mozilla / 4”,但实际上是能够处理请求的压缩。
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
C.http重定向https

没有rewirte_module,需要编译安装
加载模块

[root@master modules]# pwd
/usr/lib64/httpd/modules
[root@master modules]# ls mod_rewrite.so 
mod_rewrite.so
[root@master modules]# pwd
/etc/httpd/modules
[root@master modules]# ll mod_rewrite.so 
-rwxr-xr-x 1 root root 69128 Aug  8  2019 mod_rewrite.so
[root@master conf.modules.d]# pwd
/etc/httpd/conf.modules.d
[root@master conf.modules.d]# vim 00-base.conf 
LoadModule rewrite_module modules/mod_rewrite.so
#yum安装的httpd系统默认已经装载rewrite_module 
[root@master conf.modules.d]# httpd -M | grep rewrite_module 
 rewrite_module (shared)

加入配置内容
rewrite_module模块下,C1、C2任选一项
C1:配置文件
在 标签内随便一个地方加入以下三行
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R]

[root@master httpd]# cd conf.d/
[root@master conf.d]# vim sslweb.conf 
<VirtualHost 192.168.1.71:80>
    DocumentRoot "/blueicex/temp/sslweb"
    RewriteEngine on
    RewriteCond   %{HTTPS} !=on
    RewriteRule   ^(.*)  https://%{SERVER_NAME}$1 [L,R]
</VirtualHost>
<VirtualHost 192.168.1.71:443>
    DocumentRoot "/blueicex/temp/sslweb"
    SSLEngine on
    SSLCertificateFile "/etc/httpd/ssl/httpd.crt"
    SSLCertificateKeyFile "/etc/httpd/ssl/httpd.key"
</VirtualHost>
<Directory "/blueicex/temp/sslweb">
    Options All
    AllowOverride None
    Require all granted
</Directory>

C2:.htaccess
如果AllowOverride设置为All的话,否则apache会不读取网站的.htaccess文件!
网站目录处新建.htaccess
RewriteEngine on
RewriteBase /
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.* https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
检查配置文件
C3:Redirect
将http请求转发至https的URL
容易产生递归调用
Redirect [status] URL-path URL
status状态:Permanent返回永久重定向状态码 301,Temp返回临时重定向状态码302。

[root@master httpd]# cd conf.d/
[root@master conf.d]# vim sslweb.conf 
<VirtualHost 192.168.1.71:80>
    DocumentRoot "/blueicex/temp/sslweb"
    Redirect temp / https://192.168.1.71/
</VirtualHost>
<VirtualHost 192.168.1.71:443>
    DocumentRoot "/blueicex/temp/sslweb"
    SSLEngine on
    SSLCertificateFile "/etc/httpd/ssl/httpd.crt"
    SSLCertificateKeyFile "/etc/httpd/ssl/httpd.key"
</VirtualHost>
<Directory "/blueicex/temp/sslweb">
    Options All
    AllowOverride None
    Require all granted
</Directory>
[root@master ~]# apachectl configtest
Syntax OK
D. 默认字符集
[root@master ~]# egrep -v "^ *#|^$" /etc/httpd/conf/httpd.conf | grep AddDefaultCharset
AddDefaultCharset UTF-8
[root@master ~]# vim /etc/httpd/conf.d/charset.conf
AddDefaultCharset GB2312
[root@master ~]# egrep -v "^ *#|^$" /etc/httpd/conf/httpd.conf  | grep IncludeOptional
IncludeOptional conf.d/*.conf
[root@master ~]curl -I http://127.0.0.1/
HTTP/1.1 200 OK
Date: Sun, 08 Dec 2019 21:32:00 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sat, 07 Dec 2019 01:31:15 GMT
ETag: "25-599131e54e9d8"
Accept-Ranges: bytes
Content-Length: 37
Content-Type: text/html; charset=GB2312
E. ServerSignature

当客户请求的网页并不存在时,服务器将产生错误文档,缺省情况下由于打开了 ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息,如果不对外显示这些信息,就可以将这个参数设置为Off,设置为Email,将显示ServerAdmin 的Email提示。生产环境建议设置成off,httpd 2.4版本的话就无需设置了,因为默认就是off
[root@master ~]#cat /etc/httpd/conf.d/serverSignature.conf
ServerSignature On

F. status功能

默认status模块是动态加载的哟:
[root@master ~]# httpd -M | grep status_module
status_module (shared)
[root@master ~]#cat /etc/httpd/conf.d/status.conf
<Location “/status”>       
SetHandler server-status

#ExtendedStatus值为On显示扩展信息
ExtendedStatus On

12.httpd负载均衡

13.httpd代理

正向代理
反向代理
————Blueicex 2020/2/7 12:40 blueice1980@126.com

2017-03-01 11:39:53 dangerous_fire 阅读数 1359

mail命令是LINUX下一个非常轻巧的交互式的命令行邮件客户端,基于Berkeley Mail 8.1,提供MIME, IMAP, POP3, SMTP和S/MIME等扩展。

mail默认是调用本机MTA发送邮件的,需要在本机上安装sendmail或postfix。

支持SMTP,有关SMTP的参数都是在/etc/mail.rc里设置。
        关于SMTP的设置也就那么几个,具体如下:
        from: 当别人收到邮件时显示的发件人。默认是"当前用户id"@"主机名",这样发出去,会被邮件服务器当成垃圾邮件,无法回复邮件。
        smtp: 指定别人家的服务器地址。
        smtp-auth: 指定SMTP的认证方式。如果你不设置的话,默认是LOGIN方式,当然你可以根据需要改成CRAM-MD5或PLAIN方式。
        smtp-auth-user: 指定用户名。注意用户名为@前面的部分
        smtp-auth-password: 指定密码。

用QQ的邮箱假设一下。
        把以下这段设置加在/etc/mail.rc里。
        set from=12345678@qq.com
        set smtp=smtp.qq.com
        set smtp-auth-user=12345678
        set smtp-auth-password=1234xxxx

这样你就可以发外部的邮件了。而且我测试不用重启服务。

mail -s "hello" 87654321@qq.com <hello.txt

例如上面的命令就是想87654321@qq.com的邮箱中发送了一封邮件,而且它收到的邮件显示是来自12345678@qq.com的。

但这时你还想给root管理员发一个内部的邮件就会有以下错误发生了

smtp-server: 501 Bad address syntax

要想发内部邮件请添加 -n 参数,就是不使用当前/etc/mail.rc的配置

mail -n -s "hello root" root < hell.txt

这样你就可以随意发送外部或内部邮件了



2011-05-15 23:03:00 dotfun 阅读数 770

测试环境

CentOS 5.2,Apache 2.2.3

配置Apache

打开Apache 配置文件httpd.conf,位置参考:/etc/httpd/conf/httpd.conf

在配置文件中确保mod_write、mod_mime 模块已加载:

LoadModule rewrite_module modules/mod_rewrite.so

LoadModule mime_module modules/mod_mime.so

随后在配置文件中加入MIME 信息(经测试不加也能运行SL):

AddType application/xaml+xml .xaml
AddType application/x-silverlight-app .xap
AddType application/x-ms-xbap .xbap

保存httpd.conf,并退出编辑模式,重启Apache 服务:

service httpd restart

加载Silverlight

由于SL 是客户端运行,所以Server 上其实不用做太多设置,下面将xap 程序加载到HTML即可。新建一个PHP 程序加入下面代码:


    
    
    
    
    
    
        Get Microsoft Silverlight
    

相关资料

Silverlight Mime types in IIS6 and Apache

Run Silverlight with Apache Server (Under linux)

How to: Add Silverlight to a Web Page by Using HTML

转载:http://www.cnblogs.com/gnielee/archive/2011/04/06/silverlight-on-apache-linux.html

2018-06-01 13:38:53 qq_34105362 阅读数 518

在linux中上传带有中文内容的test.csv文件。(GBK编码)
cat 的时候发现中文乱码的现象,于是在bash中对其转码。


一、相关命令

$ file --mime-encoding filename  #显示文件编码
$ iconv -l  #查看Linux 系统所支持的文件编码种类
$ iconv -f old_encoding -t new_encoding old_filename  #将转码结果打印<实质file还没转换>
$ iconv -f old_encoding -t new_encoding old_filename -o new_filename  #将转码结果存储为new_filename



二、举例

$ file --mime-encoding test.csv
iso-8859-1

$ iconv -f gbk -t utf-8 test.csv #注意这里old_encoding写的是gbk
姓名,ID
张三,1
李四,2

$ iconv -f gbk -t utf-8 test.csv -o test.csv



三、注意

  • 在 file –mime-encoding filename.csv时,显示的是iso-8859-1编码,但是实质却是GBK,所以iconv -f old_encoding -t new_encoding的时候old_encoding要写成GBK,不然会转码失败;
    <具体原因还没弄懂,望大神指导!>
    这里写图片描述
  • iconv -f old_encoding -t new_encoding只是将转码结果打印输出,文件本质并没有转码,需要加上 -o
    这里写图片描述

Linux命令2

阅读数 51

没有更多推荐了,返回首页