500 internal Server error when configuring python cgi - python

I have been trying to run a simple python script hello.py with CGI but am getting 500 Internal Server Error.
My python code.
#!/usr/bin/python2.7
print '<html>'
print '<head>'
print '<title>Hello World - First CGI Program</title>'
print '</head>'
print '<body>'
print '<h2>Hello World! This is my first CGI program</h2>'
print '</body>'
print '</html>'
The directory which i have the python script running is in /var/www/crunchworld.The conf file which i enabled is in `/etc/apache2/conf-available/crunchworld.conf
The conf file looks like
<Directory /var/www/crunchworld>
Options +ExecCGI
AddHandler cgi-script .cgi
Options All
AllowOverride All
Order allow,deny
Allow from all
</Directory>
I have cgi enabled and given the necessary permission for the file hello.py but its still showing me internal server error.When i checked the logs i see
End of script output before headers: hello.py
I have researched about the error and give appropriate permissions for the file but it doesnt work.
Any help would be so much appreciated. Thanks in advance.
Further changes i have made.
I have added AddHandler cgi-script .cgi .py in my crunchworld.conf file.
2.I have given permission for the file hello.py
I have symlinked /etc/apache2/conf-available/crunchworld.conf in /etc/apache2/conf-enabled
4.I had already installed python2.7 on the path /usr/bin/python2.7 and i have also tried using #!/usr/bin/env python but still it doesnt work.
Upon checking the logs i found End of script output before headers: hello.py, referer: http://localhost/
Thank you for your recommendations but it is still showing 500 internal error.

Your CGI script must also output header information.
The minimum required is the Content-type header -- which in this case should be set to text/html.
Add this to the start of your CGI script (before you print anything else).
print 'Content-type: text/html\n'
Take note of the extra trailing newline -- its necessary to leave at least one blank line between the header(s) and the content itself.
Update:
For further troubleshooting, do the following:
Make sure your CGI script has the correct permissions set: chmod 0755 hello.py just to be sure.
Your script appears to be .py whereas your apache config appears to only specify .cgi files. Your AddHandler should be AddHandler cgi-script .cgi .py.
You should symlink your /etc/apache2/conf-available/crunchworld.conf file in /etc/apache2/conf-enabled if you haven't already done so. Do so by running the following: cd /etc/apache2/conf-enabled; sudo ln -s ../conf-available/crunchworld.conf.
Always remember to restart apache if you make any changes to your apache config: e.g. sudo service apache2 restart.
Check that your hashbang line is correct. Does /usr/bin/python2.7 exist? You can try setting instead to #!/usr/bin/env python or #!/usr/bin/env python2. (Or better yet, switch to python3 if possible on your system).
Check the apache error logs once again. E.g. tail -20 /var/log/apache2/error.log (or wherever your logs are).
You can attempt further debugging with the cgitb module (see https://docs.python.org/3/library/cgitb.html).

Related

How do I run python cgi script on apache2 server on Ubuntu 16.04?

I am a newbie so I saw some tutorials.
I have a python script as first.py
#!/usr/bin/python3
print "Content-type: text/html\n"
print "Hello, world!"
I have multiple versions of python on my computer.
I couldn't figure out my cgi enabled directory so I pasted this code at three places
/usr/lib/cgi-bin/first.py
/usr/lib/cups/cgi-bin/first.py
/var/www/html/first.py
Now when I run this code in terminal it works fine but when I type
curl http://localhost/first.py
it spit out just simple text and does not execute.
I have given all the permissions to first.py
I have enabled and started the server by commands
a2enmod cgi
systemctl restart apache2
Please tell how do I execute and what is going on here?
Thanks in advance.
To python cgi script on apache2 server on Ubuntu(Tested on Ubuntu 20.04) from scratch, Follow these steps(Expects python is installed and works perfectly).
Install apache2 sever.
sudo apt install apache2
Enable CGI module.
sudo a2enmod cgi
Here we set /var/www/cgi-bin/ as cgi-bin directory. If you want a different directory, change files appropriately.
Open Apache server configuration file [/etc/apache2/apache2.conf] by,
sudo gedit /etc/apache2/apache2.conf
And following lines to the end of the file.
######### Adding capaility to run CGI-scripts #################
ServerName localhost
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
Options +ExecCGI
AddHandler cgi-script .cgi .pl .py
Open file /etc/apache2/conf-available/serve-cgi-bin.conf by,
sudo gedit /etc/apache2/conf-available/serve-cgi-bin.conf
Change lines :
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
To :
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin/">
AllowOverride None
Options +ExecCGI
</Directory>
Now restart apache2 server by,
sudo service apache2 restart
Now create python script say, first.py inside directory
/var/www/cgi-bin/ by,
sudo gedit /var/www/cgi-bin/first.py
and add following sample code :
#!/usr/bin/env python
import cgitb
cgitb.enable()
print("Content-Type: text/html;charset=utf-8")
print ("Content-type:text/html\r\n")
print("<H1> Hello, From python server :) </H1>")
And give executable permission to first.py by,
sudo chmod +x /var/www/cgi-bin/first.py
Now curl will work.
:~$ curl http://localhost/cgi-bin/first.py
<H1> Hello, From python server :) </H1>
Or open browser and browse http://localhost/cgi-bin/first.py. This should work and will display webpage showing "Hello, From python server :)".
Hope it helps... Happy coding :)
These lines need to be in your apache2 site configuration file
(for example /etc/apache2/sites-available/default-ssl.conf
if your website uses HTTPS):
<Directory /var/www/yoursite/yourdir/>
Options +ExecCGI
PassEnv LANG
AddHandler cgi-script .py
</Directory>
Add them for the directory you want and restart apache2. You might also need to add
AddHandler python-program .py
to your httpd.conf if not present already.
A more detailed discussion concerning python scripts and apache2 is found here: Executing a Python script in Apache2.
Probably the problem you're running in Python 3 and your code is written in Python 2
Change the title to python2:
#!/usr/bin/python
print "Content-type: text/html\n"
print "Hello, world!"
For just proof of concept, use this python script ; No input nor output needed.
#!/usr/bin/env python3
import cgitb
cgitb.enable()
outputfile = open("javascriptPython.out", "a")
outputfile.write("Hello from Python\n\n")

Running Python scripts with Xampp

I'm using python 2.7.13
At first the browser was showing the raw code.
what I did:
Edited httpd.conf
AddHandler cgi-script .cgi .pl .asp .py
At the top of all my scripts I added this:
#!j:/Installeds/Python/python
print "Content-type: text/html\n\n"
Now it's giving me Internal Server Error (500) and I have no idea what else to try... First time with python.
Obs: I think this may help> Apache>Error.log
[cgi:error] [pid 6364:tid 1620] (9)Bad file descriptor: [client ::1:51083] AH01222: don't know how to spawn child process: C:/Files and Installs/Xampp/htdocs/Test/main.py
AH02102: C:/Files and Installs/Xampp/htdocs/Test/main.py is not executable; ensure interpreted scripts have "#!" or "'!" first line
Run Python in XAMPP for Windows
Step 1: Download and Install Python
Download and install the latest version of Python from https://www.python.org/downloads.
Step 2: Configure XAMPP for Python
Open the Apache httpd.conf configuration file located at .../xampp/apache/conf/httpd.conf using a text editor of your choice.
The XAMPP GUI can also quickly access the httpd.conf file:
Copy and paste the following code at the end of the file:
AddHandler cgi-script .py
ScriptInterpreterSource Registry-Strict
Step 2.5: Add Python extension to default page locations (Optional)
Inside the httpd.conf file search for <IfModule dir_module> to add index.py among others to the list of default page locations.
<IfModule dir_module>
DirectoryIndex index.php index.pl index.cgi index.asp index.shtml index.html index.htm index.py \
default.php default.pl default.cgi default.asp default.shtml default.html default.htm default.py \
home.php home.pl home.cgi home.asp home.shtml home.html home.htm home.py
</IfModule>
Step 3: Restart Apache / XAMPP
If Apache was running while editing, now is the time to restart it.
Step 4: Run Python from XAMPP
Create a folder and Python file in the XAMPP htdocs directory; e.g. .../xampp/htdocs/PythonProject/test.py.
At the beginning of your script, you first need to specify the directory of your Python executable. The default location of Python 3.10.0 is C:/Users/<YOUR_WINDOWS_PROFILE>/AppData/Local/Programs/Python/Python310/python.exe, but in your case, it may be different, depending on the version and directory in which you've installed Python.
#! C:/Users/<YOUR_WINDOWS_PROFILE>/AppData/Local/Programs/Python/Python310/python.exe
After that, you can create your Python script.
#! C:/Users/<YOUR_WINDOWS_PROFILE>/AppData/Local/Programs/Python/Python310/python.exe
print("Content-Type: text/html\n")
print("Hello, World!")
Save the file and open localhost/PythonProject/test.py in your web browser. Your Python script should be running.
Im running ubuntu 16.04 so my answer might be a little different. I am using a google chrome browser with a python 3 file called test.py in /opt/lampp/htdocs/PythonProject:
#test.py
#!/usr/bin/env python3
print('Content-type: text/html\r\n\r')
print("<p>hello world!</p>")
print("I can view this in my browser yay!!")
I edited my httpd.conf file in /opt/lampp/etc/httpd.conf and I did not add
AddHandler cgi-script .py
ScriptInterpreterSource Registry-Strict
to the end of the file, instead I added .py to the end of the existing line
AddHandler cgi-script .cgi .pl
finally i made the file executable by chmod +x /opt/lampp/htdocs/PythonProject/test.py and then I just ran it through my browser:
http://localhost/PythonProject/test.py
OUTPUT:
hello world!
I can view this in my browser yay!!
Download python from here (https://www.python.org/downloads/) and install it
Open XAMPP control panel, click on config and go to httpd.conf file >> search for addhandler and add “.py” [without quotation ] just like in the screenshot (if it’s not added)
httpd.conf file
Restart the apache server
To run a python script:
Open any text editor and put this code
#!C:/Users/"Username"/AppData/Local/Programs/Python/Python37-32/python.exe
print("content-type: text/html\n\n" )
print("<br><B>hello python</B>")
In the first line, you have to type the location of the python.exe file after putting a shebang (#!)
“username” — username of your PC
This will differ from one user to another. You can find the python location from environment variables (see the screenshot below)
py environment variables
Then put the script in xampp>> htdocs folder
Open your browser and type localhost/”filename”.py (http://localhost/filename.py)
[ “filename”= script name]
You’ll see this output
output
Bad File descriptor means that a file is corrupt and it says it can not run the script so you probably have python incorrectly set up.

Text of python scripts is shown in browser instead or running them

I have apache2 running on my ubuntu 14.04. The configuration for the virtual host is
`ScriptAlias /cgi-bin/ /home/(path to some myfolder)/cgi-bin/
<Directory "/home/(path to some myfolder)/cgi-bin">
DirectoryIndex index.py
Options +ExecCGI
AddHandler cgi-script .py
Require all granted
</Directory>`
Then index.py is not running as well as any other python script. Instead the text of the scripts is shown in the browser window.
I also tried to stop apache and use python -m CGIHTTPServer instead, but with the same result.
Also, the command chmod +x index.py was routinely applied to all python scripts I tried.
To run the script I used the url: 127.0.0.1/index.py, though I also tried
127.0.0.1:80/index.py and 127.0.0.1:80/(the whole pathe to the file in the cgi-bin folder)
I use port 80.
The script I use to test is
#!/usr/bin/python2.7
print "Content-type: text/html"
print "Hello, World."
python2.7 is in the folder /usr/bin so the path is correct
The best I found on the Internet were advices implemented under Directory tag above. Bwt, the result does not change if I launch the scripts in browsers as root. I tried Firefox and Chrome, all the same.
The question is how to make my python scripts run in a browser?

Setting up Python in AMPPS - Internal Server Error

I'm trying to use Python with AMPPS, which is an Apache / MySQL / etc. bundle for Windows. There's just one problem though; every script I try to run returns an 'Internal Server Error', even though it's correct code.
This is probably an issue that's not worth posting it here, but I googled for three hours and I just can't find any help.
My httpd.conf is over here: http://pastebin.com/5DMU2cUU
The single line of code I use is: print "Hello World!";
Notepad++ is set to EOL Conversion->UNIX format (before you ask).
This is all I know so far. Please don't hate me for posting this (I know you love to do that), I'm new and confused :3
mod_wsgi is already configured in AMPPS. You can see it in loaded modules of apache.
httpd.exe -D DUMP_MODULES
You just need to configure your script now.
http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide
You can modify the python.conf included in httpd.conf too. i.e for using mod_wsgi directives.
This is official hello world example from mod_wsgi. Hope this helps.
Follow below steps:
Open httpd.conf
Append .py to AddHandler cgi-script .cgi .pl under tag
Now AddHandler cgi-script .cgi .pl becomes AddHandler cgi-script .cgi .pl .py
Search for block and Add ExecCGI to Options FollowSymLinks Indexes.
Now its become Options FollowSymLinks Indexes ExecCGI
Save the httpd.conf file, stop the apache server and restart again.
If the apache server restarts without any problem process you have successfully setup ampps to run python, otherwise restore the conf file from backup. In ampps there is an option to restore default configuration.
Add python exe file link line to the top of the python file to direct to the Python interpreter.It might be #!C:\Ampps\python\python.exe
Add this line print("Content-type: text/html\n")
Add this line print("Hello world!")
Now execute your python file. http://127.0.0.1/test/test.py
wsgi_module must be installed for apache to run python script via execCGI. On ampps this is installed and added to conf file by default.
link:http://www.lakshman.com.np/run-python-on-ampps-windows/

Execute Python CGI from /cgi-bin/ folder

I have a standard Apache2 installation on an Ubuntu server. The default settings use ScriptAlias to refer /cgi-bin/ to /usr/lib/cgi-bin/. If I place my Python CGI script in /usr/lib/cgi-bin/ it executes.
I created /var/www/cgi-bin/ with appropriate permissions, removed the ScriptAlias line, changed the Directory entry in the default file for the site, moved the CGI file to /var/www/cgi-bin/ and restarted Apache2, but I was not able to get the script to run. It was appearing as a text file in the browser instead of being executed. The HTML file calling the script refers to /cgi-bin/SCRIPT, so I left that unchanged. I tried variations on /cgi-bin and /var/www/cgi-bin in the config files without success. How can I get a Python CGI file to run from /var/www/cgi-bin?
If you removed the ScriptAlias directive, you should probably add the following lines into the main config for the directory or into .htaccess file:
Options +ExecCGI
AddHandler cgi-script py
please make sure:
the file you are calling itself has enough permission
the file you are calling has an extension that is is in the .htaccess file (see newtover's answer)
specify how you want to run the script in the first line of the file. If you are calling foo.pl, make sure #!/usr/bin/perl is in the first line.

Categories