安裝httpd
利用CentOS安裝HTTP最好的離線方式,就是從發行版的ISO鏡像裏拿到rpm包:
主要需要的包就兩個:
拿到後先安裝httpd-tools再安裝httpd,基本就安裝完了。
安裝後我們試圖重啓httpd服務,發現無法啓動,大概報這樣的錯:
原因極大可能是由於Listen監聽端口的問題,默認爲80,這個端口是很多服務默認的監聽端口,所以可以改成其他,改成其他如888等不常用且未被佔用的就好。
接下來來部署HTTP文件服務,我們修改配置,裝完httpd後默認主配置文件爲/etc/httpd/conf/httpd.conf
。
主從配置文件
一般來說,配置文件主要分兩種,一種是主配置文件,用於全局定義。一種是從,用於根據不同需要寫不同配置。
1)主配置文件常用會改動到的地方:
1、允許跨域訪問支持,即從http到https這樣的js腳本請求就算跨域,一般URL中的組成分爲三部分:協議(http/https)、IP主機名、端口port。兩個URL中任一一個不同就算跨域。
2、URL忽略大小寫,比如abcd.txt和Abcd.txt。在Nginx中是不支持訪問的,雖然網上有很多所謂教程,但他們的目的其實是強行轉換成小寫或大寫,這樣服務器上所有的文件都不一樣了。而我們要的是,無論在URL裏訪問abcd還是Abcd都可以訪問到。
3、有些是需要用Apache部署整個項目,有些只是部署HTTP文件服務這塊,這個時候默認是指向index.html,而且要求你的路徑下必須要有這個目錄。但我們要的是訪問文件共享目錄,這個下面是顯示的所有文件即目錄的列表。要達到後者這個目的,也可以在這裏面修改,這個後面講。
2)從配置(搭建HTTP文件服務):主要是虛擬主機配置,這個後面講。
部署HTTP文件服務
主配置
:全局修改
# Listen 80 # 默認80,最好修改
Listen 888
# ServerName www.example:80
ServerName www.example # 取消註釋,並去掉端口
<Directory />
AllowOverride none
#Require all denied # 配置文件服務需關閉該權限,否則無法訪問,註釋該行
Require all granted # 增加這行
</Directory>
<IfModule dir_module>
#DirectoryIndex index.html
DirectoryIndex None # 把index.html改爲None,否則每次訪問該端口都會進這個頁面,然後刪掉/etc/httpd/conf/welcome.conf,該文件指向index.html,如果改爲None卻不刪除它仍然會報錯
</IfModule>
#在EnableSendfile on和IncludeOptional conf.d/\*.conf中間加上
……
EnableSendfile on
# 忽略URL大小寫
# ignore URL case
LoadModule speling_module modules/mod_speling.so
CheckSpelling on
# 支持跨域訪問
# support CORS
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin,x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
IncludeOptional conf.d/\*.conf
修改完以後httpd服務加入開機自啓後重啓服務即正常。
systemctl enable httpd
systemctl restart httpd
systemctl status httpd
修改完後,我們要添加HTTP服務,配置都需放置於/etc/httpd/conf.d/下。在這之前,我們需要了解虛擬主機。
虛擬主機
虛擬主機,一般而言是指在一臺服務器中運行多個web站點,但每個站點並不獨佔一個服務。就好比我們有一個服務192.168.123.123:888,但我們有多個域名,aaa.com和bbb.com,但他們對應的路徑不一樣,就可以設置這兩個域名對應同一個服務。
因爲我們配置的是文件服務,和上面這種有點區別,不多講。
虛擬主機配置有三種類型,這三種類型可以組合,參考底部鏈接:
- 基於IP:每個虛擬主機使用不同的IP地址,但使用的端口相同;
- 基於端口:每個虛擬主機的IP地址相同,但端口不同;
- 基於域名:每個虛擬主機的IP和端口相同,但使用的域名不用;
從配置
這裏我們使用的是基於端口的方式,假設我們在節點192.168.123.123上創建了一個端口1111,我們在/etc/httpd/conf.d/
創建一個配置文件,如site1111.conf,內容如下:
Listen 1111
<VirtualHost *:1111>
ServerAdmin [email protected]
DocumentRoot /test/a # /test/a這個目錄需要自己創建
<Directory "/test/a">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
然後重啓httpd服務,在瀏覽器上訪問192.168.123.123:1111,你就會看到/test/a共享目錄下的所有文件列表。至此,HTTP文件服務部署成功。
後端使用Python添加服務配置文件
至於多個服務配置如何寫的問題,由於後端是Python,寫文件方便,我弄了一個比較偷懶的辦法。
這個文件裏總共需要改動的地方大概四處,兩個端口,兩個路徑,所以可以弄一個模板,將端口的地方弄爲“{port}”這種,然後在讀的時候,replace即可。
模板爲site_base.tmp
,這個地方注意,這裏不要用conf做後綴名,httpd的配置文件都是以.conf
結尾,它會去獲取所以符合條件的腳本,這個不規範的腳本不宜用.conf
結尾。內容如下:
Listen {port}
<VirtualHost *:{port}>
ServerAdmin [email protected]
DocumentRoot {path}
<Directory "{path}">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
修改時,Python腳本示例如下,其中a必須已存在,如我們的模板文件。b隨意,寫入時可以自己創建且賦予寫的權限,這個就是我們新添加的文件:
a = '/root/site_base.tmp' # 模板名稱,不應以conf結尾
b = '/root/b.conf'
with open(a, 'r') as f1, open(b, 'w') as f2:
lines = f1.readlines()
for line in lines:
l1 = line.replace('{port}','8080').replace('{path}','/root/a') # 替換關鍵內容
f2.write(l1)
這種方式有幾個好處:改動地方少,不用預先創建文件,且避開copy的操作,更不用chmod設置寫權限
參考鏈接:
https://blog.51cto.com/13625676/2125695
https://www.jianshu.com/p/2d3c67e35d8d