TOP Web Server nginx

CGI

CGI:Common Gateway Interface
CGI による動的コンテンツ

Tomcat JSP


apache2

install on xubunt22.04.3 (2023/08/14)

ref:UbuntuとApacheでのWebサーバー構築方法【初心者向け】

smnb@Dig23:~$ sudo apt install apache2

smnb@Dig23:~$ sudo systemctl status apache2 # server status check

smnb@Dig23:~$ apachectl -v # version check
Server version: Apache/2.4.52 (Ubuntu)
Server built: 2023-05-03T20:02:51
smnb@Dig23:~$ firefox http://localhost & # デフォルトページ表示
SSL証明書の設定
smnb@Dig23:~$ sudo su
root@Dig23:/home/smnb# cd /etc/ssl/private
root@Dig23:/etc/ssl/private# ls
ssl-cert-snakeoil.key
root@Dig23:/etc/ssl/private# openssl genrsa -aes128 -out testssl.key 2048
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
root@Dig23:/etc/ssl/private# openssl req -new -days 365 -key testssl.key -out testssl.csr

root@Dig23:/etc/ssl/private# openssl x509 -in testssl.csr -out testssl.crt -req -signkey testssl.key -days 365

root@Dig23:/etc/ssl/private# ls -lrt
total 16
  • rw-r----- 1 root ssl-cert 1704 8月 12 15:39 ssl-cert-snakeoil.key
  • rw------- 1 root root 1874 8月 14 15:53 testssl.key
  • rw-r--r-- 1 root root 1029 8月 14 16:00 testssl.csr
  • rw-r--r-- 1 root root 1265 8月 14 16:04 testssl.crt
Apacheの設定変更
# vi /etc/apache2/sites-available/default-ssl.conf
(修正前)(修正後)
SSLCertificateFile/etc/ssl/certs/ssl-cert-snakeoil.pem/etc/ssl/private/testssl.crt
SSLCertificateKeyFile/etc/ssl/private/ssl-cert-snakeoil.key/etc/ssl/private/testssl.key
SSL機能の有効化

# a2ensite default-ssl

# a2enmod ssl

# systemctl restart apache2
🔐 Enter passphrase for SSL/TLS keys for 127.0.1.1:443 (RSA): (press TAB for no (no echo)
# exit
$ firefox https://localhost & # 自己証明書であるため、警告表示され、承知すれば、Apacheのデフォルトページ表示
UFW

$ sudo ufw app list

$ sudo ufw allow 'Apache' # activate port 80 only

smnb@Dig23:~$ sudo ufw enable

smnb@Dig23:~$ sudo ufw status

新しいVirtual Host作成
Port80(HTTP) 用は /etc/apache2/sites-available/000-default.conf
Port443(HTTPS) 用は /etc/apache2/sites-available/default-ssl.conf

$ cd /etc/apache2/sites-available/
$ sudo cp 000-default.conf smnb.conf
$ sudo cp default-ssl.conf smnb-ssl.conf

$ sudo vi smnb.conf

$ sudo vi smnb-ssl.conf


$ sudo a2ensite smnb-ssl.conf # enable new virtual host

$ sudo a2dissite default-ssl.conf # disable default

$ sudo apache2ctl configtest # check smnb.conf

# ServerNameのエラーが出たら、/etc/apache2/apache2.conf に ServerName指定
$ grep ServerName /etc/apache2/apache2.conf
ServerName localhost
$ systemctl reload apache2
www Directoryの設定

$ sudo vi /etc/apache2/apache2.conf

enbale CGI

$ sudo a2enmod cgid

$ sudo systemctl restart apache2

test
smnb@Dig23:~$ firefox http://localhost & # forbidden
smnb@Dig23:~$ firefox https://localhost & # OK
In case 403 Error occurs
$ sudo chmod 755 /home/smnb # chechk r_x is available for others to every path /home/smnb/www

$ ss -lnt # Apacheが443番ポートの待ち受けを開始?

~/www/.htaccess
「http://〜」にアクセスされても、 「https://〜」に強制的にリダイレクト
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

httpd.confの場所

  • httpd.conf は /etc/apache2/apache2.conf に該当
  • httpd.confの代わりにapache2.confを読み込む。
Folders
仮想ホストの設定ファイル/etc/apache2/sites-available/
モジュールの設定ファイル/etc/apache2/mods-available/
その他上記以外の細かい設定conf.d/
ports.conf
通信ポート設定
Listen 80
<IfModule ssl_module>
	Listen 443
</IfModule>
<IfModule mod_gnutls.c>
	Listen 443
</IfModule>

LoadModule

$ grep -r LoadModule /etc/apache2/* | grep cgi_module
/etc/apache2/mods-available/proxy_scgi.load:LoadModule proxy_scgi_module /usr/lib/apache2/modules/mod_proxy_scgi.so
/etc/apache2/mods-available/cgi.load:LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so
/etc/apache2/mods-available/proxy_fcgi.load:LoadModule proxy_fcgi_module /usr/lib/apache2/modules/mod_proxy_fcgi.so
  • /etc/apache2/mods-available/cgi.load が必要

cgi-bin

CGIディレクトリの設定
$ grep -r cgi-bin /etc/apache2/*
/etc/apache2/conf-available/serve-cgi-bin.conf:		ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
/etc/apache2/conf-available/serve-cgi-bin.conf:		<Directory "/usr/lib/cgi-bin">
/etc/apache2/conf-available/localized-error-pages.conf:#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
/etc/apache2/sites-available/default-ssl.conf:		#Include conf-available/serve-cgi-bin.conf
/etc/apache2/sites-available/default-ssl.conf:		<Directory /usr/lib/cgi-bin>
/etc/apache2/sites-available/000-default.conf:	#Include conf-available/serve-cgi-bin.conf
/etc/apache2/sites-enabled/000-default.conf.org:	#Include conf-available/serve-cgi-bin.conf
/etc/apache2/sites-enabled/000-default.conf~:	#Include conf-available/serve-cgi-bin.conf

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
/cgi-bin/ は URL上のフォルダ名: http://localhost/cgi-bin/hello_cgi.cgi
/usr/lib/cgi-bin/ は実際のファイルの場所
CGI利用可能の設定
$ grep -r -A 4 "<Directory \"/usr/lib/cgi-bin" /etc/apache2/* 
/etc/apache2/conf-available/serve-cgi-bin.conf:		<Directory "/usr/lib/cgi-bin">
/etc/apache2/conf-available/serve-cgi-bin.conf-			AllowOverride None
/etc/apache2/conf-available/serve-cgi-bin.conf-			Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
/etc/apache2/conf-available/serve-cgi-bin.conf-			Require all granted
/etc/apache2/conf-available/serve-cgi-bin.conf-		</Directory>

  • +ExecCGI が必要
hello_cgi.c
#include <stdio.h>
int main(int argc,char ** argv){
	/* http header */
	/* content type : HTML*/
	printf("Content-type: text/html; charset=utf-8\n");
	/* inhibit browser to cache */
	printf("Pragma: no-cache\n");
	printf("Cache-Control: no-cache\n"); 
	/* end of header */
	printf("\n");

	/* contents */
	printf("<html><head><title>テスト</title><head>");
	printf("<body>テスト出力でんがな。</body></html>");

	return EXIT_SUCCESS;
}
test
sudo cp hello_cgi /usr/lib/cgi-bin/hello_cgi.cgi
xdg-open http://localhost/cgi-bin/hello_cgi.cgi
Get param (METHOD=GET)
次のような形式でCGIスクリプトに渡す。
http://...../cgi-bin/xxx.cgi?名前1=値1&名前2=値2
xdg-open "http://localhost/cgi-bin/&a.cgi?m=10&n=12"
CGIスクリプトは、これを環境変数の QUERY_STRING から読み出す。
char *p = getenv("QUERY_STRING");
if (p!=NULL){
   long m,n;
   if(sscanf(s_dt,"m=%ld&n=%ld",&m,&n)==2){
          printf("mxn=%ld),m*n);        
   }
}
Get Param (Method=POST)
stdioからEOFまで読み出し。
Formで
<FORM METHOD="POST" ACTION="cgi_post.cgi">
していすれば、各パラメータを&区切りの NAME=VALUE 文字列で得られる

getenv
CGIスクリプトが参照可能な環境変数
#include <stdlib.h>
char *getenv(const char *varname);
char *secure_getenv(const char *name);
変数名意味
AUTH_TYPE認証方式(例えば MD5, Basicなど)
CONTENT_LENGTH標準入力から読み込み可能なデータのバイト数(METHOD=POSTの時)
CONTENT_TYPEクライアントから送られてきたデータのタイプ。フォームからMETHOD=POSTで送信した場合は、application/x-www-form-urlencoded となる。
GATEWAY_INTERFACEゲートウェイプロトコル名称(例えばCGI/1.1)
HTTP_ACCEPTブラウザがサポートする Content-type: のリスト。すべてを許可する場合、*/* となる。
HTTP_FORWARDEDこの要求をフォワードしたプロキシサーバーの情報。送信されない場合もある。
HTTP_REFERERそのCGIを呼び出したページのURL。送信されない場合や、たまに、全く別のURLを差していることもある。
HTTP_USER_AGENTブラウザに関する情報(Mozilla/4.01 [ja] (Win95; I) など)
HTTP_X_FORWARDED_FORこの要求をフォワードしたプロキシサーバーのIPアドレス。
PATH_INFOパス情報。たとえば、「cgi-bin/xxx.cgi/taro/xxx.htm」というURLでCGIスクリプトを呼び出した場合、PATH_INFOには「/taro/xxx.htm」が格納される。
PATH_TRANSLATEDPATH_INFOで指定したファイルの、サーバー上の絶対パス名。
QUERY_STRING「http://サーバー名/CGIスクリプト名?データ」というURLを要求した場合のデータ部分。
REMOTE_ADDRクライアントのIPアドレス(例えば10.0.0.1)
REMOTE_HOSTクライアントのホスト名(例えば abc32.abc.co.jp)
REMOTE_IDENTクライアント側のユーザーID
REMOTE_USERクライアント側のユーザー名
REQUEST_METHODMETHODで指定したデータ取得手段。GET, POST, HEAD, PUT, DELETE, LINK, UNLINKなどの種類がある。
SCRIPT_NAMECGIスクリプトの名前。
SERVER_NAMEサーバー名
SERVER_PORTサーバーのポート番号(例えば80)
SERVER_PROTOCOLサーバーのプロトコル名(例えばHTTP/1.0)
SERVER_SOFTWAREサーバーのソフトウェア名(例えば NCSA/1.3)
CGIデータのエンコード
  • スペースはプラス(+)に置き換える。
  • 特殊文字、日本語などはパーセント(%)に続く2桁の16進数に置き換える。

管理人/副管理人のみ編集できます