Apache VirtualHost是实现让一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术. 可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口, 也可让多个网站拥有不同的域名.
apache一个ip配置多站点,有两种方法:
详细过程见文章下述。
apache的代理应用场景:当一些应用,如gerrit,jenkins分别占用一个端口(8080居多),通过[ip/domainname:port]一般可在浏览器访问该应用。
如果要配置只通过域名(不加端口号)来访问应用(gerrit, jenkins等),则需要用到反向代理(外部client访问局域网中的服务器时的中间件)。
代理可以使用代理服务器,也可以直接使用端口即端口转发。如将https的443端口处理转到8080端口处理,则在浏览器不输入端口号,则默认发送至(80/443),配置文件中指定将端口操作转发到8080,从而实现了域名直接到应用的访问,而不需端口号。
详细过程见文章下述。
Ubuntu:系统
/etc/apache2/
|-- apache2.conf
|-- ports.conf
|-- mods-enabled
– *.load
– *.conf
|-- mods-available
– *.load
– *.conf
|-- conf-enabled
– *.conf
|-- conf-available
– *.conf
|-- sites-enabled
– *.conf
|-- sites-available
– *.conf
其中apache2.conf为主配置文件,其中Include了将conf-enabled及sites-enabled文件夹下的 *.conf配置文件。(*.conf这里是指所有xxx.conf)。
/var/www/html/index.html为默认的测试页面。
000-default.conf为默认的测试站点配置文件,配置了上述页面,当000-default.conf被加载,则网页登录站点时,显示/var/www/html/index.html内容。
使用a2dissite 000-default.conf可以移除该默认配置站点。
conf用来配置apache的一些自身配置,如log一类。
site则是用来配置站点的配置文件。
mod则是apache加载的一些模块,如ldap,ssl等。
带available标签的文件夹存放的只是支持但是没有被加载的配置文件或模块。
带enabled标签的文件夹存放的是要被加载的配置文件及模块。
在conf-available及sites-available创建想要加载的配置文件,在conf-enabled及sites-enabled创建对应的软连接(ln -s xxx-available/xxx.conf xxx-enabled/xxx.conf),重启apache2即可加载。下面介绍的apache的命令也可实现软连接功能。
对于opensuse等一些系统,可能配置文件结构有所不同,apache的配置文件也在etc/apache2/下,但是主配置文件是http.conf。虚拟站点配置文件在vhost.d/下,但是配置文件的格式相同。
sudo apt-get update
sudo apt-get install apache2
源码安装:
apr
apr-util
pcre
httpd
详细参考步骤见参考
a2enmod用于加载指定模块
a2dismod用于移除指定模块
a2ensite用于加载站点配置文件
a2dissite用于移除指定站点配置
a2enconf用于加载指定配置文件
a2disconf用于移除指定配置
重启apache(加sudo)我用第一条指令,指令有差异,具体差异不是很清楚。
service apache2 restart
/etc/init.d/apache restart
apachectl restart
一般http使用80端口;https使用433端口。
可以使用 netstat -antpu | grep 80来查看端口使用情况。 netstat -plntu
可在/etc/apache2/ports.conf中设置监听多个端口,使得访问多个虚拟主机,比如访问127.0.0.1:90和127.0.0.1:9001返回不同的内容
配置文件缩进一定要一致,否则会出现解析问题 一定 一定
example.conf
#配置默认host的443端口
#设定服务端的联系邮箱
ServerAdmin [email protected]
#设定域名
ServerName xxx.com
#网页端登录时,显示该目录下的index.html文件。没有下方可配置登录时显示服务器目录结构
DocumentRoot "/xxx/xxx/"
#ssl认证
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/xxx.crt
SSLCertificateKeyFile /etc/apache2/ssl/xxx.key
#log存储及级别
ErrorLog /var/log/apache2/xxx-error.log
LogLevel warn
CustomLog /var/log/apache2/xxx-access.log combined
#配置web界面显示服务器上的文件及登录方式,下方是ldap登录认证
Options Indexes FollowSymLinks
允许登录
Allow from all
AuthName "Login with your gerrit Account"
AuthType Basic
AuthBasicProvider ldap
#ldap登录认证
AuthLDAPURL "ldap://ldap.xxx.com/xxx"
require ldap-filter |(gidNumber=xxx)(gidNumber=xxx)
主要需要配置ServerName及 DocumentRoot。
生成自签证书的命令:
sudo mkdir /etc/apache2/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
common name要填域名要写域名(xxx.com)或通配域名(*.com)或多个域名(1.com,2.com).
服务器使用自签证书,在网页登录服务器时,会收到警告,添加例外才能进行访问。
如果要配置ldap则ldap的相关模块(authnz_ldap、ldap)需要加载(a2enmod ldap)。
正反向代理服务器配置
在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,是直接联系到目的站点服务器,然后由目的站点服务器把信息传送回来。代理服务器是介于浏览器和Web服务器之间的另一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。参见百度百科。
apache 代理配置 https://www.jianshu.com/p/96e63686e374
关于正反向代理 https://www.linuxidc.com/Linux/2017-10/147378.htm
正向代理:局域网中的客户端通过正向代理服务器访问外网;
反向代理:外网客户端通过反向代理访问局域网中的服务器;
代理服务器也可以是一个端口。
ProxyRequests On:开启Apache正向代理
ProxyVia On:控制位于代理服务器链中的代理请求的流向
引用Apache2.2官方文档中对ProxyVia的解释如下:
如果设置为默认值Off ,将不会采取特殊的处理。如果一个请求或应答包含"Via:"头,将不进行任何修改而直接通过。
如果设置为On每个请求和应答都会对应当前主机得到一个"Via:"头。
如果设置为Full ,每个产生的"Via:"头中都会额外加入Apache服务器的版本,以"Via:"注释域出现。
如果设置为Block ,每个代理请求中的所有"Via:"头行都将被删除。且不会产生新的"Via:"头。
Allow from #IP或Deny from #IP来控制允许或者禁止特定的IP访问服务器。
来自 https://jingyan.baidu.com/article/27fa7326bd1fdf46f9271f5a.html
正向代理
... ...
#正向代理设置
ProxyRequests On
ProxyVia Full
Order deny,allow
#Deny from all
Allow from all
反向代理
# ServerAdmin [email protected]
... ...
#反向代理设置
ProxyPass / http://mywebsite.com/
ProxyPassReverse / http://mywebsite.com/
同样可配置80端口
ServerAdmin [email protected]
ServerName xxx.com
#rewrite将端口数据转发
RewriteEngine On
#http得到数据后,80端口监听处理,这里配置使用https访问,从而实现http到https的转发处理。
RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [R=permanent,L]
补充:
Apache中同一IP多个HTTPS虚拟主机的实现:
在 Apache 文档中提到,不能在单个 IP 上同时有多个按名字识别的虚拟主机(“named virtual host”)。不完全是这样。
HTTPS协议的过程是:服务器首先与客户机之间进行服务器身份验证并协商安全会话,然后,客户端向服务器发送 HTTP 请求。这样一来,在客户端开始发送HTTP请求之前,服务器就已经把证书发给了客户端(客户端根据本地的根证书去验证证书链,等等)。而最重要的是,为了表明身份,这个证书的"Common Name"填写的应该是域名,否则浏览器会给出警告。
既然在这个过程中,客户端就所访问的域名所处的地位是"被告知"的地位,因此,客户端再发出的 Host: 请求头也就显得不那么有意义了。另一方面,如果客户请求的域名与Common Name不符,浏览器也会给出警告。至少,在表面上看是这样。
不过,对于自行签署的证书,以及一些发证机构而言,其实还可以签署一种普适HTTPS证书,这种证书的Common Name一栏是 *.domain.tld 这样的形式,即其主机名部分可以是任意字符串,而只有域名部分是确定的。
当然,这种证书的安全性有一定的负面影响:由于一个证书可以验证整个域下面的所有服务器,一旦其被破解,则所有加密通讯也就同时失密了(当然,可以每台服务器使用自己的单独的证书),不过这个问题并不是太严重,通常还算是尚可接受的范围。另一个潜在的影响是,某些手机上运行的浏览器不能正确处理这种证书,不过这个问题仅限于希望给手机提供服务的网站。
因此,简而言之,符合这样几个条件的前提下,是可以在同一个IP上部署多个HTTPS虚拟主机的:
a) 这些虚拟主机是同属于同一域名的子域名
b) 拥有普适证书
c) 正确地配置Apache。
在一个IP地址上需要部署多个SSL网站
(1)一种方法:如果要在同一个IP地址的443端口上部署多个网站,必须保证这些网站的域名都能匹配相同的一张SSL证书。这是因为SSL握手协议过程中,是通过IP+Port来进行通信,一个IP的一个端口只能返给客户一张SSL证书(即使有多张证书,也只能返回第一张,因为无法分辨用户会需要返回哪张证书),如果这张证书能够满足这些网站的主机名匹配要求(访问b.test.com时,使用a.test.com段的证书,证书中包含a.test.com,于虚拟主机中的主机名之一匹配),就可以使用。
一般能匹配多个主机名的证书有通配符证书*.domain.com和多域名证书(www.domain.com,ftp.domain.com 等),以下我们提供一个典型同一个IP上的多主机名部署配置,www.domain.com对应的根目录在WWW下,ftp.domain.com对应的根目录在FTP下,www.domain.com与ftp.domain.com使用相同的证书:
NameVirtualHost 11.22.33.44:443
DocumentRoot "C:/Apache2.2/htdocs/www"
ServerName www.domain.com
SSLEngine on
SSLCertificateFile "C:/Apache2.2/conf/server.cer"
SSLCertificateKeyFile "C:/Apache2.2/conf/server.key"
DocumentRoot "C:/Apache2.2/htdocs/ftp"
ServerName ftp.domain.com
SSLEngine on
SSLCertificateFile "C:/Apache2.2/conf/server.cer"
SSLCertificateKeyFile "C:/Apache2.2/conf/server.key"
(2)另一种办法就是给每个网站分配不同的端口号;
DocumentRoot "C:/Apache2.2/htdocs/www"
ServerName www.domain.com
SSLEngine on
SSLCertificateFile "C:/Apache2.2/conf/server.cer"
SSLCertificateKeyFile "C:/Apache2.2/conf/server.key"
DocumentRoot "C:/Apache2.2/htdocs/ftp"
ServerName ftp.domain.com
SSLEngine on
SSLCertificateFile "C:/Apache2.2/conf/server.cer"
SSLCertificateKeyFile "C:/Apache2.2/conf/server.key"
以上来自 https://blog.csdn.net/lengxin337/article/details/43987425
基于域名的虚拟主机只能使用同一个证书,或者说,即使有不同的证书,最终使用的都是排在前面的默认的第一个
使用apache搭建web网站
ubuntu14.04系统下搭建支持https的apache2服务器
ubuntu下apache2使用的简单总结
ubuntu下apache虚拟主机出现forbidden错误的解决办法
Ubuntu16.04+Apache虚拟主机配置详解
Ubuntu 中 Apache2 安装、配置、卸载
如何在Ubuntu 18.04上安装和配置Apache 2 Web服务器
Apache服务器配置多个站点的方法
基于Apache搭建HTTP/HTTPS/正向代理/反向代理服务器
Apache正向代理与反向代理
Apache2.4权限配置 https://blog.csdn.net/wangkepermit/article/details/72954976
Apache2.4配置(全) https://blog.csdn.net/u012291157/article/details/46492137
如何在 Ubuntu16.04 中用 Apache 部署 Jenkins 自动化服务器 https://linux.cn/article-8488-1.html enkins 默认使用的端口(端口 8080)。