cd /etc/apache2/mods-enabled/
sudo ln -s ../mods-available/cgi.load cgi.load
#check if symbolic link is activated
ls -la cgi.load
sudo nano /etc/apache2/apache2.conf
#insert followings at the end of the file
ServerName localhost
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
Options +ExecCGI
AddHandler cgi-script .cgi .pl .py
sudo nano /etc/apache2/conf-available/serve-cgi-bin.conf
#change directory
# in case of multiple domain, insert additional Directory.
# without this setting, 403 error will be shown.
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/var/www/domain">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
sudo nano /etc/apache2/sites-available/000-default.conf
In case of HTTP(port80)
<VirtualHost *:80>
ServerName domain.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/domain
<Directory /var/www/domain>
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
In case SSL applied
#do not edit HTTPS virtualhost manually, it will be automatically updated when you install Let's encrypt certi.
# 000-default-le-ssl.conf file will be created after install certi.
<VirtualHost *:443>
ServerName domain.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/domain
<Directory /var/www/domain>
Options +ExecCGI
AddHandler cgi-script .py
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
SSLCertificateFile /etc/letsencrypt/live/domain.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/domain.com/chain.pem
</VirtualHost>
sudo service apache2 restart