Apache2第一步,設置環境與HelloWorld.html跟HelloWorld.cgi

這篇會從安裝一路講到HelloWorld.html
並且做好cgi相關設定,可以執行cgi程式
環境的部分是在Raspberry Pi 3上面的Ubuntu16.04
web server用的是apache2.4
方法對的話很快就能建構好了,那我們就開始吧
[目錄]
    前與注意事項
    安裝apache2
    防火牆設定
    開啟userdir模式
    執行HelloWorld.html
    開啟可執行cgi模式
    執行加強版HelloWorld.html與HelloWorld.cgi
    參考資料


[前言與注意事項]
    本文是記錄下如何用apache2架設簡單網頁以及CGI的設定
    整個設定都是圍繞在使用userdir也就是public_html的方式
    所有相關的程式及檔案都需要放在public_html之下
    需要注意的是
    設定完ufw之後,所有socket都不能用了
    要用的話要用ufw allow,在防火牆設定那邊會提到


[安裝apache2]
在terminal中輸入
sudo apt-get install apache2


[防火牆設定]
ufw是一個在Ubuntu上好用的防火牆tool,用簡化的介面來跑iptable
在terminal中輸入,查看ufw的application清單
sudo ufw app list

接著開放apache跟ssh(後者是我自己需要的,若不需要可不須開放)
sudo ufw allow 'Apache Full'
sudo ufw allow 'OpenSSH'

如果有需要使用tcp socket的話記得開放特定port
sudo ufw allow 2000/tcp

最後我們來查看一下有沒有設定成功
sudo ufw status

在安裝完apache2的時候apache應該就在運作了
此時我們可以用下列指令來查看apache的status
sudo systemctl status apache2

以下三個是apache的開啟停止以及重啟
sudo systemctl start apache2
sudo systemctl stop apache2
sudo systemctl restart apache2

接著在瀏覽器上輸入ip就能看到apache預設的index.html頁面囉
在terminal中輸入這個指令可以得到此刻的public ip
hostname -I


[開啟userdir模式]
在terminal中輸入
sudo a2enmod userdir

移動到你帳號的目錄(例如:/home/burwei/)
創建一個名為public_html資料夾,然後設定權限
cd ~
mkdir public_html
chmod -R 755 public_html


[執行HelloWorld.html]
首先,我們來寫一個簡單的HelloWorld.html
cd ~/public_html
vim helloworld.html

寫入以下內容 ,並儲存
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>

<h1>HelloWorld</h1>
<p>This is a my first HTML file.</p>

</body>
</html>

然後在瀏覽器中輸入ip/~username/helloworld.html即可看到網頁
例如: 140.113.1.1/~burwei/helloworld.html


[開啟可執行CGI模式]
修改/etc/apache2/mods-enabled/userdir.conf
改成以下內容(其實只需要改一點點而已)
<IfModule mod_userdir.c>
        UserDir public_html
        UserDir disabled root

        <Directory /home/*/public_html>
                AllowOverride All
                Options ExecCGI
                AddHandler cgi-script .cgi
                <Limit GET POST OPTIONS>
                        Require all granted
                </Limit>
                <LimitExcept GET POST OPTIONS>
                        Require all denied
                </LimitExcept>
        </Directory>
</IfModule>


[執行HelloWorld.cgi]
首先,我們來寫一個加強版的HelloWorld.html
cd ~/public_html
vim helloworld_new.html

寫入以下內容 ,並儲存
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>

<h1>HelloWorld</h1>
<p>This is a my second HTML file.</p>

<form method="get" action="hw3_new.cgi">
  Name: <input type="text" name="name" value="Burwei"><br>
  Age: <input type="text" name="age" value="24"><br>
  <input type="submit" value="Submit form">
</form>

</body>
</html>



首先,我們來寫一個簡單的HelloWorld.cgi
cd ~/public_html
vim helloworld_cgi.cpp

寫入以下內容 ,並儲存
其中QUERY_STRING那行是在讀取apache利用環境變數記下來的值
web server跟cgi之間訊息的傳遞通常都是透過它
#include <iostream>
#include <string>
#include <stdlib.h>

int main(int argc, char *argv[]){
        int sockfd = 0;
        std::string str_port = "";
        std::string str_ip = "";
        std::cout << "Content-type:text/html\n\n";
        std::cout << "<html>\n";
        std::cout << "<head>\n";
        std::cout << "<title>Hello World - First CGI Program</title>\n";
        std::cout << "</head>\n";
        std::cout << "<body>\n";
        std::cout << "<h3>Hello World! This is my first CGI program</h3>\n";
        std::cout << "QUERY_STRING: " << getenv("QUERY_STRING") << std::endl;
        std::cout << "</body>\n";
        std::cout << "</html>\n" << std::flush;
}/*int main()*/


編譯的時候有把副檔名編譯成.cgi,就像這樣
g++ helloworld_cgi.cpp -o helloworld.cgi

如果有需要的話,可以編譯成靜態的
g++ helloworld_cgi.cpp -o helloworld.cgi -static

然後在瀏覽器中輸入ip/~username/helloworld_new.html即可看到網頁
例如: 140.113.1.1/~burwei/helloworld_new.html
點擊按鈕,可以看到CGI發揮作用了

[參考資料]
    How To Install Apache Web Server on Ubuntu 16.04
    w3schools.com

今天筆記到此
希望有幫助未來遺忘這些的自己,以及需要的人

留言

這個網誌中的熱門文章

python的list與numpy的array和matrix的關係