Apache配置服务器站点

Apache介绍

Apache VirtualHost是实现让一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术. 可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口, 也可让多个网站拥有不同的域名.
apache一个ip配置多站点,有两种方法:

  1. 全部基于443(80 rewrite到443),各自的配置文件ServerName配置称各自的域名;apache会对域名解析,然后进行对应的配置文件中的对应处理;
  2. 基于不同端口号,用此方法,Listen的端口号,需添加在/etc/apache2/ports.conf中。

详细过程见文章下述。

apache的代理应用场景:当一些应用,如gerrit,jenkins分别占用一个端口(8080居多),通过[ip/domainname:port]一般可在浏览器访问该应用。
如果要配置只通过域名(不加端口号)来访问应用(gerrit, jenkins等),则需要用到反向代理(外部client访问局域网中的服务器时的中间件)。
代理可以使用代理服务器,也可以直接使用端口即端口转发。如将https的443端口处理转到8080端口处理,则在浏览器不输入端口号,则默认发送至(80/443),配置文件中指定将端口操作转发到8080,从而实现了域名直接到应用的访问,而不需端口号。
详细过程见文章下述。

Apache配置文件结构介绍:

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/下,但是配置文件的格式相同。

apache安装

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端口
<VirtualHost *:443>
        #设定服务端的联系邮箱
        ServerAdmin xxx@xxx.com
        #设定域名
        ServerName  xxx.com
        #网页端登录时,显示该目录下的index.html文件。没有下方可配置登录时显示服务器目录结构 <Directory /xxx/xxx/>
        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登录认证
        <Directory /xxx/xxx/>
           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)
        </Directory>
</VirtualHost>

主要需要配置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)。
<Directory /></Directory>之间的配置是一些比较细化的服务器配置选项,AllowOverride all是允许覆盖所有的文件,Order deny,allow是命令的两种类型,Allow from all是允许所有的客户端(或代理)访问本服务器,你也可以配置。
正反向代理服务器配置
在一般情况下,我们使用网络浏览器直接去连接其他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访问服务器。

<Proxy *>…:用来控制谁可以访问你的代理
来自 https://jingyan.baidu.com/article/27fa7326bd1fdf46f9271f5a.html

正向代理

<VirtualHost *:80>
    ... ...
    #正向代理设置
    ProxyRequests On
    ProxyVia Full

    <Proxy *>
        Order deny,allow
        #Deny from all
        Allow from all
    </Proxy>

</VirtualHost>

反向代理

<VirtualHost *:80>
    # ServerAdmin webmaster@dummy-host2.example.com
    ... ...
    #反向代理设置
    ProxyPass / http://mywebsite.com/
    ProxyPassReverse / http://mywebsite.com/

</VirtualHost>

同样可配置80端口

<VirtualHost *:80>
        ServerAdmin xxx@xxx.com
        ServerName xxx.com
        #rewrite将端口数据转发
        RewriteEngine On
        #http得到数据后,80端口监听处理,这里配置使用https访问,从而实现http到https的转发处理。
        RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [R=permanent,L]
</VirtualHost>

配置步骤:

  1. 安装apache;
  2. 写要建立的站点的site 配置文件,放在site-available下;
  3. 利用a2ensite(a2ensite 直接加去后缀文件名 a2ensite image)或者ln -s在site-enabled下创建对应软连接,从而在下一次启动apache时加载配置文件。应该需要reload apache,按照提示操作;
  4. 重启apache,sudo service apache2 restart;
  5. 配置客户端/etc/hosts,浏览器输入域名登录查看。

补充:
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

<VirtualHost 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"
</VirtualHost>

<VirtualHost 11.22.33.44:443>
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"
</VirtualHost>

(2)另一种办法就是给每个网站分配不同的端口号;

<VirtualHost 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"
</VirtualHost>

<VirtualHost 11.22.33.44:8443>
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"
</VirtualHost>

以上来自 https://blog.csdn.net/lengxin337/article/details/43987425
基于域名的虚拟主机只能使用同一个证书,或者说,即使有不同的证书,最终使用的都是排在前面的默认的第一个

其中遇到的问题

  1. AH00558: Could not reliably determine the server’s fully qualified domain name, using localhost.localdomain. Set the ‘ServerName’ directive globally to suppress this message.
    解决:
    把主配置文件apache2.conf(suse系统是httpd.conf)中的 ServerName 改成可用域名
    ServerName domain_name:80
    或者本地主机
    ServerName localhost:80
  2. 403 Forbidden
    Access to this resource on the server is denied!
    解决:
    1)DocumentRoot对应的路径权限不对,需为775
    chmod 775 DocumentRoot_path
    2)站点配置文件中 <Directory /xxx/xxx/>中的 Allow from all需配置
  3. AH00526: Syntax error on line 5 of /etc/apache2/sites-enabled/xxx.conf:
    Invalid command ‘RewriteEngine’, perhaps misspelled or defined by a module not included in the server configuration
    Action ‘configtest’ failed.
    解决:
    sudo a2enmod rewrite
    sudo service apache2 restart
  4. AH00526: Syntax error on line 34 of /etc/apache2/sites-enabled/xxx-ssl.conf:
    Unknown Authn provider: ldap
    Action ‘configtest’ failed.
    解决:
    a2enmod authnz_ldap
    sudo service apache2 restart
  5. AH00526: Syntax error on line 7 of /etc/apache2/sites-enabled/image-ssl.conf:
    Invalid command ‘SSLEngine’, perhaps misspelled or defined by a module not included in the server configuration
    Action ‘configtest’ failed.
    解决:
    a2enmode ssl
    sudo service apache2 restart
  6. AH01630: client denied by server configuration: /xxx/xxx
    解决:
    apache2.4 与 apache2.2 的虚拟主机配置写法不同导致。
    apache-2.4.x把NameVirtualHost给取消,现在配置虚拟主机不需要再配置NameVirtualHost了.
    删除了 Order deny,allow 和 Order allow,deny
    把 Deny from all 替换成了 Require all denied
    把Allow from all 替换成了 Require all granted
    然后还把 Allow from 192.168.10.21 这样的语句给替换成了 Require host 192.168.10.21。

TIPS:

  1. 系统的域名解析是通过/etc/hosts内容寻找ip与域名的对应关系的,出现unknown host,则一般是域名与ip对应关系,没有配置在/etc/hosts中。建好的站点,其他机器想访问该服务器的站点,只能在浏览器中输入服务器ip来访问,如果在客户机上/etc/hosts上写入对应关系,则在此客户机上直接域名访问服务器。如果要使一个局域网下都能解析,一般需要找IT有权限去配置。
  2. apache log存放在/var/log/apache2下,出现问题多看log。
  3. VPN属于远程访问技术,简单地说就是利用公用网络架设专用网络。例如某公司员工出差到外地,他想访问企业内网的服务器资源,这种访问就属于远程访问。使用加密技术实现专网远程通讯。参见百度百科
  4. 公私钥
    公私钥是非对称加密方式,每个人都可以有自己的公私钥,私钥留给自己,公钥发给需要通讯的人。自己使用私钥加密文件,发送给有自己公钥的其他人,其他人通过发送文件人的公钥解密文件。其他人通过公钥加密文件,发送给对应私钥的人,收到邮件的人使用私钥解密查看。证书则是用来验证文件发送人的身份。

参考文献

使用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)。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值