python cgi from Apache HTTP server gives script not found error - python

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

Related

wamp can't find cgi scripts in .py extension

I'm trying to test out running CGI scripts on a WAMP installation, I Have wamp installed under C:/wamp64and cgi_modules for apache enabled (was enabled by default). And I have put a test.py in C:/wamp64/cgi-bin/test.py with the content of:
#!C:\Users\fayss\AppData\Local\Programs\Python\Python310\python.exe -u
import cgi
import datetime
print("Content-type: text/html")
print()
print("<html><body>")
print("<h1>Current date and time:</h1>")
print("<p>%s</p>" % datetime.datetime.now())
print("</body></html>")
I have python added to the path and installed in C:\Users\fayss\AppData\Local\Programs\Python\Python310\python.exe
but when I access the page localhost/cgi-bin/test.py I get 404 not found error
I checked permissions and added all permissions to Users for test.py file.
httpd.conf
I've added this line in the httpd.conf of apache AddHandler cgi-script .py
and also tried commenting: # AddHandler cgi-script .cgi
and added ExecCGI to Options +Indexes +FollowSymLinks +Multiviews like this
Options +Indexes +FollowSymLinks +Multiviews +ExecCGI

Fatal Python error: init_fs_encoding when running Apache with mod_wsgi to deploy Flask

I am currently attempting to deploy a Flask application using mod_wsgi and Apache. I am using Python 3.10 on a Windows 10 machine and I believe to have configured everything properly. Below is my flask_app.conf:
WSGIPythonHome "C:/../../venv"
<VirtualHost *:80>
ServerName XX.XX.XX.XX:80
WSGIScriptAlias / C:/../app/flask_app.wsgi
<Directory C:/../flask_app>
Require all granted
</Directory>
</VirtualHost>
and here is the relevant code added to the Apache httpd.conf file:
ServerName XX.XX.XX.XX:80
LoadFile <primary python3.10 dll>
LoadModule wsgi_module "venv/lib/site-packages/mod_wsgi/server/mod_wsgi.cp310-win_amd64.pyd"
WSGIPythonHome "C:/../venv"
Include conf/flask_app.conf
Strangely it appears that the server functions if I simply run the command
httpd.exe
However, it does stall on the command prompt, as if processing a continuous function.
Also, if I try to start Apache2.4 in Windows Services or use the command:
httpd.exe -k start
An error occurs on startup giving the following relevant snippet in the error.log for Apache:
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'
This has been a hard problem to debug and any guidance would be appreciated. Please let me know if any more information would be helpful.

Apache 2.4 portability of python cgi-bin scripts between Windows and Linux

I am currently developing locally on Windows but then need to upload my files to a Linux server. However, I'm running into a problem where I need to include a shebang at the top of each of my files to tell Apache which python application to run, and that will naturally be different on Windows and Linux, such that I would need to change all of my files as part of uploading them to Linux. Is there a way to either remove the need for the shebang or provide a shebang that works under both Windows and Linux?
my httpd.conf
<IfModule wsgi_module>
LoadFile "C:/Python/Python36-32/python36.dll"
LoadModule wsgi_module "C:/Python/Python36-32/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"
WSGIPythonHome "C:/Python/Python36-32"
</IfModule>
<VirtualHost 127.0.0.1:80>
DocumentRoot "C:/Python/Web"
<Directory "C:/Python/Web">
Allow from all
Require all granted
Options Indexes Includes ExecCGI FollowSymLinks
AllowOverride All
Order deny,allow
DirectoryIndex index.py
</Directory>
AddHandler cgi-script .cgi .pl .py
</VirtualHost>
if my index.py includes the shebang, e.g. it looks like:
#!C:\Python\Python36-32\python.exe
print("Content-Type: text\html\n")
print("Heelolo ->>>>>>>>")
--> On Windows, I get the expected result:
Heelolo ->>>>>>>>
If I don't include the shebang, e.g.:
print("Content-Type: text\html\n")
print("Heelolo ->>>>>>>>")
I get the following message in my apache error.log
[Fri May 26 14:05:31.326900 2017] [win32:error] [pid 4700:tid 1972] [client 127.0.0.1:50743] AH02102: C:/Web/Hello/index.py is not executable; ensure interpreted scripts have "#!" or "'!" first line
Any ideas how I can make this work cross-platformly?
Although you have tried to load mod_wsgi, you got it wrong and haven't told Apache to host any WSGI applications anyway. You also haven't converted your Python web application to be a WSGI application. See:
http://modwsgi.readthedocs.io/en/develop/user-guides/quick-configuration-guide.html
and also go learn about a simple Python web framework like Flask rather than try and do things from scratch.
Before trying to that though, also remove the conditional for wsgi_module. That is, instead of:
<IfModule wsgi_module>
LoadFile "C:/Python/Python36-32/python36.dll"
LoadModule wsgi_module "C:/Python/Python36-32/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"
WSGIPythonHome "C:/Python/Python36-32"
</IfModule>
you should have just:
LoadFile "C:/Python/Python36-32/python36.dll"
LoadModule wsgi_module "C:/Python/Python36-32/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"
WSGIPythonHome "C:/Python/Python36-32"
The conditional meant those directives would only be applied if the module had already been loaded. Problem is the module was loaded within that check, so obviously it wasn't going to be loaded.

Error with executing Python files in cgi-bin (have tried enabling CGI Scripts in Apache)

I have a running Apache2 server on Ubuntu, with PHP installed.
My root folder is /usr/local/apache2/htdocs.
I have put a test python script in /usr/local/apache2/cgi-bin, named test.py.
test.py
#!/usr/bin/python
import cgi
import cgitb; cgitb.enable()
print "Content-Type: text/plain\r\n\r\n"
print 'hi'
I access this in the browser via http://localhost/cgi-bin/test.py. At the moment, it just displays the Python code that I just typed out, rather than executing it. I have looked extensively at online documentations and other stackoverflow questions that address this issue.
From that research I changed my httpd.conf file to include a few Directory's.
httpd.conf (stuff added to end of it)
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
<Directory "/usr/local/apache2/cgi-bin">
Options ExecCGI
SetHandler cgi-script
</Directory>
<Directory "/usr/local/apache2">
AddHandler cgi-script .py
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
I have restarted/hard-started/stopped Apache and was able to run the Python file successfully through the command-line, but still no luck with actually executing the python file through the browser. I have even checked the Apache error log, but saw no indication of the problem. Can anyone offer some advice?
Thank you
You need to chmod 755 cgi-bin folder(and/or subfolder) where you script is.
Then chmod 755 your script file.
and finally..
Open script in notepad of your preference and save with encoding UTF-8 without BOM, and EOL(end of line) conversion must be set for UNIX systems. (in Notepad++ latter is in Edit menu)

Executing a Python script in Apache2

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.

Categories

Resources