Wow, thanks for that detailed explanation! I had picked up a few of these details, but you really tied it together for me. The only reason I'm really worried about using an external server, is that I want to do things the right way; I was worried that the built-in web.py server is only designed for testing/rapid prototyping and shouldn't be actually deployed/used in production. But if that's not the case, if it's "ok" to use, I'm more than happy to do so! I just reviewed my index.py, and I have a couple of references to a CherryPy webserver, imported from a wsgi class. But, that's just to enable encryption:

from web.wsgiserver import CherryPyWSGIServer

CherryPyWSGIServer.ssl_certificate = root + releaseName + "/security/certificate.pem" CherryPyWSGIServer.ssl_private_key = root + releaseName + "/security/keyfile.pem"import os

Is CherryPy the builtin server, or is something else weird going on? Am I actually using WSGI because of those lines, or am I just using one module? It looks like I'm just setting a couple of variables, and then other behind-the-scenes things turn on when they see that the correct files are bing pointed at. The security stuff worked just fine when I tried it, but the procedure I followed was a while ago so I forget a lot of the details.

So if I'm going to just leave the server as it is, how do I go about/should I worry about making it a proper daemon? And much more importantly, how should I deal with logging, like redirecting stdout and stderr? Is there a module or other package to do that, or is doing it from the command line really the correct way? Like I mentioned in my original email, I just want to be doing things the right, non-cludgy way.

On 12/12/2013 08:42 AM, Shannon Cruey wrote:
Steven, I'll try a different approach in describing this, maybe it'll help. I often find if I explain something to my wife, it suddenly makes a lot more sense to me! Plus, with my morning coffee I try to do something fun, so today it's my own twisted version of "web tech history". :-)

HTTP (HyperText Transfer Protocol) was originally designed to deliver static text content from a server to a browser. Basically, the original web server was nothing more than a bit of code that read files off the drive and delivered them over the TCP/IP protocol to a client capable of rendering html markup to the user. Although it's evolved since then, at their core tools like Apache and nginx are http servers, basically fulfilling the same role.

Since the original browsers didn't have Javascript, developers immediately realized static content wasn't good enough. Rather than hack up the web server with tons of new features and bloat, the designers rightly decided to keep the server simple, and allow external extensions via a standard interface. The common gateway interface (CGI) was born. Using CGI, a web server could "hand off" a request to an external program (written in almost any language). That external program will do it's magic, and hand the result back to the http server, which will deliver the content to the browser. Basically, it stuck a plugin in place of reading a static file, allowing dynamic files.

CGI, while a quick fix to the problem, eventually sort of died under the weight of it's inherent problems. Each request had to fire off a process, therefore performance was slow. Each of the leading http servers came up with their own replacement for CGI. (Apache modules, NSAPI and ISAPI plugins, etc.) The industry fractured into turf wars about the best way to do server side code.

Things have never really settled down, many alternate ways to do server side code are available, from ASP.NET <http://ASP.NET> to PHP, each one communicating with the server using an interface that was an evolution of CGI.

Finally, WSGI is a semi-unique beast. Python initially lost some ground as a web programming language, as the choice of servers and interfaces was limited. Code could be hooked to a few web servers using CGI, FastCGI, or an Apache module called mod_python, all arguably suboptimal in some regard. Enter WSGI - a "middleware" between a python framework and any web server willing to implement an interface. WSGI is the best way to build web services using python, as it provides the richest interaction between python code and an http server.

(Web.py has implemented a wsgi interface, meaning you can technically hook it to any server that supports wsgi. Apache and nginx are the favorites.)

There was an explosion of frameworks in the early 2000s to help developers dynamically build static pages, loaded with widgets, tools and "best practices". Confusion, showboating and religious wars abound to this day.

"Web 2.0" also came along in the early 2000's, and using ajax and javascript, the web applications with the richest user experience now make far less use of server side processing, offloading a lot of the logic to the browser. The big frameworks have struggled to integrate client side code into their models, as the browser is "outside their sandbox".

We've come full circle - now that the leading browsers (yes, even IE9/10) are pretty consistent, it's easy to distribute the work out to the clients and build really powerful web applications. This has (to a degree) reduced the load on the web server - where once you'd build complex server side logic to create and serve a static page, now that's shift(ing/ed) to serving /data/ to the browsers and letting them build the visible content.

Which is why web.py is my favorite - it doesn't presume to tell me the best way to do anything - I get to decide. I can generate my pages in python code, or I can deliver JSON to the browser and render it using javascript, or I can build a REST API interface on a legacy application, and I can do any of these with or without an external web server.

My coffee is done, and so am I. If this helped anyone, cheers. If it didn't, ignore it!
S

Final thought - why do you feel you "need" to use an external web server? We have four applications, all just use the built-in server, and all serve tens of thousands of requests per day. There are certainly many valid reasons to use an external server, just keep it simple if you can. :-)





On Thu, Dec 12, 2013 at 6:41 AM, Joey Chang <[email protected] <mailto:[email protected]>> wrote:

    I think you should start from CGI.
    http://en.wikipedia.org/wiki/Common_Gateway_Interface .
    *Common Gateway Interface* (*CGI*) is a standard method used to
    generate *dynamic content on web pages and web applications
    <http://en.wikipedia.org/wiki/Web_applications>*.
    CGI provides an interface between the web server and programs that
    generate the web content. OK, the web server is like nginx or
    apache things, and the the programs which generate the web content
    like web frameworks. We call web application.

    So, we can draw a request/response line stream below:

    --------------------------- request
    -----||---------handle------||---- response -----------------------
    Client  -> web server  -> cgi  -> web application -> cgi -> web
    server -> client

    wsgi is a protocol like cgi but more advanced which implemented by
    python.
    uwsgi is like more advanced cgi, too, which can be implemented by
    lots of languages (i.e. python, lua ).

    And  how these things work together? Only  just set the right
    parameters in their conf files (containing log set), which you can
    google.

    Maybe, my description is not clear, wish would help you.


    2013/12/12 Steven Brown <[email protected]
    <mailto:[email protected]>>

        Thanks.  I looked over the web.py section of that link; there
        wasn't a lot there.  For one thing, nothing at all about
        nginx.  Now I probably should have mentioned that I'm very new
        to web programming, so a good number of things that may be
        obvious to others won't be to me. So....what *is* uwsgi?  Is
        it the same as wsgi? In the example given, where do the
        logs/stderr/stdout go?  And does the example use nginx,
        somewhere under the hood, or what?  I guess my major confusion
        stems from the fact that I thought web.py as a web framework,
        has everything you need.  It has certainly served webpages for
        me.  I thought it was basically a replacement for i.e.
        Apache?  Or is the server separate from the framework?  Is the
        framework just in charge of generating pages, and the server
        actually delivers them?  nginx seems to be a server, in
        addition to other stuff I don't know what it does, but then
        what does uwsgi/wsgi actually do?  The WSGI homepage says it's
        a full stack for building hosting services.  I don't know what
        that means :P

        On 12/10/2013 10:47 PM, Joey Chang wrote:
        webpy + uwsgi + nginx
        http://projects.unbit.it/uwsgi/wiki/Example

        It's simple and convenient.

                



        2013/12/11 Steven Brown <[email protected]
        <mailto:[email protected]>>

            Hi everyone, it's been quiet for a while on the list!  I
            am trying to do my servers the Right Way, but I'm not
            sure what I should/need to do.  First, I want to properly
            daemonize my server.  I have been doing something like

            nohup python myServer.py 1234 &

            but I'm not sure if that really covers everything.  I
            feel like there's some "official" way to make a process a
            daemon, that does everything correctly, but I'm not sure
            what it could be!  That way is also not so good with
            logging; I want to send all my stdout and stderr to a log
            file, or 2 log files, if that can happen.  Doing it on
            the command line with > redirects hasn't really worked,
            and I feel like that's not what I should be doing anyway.
             And then there is the Deployment section on the website,
            but I'm not sure if I actually need any of that...I mean,
            I don't get why I need to use Apache, for example.
             web.py works out of the box, so what would I add yet
            another program to my stack for?  But, I do want to do
            things right, so if I need to use Apache or whatever I
            will; but then, I don't know how to make a decision on
            which method to use....

            Overall, the documentation is just a bit fragmented, and
            I'm not sure how to pull out what I need.  Can anyone
            offer some insight?

-- You received this message because you are subscribed to
            the Google Groups "web.py" group.
            To unsubscribe from this group and stop receiving emails
            from it, send an email to
            [email protected]
            <mailto:webpy%[email protected]>.
            To post to this group, send email to
            [email protected] <mailto:[email protected]>.
            Visit this group at http://groups.google.com/group/webpy.
            For more options, visit
            https://groups.google.com/groups/opt_out.


-- You received this message because you are subscribed to the
        Google Groups "web.py" group.
        To unsubscribe from this group and stop receiving emails from
        it, send an email to [email protected]
        <mailto:[email protected]>.
        To post to this group, send email to [email protected]
        <mailto:[email protected]>.
        Visit this group at http://groups.google.com/group/webpy.
        For more options, visit https://groups.google.com/groups/opt_out.

-- You received this message because you are subscribed to the
        Google Groups "web.py" group.
        To unsubscribe from this group and stop receiving emails from
        it, send an email to [email protected]
        <mailto:webpy%[email protected]>.
        To post to this group, send email to [email protected]
        <mailto:[email protected]>.
        Visit this group at http://groups.google.com/group/webpy.
        For more options, visit https://groups.google.com/groups/opt_out.


-- You received this message because you are subscribed to the Google
    Groups "web.py" group.
    To unsubscribe from this group and stop receiving emails from it,
    send an email to [email protected]
    <mailto:webpy%[email protected]>.
    To post to this group, send email to [email protected]
    <mailto:[email protected]>.
    Visit this group at http://groups.google.com/group/webpy.
    For more options, visit https://groups.google.com/groups/opt_out.


--
You received this message because you are subscribed to the Google Groups "web.py" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/webpy.
For more options, visit https://groups.google.com/groups/opt_out.

--
You received this message because you are subscribed to the Google Groups 
"web.py" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/webpy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to