I am trying to run a simple Python Script on Site5 Hosting Service. I uploaded the script in the cgi-bin folder. Once I try loading the script on the browser it throws an Internal Server Error. I checked the Error Log in Cpanel and it says that the "File does not exist". I tried to resolve the Issue by doing the following but unfortunately it still doesn't work-
Set File Permissions to 755
Tried testing by using hello.py and hello.cgi both throw the same error
Added this on the file hello.py #!/usr/bin/python
On the .htaccess file, added the line Addhandler cgi-script .py .pl .cgi
On the .htaccess file, under Directory Index added index.py and index.cgi
Here is my code-
#!/usr/bin/python
print(“Hello World!”)
Kindly suggest on how this Issue can be resolved.
I have finally resolved it. There was an Issue with my code. The parenthesis had to be removed. My final code was something like this
#!/usr/bin/python
print "Content-type: text/plain\r\n\r\n",
print "Hello world"
And it worked just as expected.
Related
Sorry if I seem lost, but I have very little experience deploying web applications and searching online isn't helping. As the title states, I am running Ubuntu, Apache2, PostgreSQL, and Django , -- and I repeatedly get error messages, most of which are either vague and/or have no clear solutions. Plus my ignorance on the specific interactions quicksands any attempt at finding a solution, so i will be very specific.
Installations:
apache2 libapache2-mod-wsgi-py3 -- for python 3
I can't remember if I installed django or if it automatically packaged with my PyCharm package.
PostgreSQL - works fine.
The Application:
It is a cloud computing platform, so it needs to receive files, store files, and render files.
Works fine with Django's web server attached.
has static files and needs to write to a media folder
settings.py:
- DEBUG = True
- WSGI_APPLICATION = 'example.wsgi.application'
-DATABASES =
'default':
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'example',
'USER': 'example',
'PASSWORD': 'example',
'HOST': 'localhost',
'PORT': '',
000-default.conf
<VirtualHost *:80>
ServerName FireAnts.localhost
ServerAlias www.FireAnts.localhost
DocumentRoot /var/www/FireAnts
<Directory /var/www/FireAnts/FireAnts>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess FireAnts python-path=/var/www/FireAnts python-home=/var/www/FireAnts/venv
WSGIProcessGroup FireAnts
WSGIScriptAlias / /var/www/FireAnts/FireAnts/wsgi.py
</VirtualHost>
ERRORS, per the log
Currently, i'm getting "No module named 'django'".
Frequently i get "populate" is not reentrant -- an issue which seems to have a million possible solutions.
Target WSGI cannot be loaded as Python module.
I temporarily got another script to work by deleting all lines writing to an error.txt file -- a file that exists for both packages and generates syntax errors. For some unexplained reason, it broke again with the "No module name django" failure. Also, i moved the entire package from an outside directory to the '/var/www/' (and modified the 000-default.conf file). that shouldn't generate any issues because the virtual environment traveled with the package and the database should still connect from the outside. But I assume this generated the 500 error before by writing to a file that no longer has write permissions. Could my database be generating the error some how (by blocking the connection)? If a user uploads a package later on, it will write to the media folder temporarily. Even if it didn't write yet, could this break it? Do any more modification need to be made when moving the package to the /var/www directory? I have no clue what could be generating these errors. It must be an apache configuraton error because it works with Django's web server, and only breaks with apache2...
Sorry for the mess and lack of organization; i just have no clue where I could have messed up. - but every attempted fix just breaks it again. I would appreciate any and all help.
You maybe missing out providing the WSGIDaemonProcess correctly in your default conf. Try giving as
WSGIDaemonProcess FireAnts python-path=/var/www/FireAnts/venv/path/to/bin/python:/var/www/FireAnts/FireAnts
Where replace <path/to/> with correct path to your venv. You have to give complete path of the python executable.
Edit the wsgi.py file of your project
/var/www/FireAnts/FireAnts/wsgi.py:
import os
import sys
from django.core.wsgi import get_wsgi_application
path = '/var/www/FireAnts'
if path not in sys.path:
sys.path.insert(0, path)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "FireAnts.settings")
application = get_wsgi_application()
Okay, so i figured out the answer.
Everything was configured the correct way, but there was a missing installation with an unclear error message.
I located the file that generates the "populate() isn't reentrant" message, found the line that provides the error message, and instructed it to continue by replacing "raise RuntimeError("populate() isn't reentrant")" with "self.app_configs = {}". Instead of receiving a vague, unclear answer, the error log reported a missing "psycopg2" import. I activated the venv directory and installed psycopg2. After that, it worked.
I am trying to get into python cgi programming and installed Apache HTTP server on my Windows machine. I did the following changes to the httpd.conf file
Options Indexes FollowSymLinks ExecCGI
and uncommented below line and added .py at the end
AddHandler cgi-script .cgi .py
I placed the hello.py in htdocs folder. Here are the instructions I followed https://editrocket.com/articles/python_apache_windows.html
But the get this error
AH02811: script not found or unable to stat: C:/Apache24/htdocs/hello.py
I have a very basic Python script being run as CGI, I am able to run it with only print statements and they execute and display as HTML. When I try to do any file system calls such as using logging, making files or using subprocesses I get an error 500.
#!/usr/bin/python
import cgitb; cgitb.enable()
import cgi
import sys
from subprocess import call
call('ls') #Error here, if I remove I get no error 500 and see "Hello"
form = cgi.FieldStorage()
print "Content-Type: text/html"
print
print "<html><body>Hello"
print "</body></html>"
The CGI script has execute permission:
chmod a+x example.cgi
In my Apache configuration I have the virtual hosts to execute CGI setup:
<Directory "/path/to/cgi/cgi-bin/">
AddHandler cgi-script cgi pl
Options +FollowSymLinks +ExecCGI
AllowOverride None
</Directory>
And setup the CGI module for Apache:
sudo a2enmod cgi
If I run the cgi script directly on the server, all the file manipulation works perfectly, if I try to access it from the browser, i.e example.com/test.cgi it gives me the 500 error. I also ran dos2unix to make sure it's formatted correctly.
Try to use os.system('ls') instead a call, or use it before you enabled the cgitb.
I'm trying to run simple python script in my server (hostgator) and I'm getting error 500 when run it in the url.
this is my .py file: (in public_html folder) CHMOD:755
#!/usr/bin/env python
print "Content-type: text/html\n\n";
print "<html><head>";
print "<title>CGI Test</title>";
print "</head><body>";
print "<p>Test page using Python</p>";
print "</body></html>";
and this is my .htaccess: (in public_html folder)
AddType text/html py
AddHandler cgi-script .py
Couple of things that might be wrong:
AllowOverride FileInfo is not set for this directory. 500 may indicate that apache has an issue with "malformed" .htaccess
no executable bit on file:
$ chmod +x my.py
suEXEC gets in the way. Simple test for this is:
$ SUEXEC=$(which suexec)
$ mv ${SUEXEC} ${SUEXEC}.orig
$ service httpd restart
In case of suEXEC there are several things you can do:
trace the permissions and other items that might be preventing suexec from normal operation
disable suexec completely by removing/renaming it's executable
use ScriptAlias to define location for your scripts (this seems to sidestep suEXEC completely)
I am trying to execute a Python program using Apache. However, Apache will only serve the file and not actually execute it. The permissions on the file are r/w/x and it is in /var/www. I will post the contents of httpd.conf and the program code after. I also tried to running the python script as a .cgi file but that did not work as well. I have both the mod_python and mod_wsgi modules loaded into apache as well.
Python sample:
#!/usr/bin/python
# enable debugging
import cgitb
cgitb.enable()
print "Content-Type: text/plain\r\n\r\n"
print
print "Hello World!"
httpd.conf:
AddHandler cgi-script .cgi .pl
AddHandler python-program .py
I know its a small httpd.conf file but when I installed apache, there was nothing in the file. I should also mention that this is just so that I learn the basics of running python in apache. It is not meant for production.
Thanks for the help!
Edit
The OS I'm using is Ubuntu 10.04 and the version of apache is 2. I have python version 2.6 which is automatically used when #!/usr/bin/env python is invoked.
I am getting two main errors, the first is that the file is not being found even though the permissions of the file and folder are 777. The error from the log is
[Sun Feb 05 13:29:44 2012] [error] [client 192.168.1.3] File does not exist: /var/www/poit-0.1
This error is for a different python script that I did not write. What is weird is that the file shows up in the index of the folder when accessed from a browser window. However, when I navigate to the file, I get the above error.
The other error that I am getting is premature end of headers. The error is below:
[Sun Feb 05 12:10:19 2012] [error] (8)Exec format error: exec of '/var/www/pyth.py' failed
[Sun Feb 05 12:10:19 2012] [error] [client 192.168.1.3] Premature end of script headers: pyth.py
The first line of httpd.conf: AddHandler cgi-script .cgi .pl is irrelevant, since you're testing python scripts and not perl scripts. And you should define those directives within the location of your python script, and tell apache that it should execute cgi scripts in that location: Options +ExecCGI. This snippet would be a start:
<Directory /path/to/sample.py />
Options +ExecCGI
AddHandler cgi-script .py
</Directory>
Addendum 1:
As per my last comment, try this script. It should spit information about the cgi environment.
#!/usr/bin/python
import cgi
cgi.test()
Addendum 2:
I got your script to work with the above configuration. The problem is that script is written in python2. And the default interpreter apache is invoking to execute the script, is python3 (at least in my case, and chances are this would be the same for you too).
This is a python3 version of the hello world script:
#!/usr/bin/env python
# enable debugging
import cgitb
cgitb.enable()
print("Content-Type: text/plain;charset=utf-8")
print()
print("Hello World!")
Addendum 3:
For the first error, make sure the permission and the ownership of whatever directory and files you're attempting to deploy are properly set. And try adding those directives to httpd.conf:
Order allow,deny
Allow from all
Which will get you this:
<Directory /path/to/sample.py />
Options +ExecCGI
AddHandler cgi-script .py
Order allow,deny
Allow from all
</Directory>
For the second error, unless I am missing something, it looks like apache is invoking python 3 interpreter to execute your script. To rule out this possibility, you might try the following:
ls -al /usr/bin/python*
This will list the python interpreters available on your system. If you have more than one interpreter you'll get something similar to this output:
/usr/bin/python -> python3*
/usr/bin/python2.6*
/usr/bin/python3*
If not, it would be this output:
/usr/bin/python -> python2.6*
/usr/bin/python2.6*
To make sure, this is not the issue you're having, try with this modified sample script:
#!/usr/bin/python2.6
# enable debugging
import cgitb
cgitb.enable()
print "Content-Type: text/plain\r\n\r\n"
print
print "Hello World!"
You'll notice that I explicitly mentioned the version of the interpreter apache should invoke, which is ugly. But for the sake of testing, you can do it. Of course you should map #!/usr/bin/python2.6, to whatever binary you have on your server, and make sure you don't mix python 3 comtipable code with python 2 interpreter and vice versa.
Re: The Exec format error.
I've run in to this myself a couple of times before. I had the exact same (cryptic) error message.
I was developing Python (3) scripts to use via CGI in Notepad++ on my Windows machine, and then uploading them to my Linux server.
After much frustration, I discovered that this issue is related to line endings and you need to convert Windows line endings (\r\n) to UNIX line endings (\n).
In Notepad++ (6.1.5), you can achieve this by going to the Edit menu and selecting the EOL conversion option and then saving the file.
**For apache2 version 2.4
sudo apt-get install python
sudo apt-get install apache2
edit file /etc/apache2/conf-enables/serve-cgi-bin.conf
====comment old section and add code below:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">
AddHandler cgi-script .py
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
=========================================
edit file /etc/apache2/apache2.conf
***add code below:
<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
<Directory "/var/www/cgi-bin">
Options All
</Directory>
<Directory /usr/local/apache2/cgi-bin>
Require all granted
</Directory>
Note!
use for apache2.4
file python keep in directory: /var/www/cgi-bin/
You can test :go to http://localhost/cgi-bin/<namefile>.py
referrence
https://www.linux.com/blog/configuring-apache2-run-python-scripts
In my case, it was a trivial issue. I had to add this line:
#!/usr/bin/python3
to the top of every .py file I wanted to run.
Then, everything started working correctly.
I had the same symptom and my config looked okay compared to the answers above.
I found that my new install was not configured to load mod_cgi.so
Loading the required module looks a bit like this. If restarting the server will give you an error that the file was not found, figure out where the file is adjust the path accordingly.
LoadModule cgi_module modules/mod_cgi.so
I'm assuming you are using firefox. I read somewhere else on the 'net that it could be related to the firefox addons installed on a machine.
I was getting this error and I use firefox 20. Switched to Opera and I did not get any more errors and the python scripts seemed to execute just fine.
Edit: It was actually an eval() method call I had overlooked that had appended "(" and ")" to the results of the script that caused my failure. Once I removed them, it worked for me.
I noticed you did not post the javascript, html, or whatever it is you use to call the script in the first place. Perhaps you could post it for us? I did a direct copy/paste example from a blog site without looking at what I had copied. That was my error.