Making apache and gevent(django-socketio) work together - python

I'm working on a ubuntu 12.04 with python, django and recently django-socketio (https://github.com/stephenmcd/django-socketio).
My problem is when I send something to the server through socket and wait for it to send back, when it doesn't.
the django server is running on default http port(80). And the socketio on 8080 port.
if I access my website like this: 'http://mysite.com/' the pages using socketio does not work at all. But using the 8080 port, everything works!
The reason I don't use the socketio server to handle requests(it has a server that you start by typing a manage.py command) is that I don't know how to do it using apache. Got stuck with setting up the wsgi file. What I know so far is that you have to attach the SocketIOServer to django application and whatever. Have tried this, with no success.
My question is: how can I make this work? Maybe having one handling on one port the other on other port should work. But also tried this.
I really don't want to use ajax since is lot's of async requests.
Something, please!
Thanks in advance.

Related

Django is not available from forwarded port

I'm trying to connect to my website from another node on another network. If the nodes are in the same network, i can connect to the website without a problem.
I've forwarded port for ssh and Django (8000), I also have apache ready on port 9080.
ssh and apache ports work fine when connecting to them from external ip address, Django does not for some reason.
First, i tried to run the server on port 8000:
python manage.py runserver 0.0.0.0:8000
This works completely fine when connecting from the node that is in the same network as the server, but for some reason, whenever i try to access it from external ip address, the connection is refused.
To make sure it was Django, I also tried running the server on the same port as Apache (9080), although, i didn't expect "errorless" response, since i knew that port was occupied. But there was no change at all, I was still getting the same Apache page that i would get before.
I also tried allowing port 8000 on firewall:
sudo ufw allow 8000/tcp
But pretty sure this is not the problem, since this Debian came without any firewall.
I also tried to empty ALLOWED_HOSTS in settings, but there was no progression.
It seems like Django has no effect for external connections, what could be the reason?
I also struggle to understand the purpose of other http web server platforms in this case (e.g Apache, Nginx), Isn't Django creating a webserver itself along with its custom wsgi?
Firewall is not the problem, neither is the web server, then may the problem be caused by the Django itself? Maybe it is outer firewall?
It is not clear how you are configuring Apache to forward requests to Django, it seems like you are treating those as two independent components. If you want to use a web server in front of Django (recommended for production envs), you need to configure both Apache and Django.
Then, as you are running django in dev mode (python manage.py runserver 0.0.0.0:8000), you should reach Django in http://server_ip:8000 regardless of Apache, perhaps there is another firewall blocking the connection. Use tracert / traceroute to find out where the connection is blocked.
FInally, for production environments, it is recommended to use a web server in front of Django to increase security and performance. See the docs for further information.
My guess is that you have another firewall blocking the port. You opened the local firewall using ufw, but there may be an outer firewall.
python manage.py runserver 0.0.0.0:8000 starts correctly? If so, keep an eye in the log.
Inside the server, do a request wget http://localhost:8000. The request should be logged
If you can reach Apache in port 9080 from outside the server, you can:
Use nmap to find the opened / closed / filtered ports in the server to find if there is another firewall inbetween.
Configure Apache to forward requests to Django, although this does not solve the problem
In your question you say that you have forwarded port for ssh and Django. What exactly is this? Are you sure that you have not misconfigured your ssh server to listen in port 8000?

How can I make the development server in Python Django be on the internet?

I want to make the development server in Django be on the internet while running Windows 10. How can I do this?
By the way, when I try to use my external IP, it doesn't work. It says that I can't use it
While starting the Django Server, mention the IP and PORT from which you want to accept the requests. Mention 0.0.0.0 to open it for all as:
python manage.py runserver 0.0.0.0:80
By default the Django's server accepts requests only via localhost.
Now make a request via using public IP of the system on which your Django's server is running
You can try a deployment on Heroku. Is relativelly easy to set up and provides you with a live server in minutes.
Sorry about the confusion, this is an old question but what actually happened was that I didn't add any port forwarding rules on my router. If I did, then the solutions raised by others would've worked. Since I didn't port forward, I just ended up hosting it on heroku.

port forwarding django development server - URL is being doubled

I have a Django development server running on a remote centos VM on another lan. I have set up port forwarding using Secure CRT to access the web page through my browser from my desk pc. I am currently not using apache with the development server and is shutdown.
I start the server by running python manage.py runserver 0.0.0.0:80.
When I type either the ip or www.localhost.com into the web browser, my URL is read as if it has been doubled with the host being read as if it was also the path.
Page not found (404)##
Request Method: GET
Request URL: http://www.localhost.com/http://www.localhost.com/
When I try to access the development server from within the same LAN the page loads up fine.
I have been searching through the django documentation and stack overflow, but I have yet to find a similar problem to this. Does anyone have any thoughts on why this may be happening and what could be a possible solution?
Thank you very much in advance!
It looks like the request URL is incorrect:
http://www.localhost.com/http://www.localhost.com/ should probably be http://actual_machine_IP.com/
I'd start searching there. You won't be able to access the VM's port 80 from a different lan using localhost as the hostname since localhost is probably already set in your hosts file.
If you want to test your dev environ remotely, can I suggest either setting up Apache properly with port 80 (as opposed to using django's dev server--privilege restrictions and all that can be circumvented with sudo and other bad practice) or use a pre-built shared dev service like vagrant share.

NodeJS - SocketIO over SSL with websocket transport

I have a NodeJS-socketIO server that has clients listening from JS, PHP & Python. It works like a charm when the communication happens over plain HTTP/WS channel.
Now, when i try to secure this communication, the websocket transport is not working anymore. It falls back to xhr-polling(long polling) transport. Xhr-polling still works for JS client but not on python which purely depends on socket transport.
Things i tried:
On node, Using https(with commercial certificates) instead of http - Works good for serving pages via Node but not for socketIO
Proxy via HAProxy (1.15-dev19). From HTTPS(HAProxy) to HTTP(Node). Couldn't get Websocket transport working and it falls back to xhr-polling on JS. Python gets 502 on handshake.
Proxy via STunnel (for HTTPS) -> HAProxy(Websocket Proxy) -> Node(SocketIO) - This doesnt work either. Python client still gets 502 on handshake.
Proxy via Stunnel(HTTPS) -> Node(SocketIO) - This doesnt work too. Not sure if STunnel support websocket proxy
node-http-proxy : Throws 500(An error has occurred: {"code":"ECONNRESET"}) on websocket and falls back to xhr-polling
Im sure its a common use case and there is a solution exist. Would really appreciate any help.
Thanks in advance!
My case seems to be a rare one. I built this whole environment on a EC2 instance based on Amazon Linux. As almost all the yum packages are not up to date, i had to install pretty much every yum packages from source. By doing so i could have missed configuration unchanged/added. Or HAProxy required lib could have been not the latest.
In any case, i tried building the environment again on ubuntu 12.04 based EC2 instance. HAProxy worked like a charm with a bit of configuration tweaks. I can now connect my SocketIO server from JS, Python & PHP over SSL without any problem. I could also create a Secured TCP Amazon ELB that listens on 443 and proxy it to non-standard port (8xxx).
Let me know if anyone else encounters a similar problem, I will be happy to help!

webpy and CherryPyWSGIServer

I'm using the bottom piece of code for my program http://webpy.org/cookbook/ssl and when I connect to my python server through https all is well. Then when I go to connect to my server as http it does not connect as expected.
But then when I go back to https I get a time out every time and I have to restart my comp so I can connect again.
Can anyone help me with where to start on this problem?
Thanks.
In your nginx, or apache server configuration file, you need to redirect the page to https all the time, or handle the http properly. for example if somebody hits my server I permanently redirect to the https every time like this in Nginx:
server {
listen 80;
rewrite ^ https://$host$request_uri permanent;
}
You will also need to define your webpy application handling. I ended up using Ubuntu, Nginx, uWSGI with webpy and my site works really well. Hopefully this helps. I was doing the exact same thing as you until I found this site:
http://fartersoft.com/blog/2012/02/10/deployment-of-web-py-applications-using-uwsgi-and-nginx-on-ubuntu/
Which helped me get started. I hope it helps you.

Categories

Resources