New version available. 4.0b2.

Changing command names around but 'serve' will still work for now.

$ wsgi-admin
Usage: wsgi-admin command [params]

Commands:
    install-so
    so-location
    run-server
    setup-server

Actually, you will not see 'setup-server' in list because I only realised 
wasn't added to usage after had out up 4.0b2. There were a few usage messages I 
have forgotten to update.

Anyway, instead of 'serve' use 'run-server':

wsgi-admin run-server mysite/wsgi.py --server-root apache --url-alias /static 
mysite/files

Various new options.

$ wsgi-admin run-server -h
Usage: wsgi-admin run-server script [options]

Options:
  -h, --help            show this help message and exit
  --host IP-ADDRESS
  --port NUMBER
  --processes NUMBER
  --threads NUMBER
  --callable-object NAME
  --limit-request-body NUMBER
  --maximum-requests NUMBER
  --reload-on-changes
  --user NAME
  --group NAME
  --document-root DIRECTORY-PATH
  --url-alias URL-PATH FILE-PATH|DIRECTORY-PATH
  --error-document STATUS URL-PATH
  --keep-alive-timeout SECONDS
  --server-status
  --include-file FILE-PATH
  --working-directory DIRECTORY-PATH
  --daemonize
  --pid-file FILE-PATH
  --server-root DIRECTORY-PATH
  --log-directory DIRECTORY-PATH
  --log-level NAME
  --access-log
  --startup-log
  --httpd-executable FILE-PATH
  --modules-directory DIRECTORY-PATH
  --mime-types FILE-PATH
  --with-newrelic
  --with-wdb

One of the more interesting things as far as I am concerned is the 
'setup-server' command.

This will generate all the configuration for Apache, but not actually run it. 
It will though generate you a command to use to start/stop/restart the Apache. 
That way all the configuration is remembered. For example:

wsgi-admin setup-server mysite/wsgi.py --server-root apache --url-alias /static 
mysite/files

In the 'apache' subdirectory created, you would then find:

$ ls -las apache/
total 32
 0 drwxr-xr-x  6 graham  wheel   204  5 Jul 15:15 .
 0 drwxr-xr-x  4 graham  wheel   136  5 Jul 15:15 ..
 8 -rw-r--r--  1 graham  wheel   308  5 Jul 15:15 handler.wsgi
 0 drwxr-xr-x  2 graham  wheel    68  5 Jul 15:15 htdocs
16 -rw-r--r--  1 graham  wheel  4376  5 Jul 15:15 httpd.conf
 8 -rwxr-xr-x  1 graham  wheel   759  5 Jul 15:15 wsgi-server

You can then say:

apache/wsgi-server start

The Apache instance will be demonised so the command will return. To stop it:

apache/wsgi-server stop

Do note that this will not remember user environment variables set on the 
command line when executing the original setup-server command.

If you were doing this to run at a later time or from a system startup script, 
you can create the file 'apache/envvars' and add and export environment 
variables in it. For example you might in that add:

NEW_RELIC_CONFIG_FILE=/some/path/newrelic.ini
export NEW_RELIC_CONFIG_FILE

As before any feedback or opinions if you have tried it most welcome.

Graham

On 01/07/2013, at 11:03 PM, Graham Dumpleton <[email protected]> wrote:

> After a long hiatus, as far as doing any serious work on mod_wsgi, I have 
> finally been getting up the motivation to work on mod_wsgi again. I have been 
> doing some refactoring of code in the core of mod_wsgi, but I have mainly 
> been playing with stuff that sits around mod_wsgi which makes it easier to 
> install and run, especially for local development and testing. This is all as 
> a prelude to some grander ideas I have for down the track.
> 
> At this time I have thrown up an early beta version of this new experiment to 
> get some feedback on it and to shake out any problems with it. if you have 
> the time to try it out and give me any comments you have, that would be most 
> excellent.
> 
> The express version of the instructions you need to try out this repackaged 
> version of mod_wsgi are as follows:
> 
> 1. Install it.
> 
> pip install wsgi_module
> 
> 2. Run it on your WSGI script file.
> 
> wsgi-admin serve path/to/app.wsgi
> 
> And that is all there is to it.
> 
> You will now have Apache running on port 8000 with mod_wsgi hosting your WSGI 
> application.
> 
> Summarising some things in case you missed it.
> 
> This is making mod_wsgi available as a Python package on PyPi which can be 
> installed using pip. The resultant mod_wsgi.so and associated files get 
> installed into the Python installation or virtual environment and not into 
> your existing Apache installation.
> 
> This means you do not need to have root access.
> 
> What the 'wsgi-admin serve' command will do is create an Apache configuration 
> file on the fly based on any options which are supplied, but otherwise it 
> uses a configuration for Apache/mod_wsgi which I deem is a good configuration 
> for running mod_wsgi with Apache.
> 
> This means you don't have to understand how to configure Apache, I have done 
> that part for you.
> 
> In effect what you have at this point is the equivalent of a standalone 
> Python WSGI server. It will run in the foreground and will not daemonise. If 
> you really wanted it to be daemonised, then run it under supervisord. You 
> will also need to use supervisord at the moment if you wanted it to run as a 
> certain user if starting it automatically when your system boots.
> 
> The 'wsgi-admin' script 'serve' command has a small set of options to allow 
> you to do the most common things that are required when using 
> Apache/mod_wsgi. The script will work out all the appropriate Apache/mod_wsgi 
> configuration and do it in the appropriate way to ensure it all works fine.
> 
> To get the available options run:
> 
> wsgi-admin serve -h
> 
> At the moment this yields.
> 
> Usage: wsgi-admin serve script [options]
> 
> Options:
>   -h, --help            show this help message and exit
>   --host IP-ADDRESS
>   --port NUMBER
>   --processes NUMBER
>   --threads NUMBER
>   --callable-object NAME
>   --reload-on-changes
>   --document-root DIRECTORY-PATH
>   --url-alias URL-PATH FILE-PATH|DIRECTORY-PATH
>   --keep-alive-timeout SECONDS
>   --server-status
>   --include-configuration FILE-PATH
>   --working-directory DIRECTORY-PATH
>   --server-root DIRECTORY-PATH
>   --log-directory DIRECTORY-PATH
>   --httpd-executable FILE-PATH
>   --modules-directory DIRECTORY-PATH
>   --mime-types FILE-PATH
>   --with-newrelic
>   --with-wdb
> 
> So documentation of the options is obviously one of the things still to be 
> done, so a quick run down of a few usage scenarios.
> 
> 1. Specifying the host.
> 
> By default the Apache instance will listen on localhost only. This means it 
> will not be accessible outside of the host it is running on. To make it 
> accessible through any interface use:
> 
> wsgi-admin serve app.wsgi --host 0.0.0.0
> 
> 2. Changing number of processes and threads.
> 
> Daemon mode is always used. It will default to a single process with 5 
> threads. To change the number of processes and thread use:
> 
> wsgi-admin serve app.wsgi --processes 3 --threads 10
> 
> In addition to setting these for the daemon process group, the script will 
> automatically calculate some values for the number of Apache child worker 
> processes and threads which are proxying to the daemon process group running 
> the WSGI application. This works irrespective of whether your Apache 
> installation happens to be using prefork, worker or event MPM.
> 
> 3. Development mode.
> 
> As is usually the case with daemon mode, you can touch the WSGI script file 
> and your application will be reloaded on the next request.
> 
> If however you are doing development and would rather that code be 
> automatically reloaded as you make changes to it, you can use:
> 
> wsgi-admin serve app.wsgi --reload-on-changes
> 
> That way there is no need to touch the WSGI script file or restart Apache 
> manually. As with any such automatic reloading mechanism, it is only for 
> development and you should not use it in production.
> 
> 4. Hosting of static files at the root of the site.
> 
> By default it only hosts your WSGI application. If however you have static 
> files you also need to host and they need to be available from the root of 
> the site, such as favicon.ico, then use:
> 
> wsgi-admin serve app.wsgi --document-root path/to/files
> 
> What will happen is that your WSGI application is still mounted at the root 
> URL, but if when a request is received it matches a file in the document root 
> directory, that file will be served up instead.
> 
> In other words, if a file is found it is served. If a file can't be found, 
> the request is passed to the WSGI application.
> 
> 5. Hosting of static files at a sub URL of the site.
> 
> It is not always the case that files are organised into a nice directory 
> structure which would allow you to mount that directory at the root of the 
> site using --document-root. In this case you can mount a directory at a sub 
> URL instead.
> 
> For example, if using Django, where static files are put together into one 
> directory using the 'collectstatic' management command, but where the 
> directory structure created by 'collectstatic' doesn't include a sub 
> directory corresponding to the sub URL it needs to appear as on the web 
> server, you can use:
> 
> wsgi-admin serve mysite/wsgi.py --url-alias /static mysite/files
> 
> You can use the --url-alias option more than once. The script will ensure 
> that they are all ordered correctly to give the correct precedence if there 
> are overlaps.
> 
> 6. Want to do some performance monitoring.
> 
> There is inbuilt support for New Relic. So long as you have also installed 
> the Python 'newrelic' package and have signed up for New Relic (it has a free 
> Lite tier), you can run:
> 
> NEW_RELIC_CONFIG_FILE=newrelic.ini wsgi-admin serve app.wsgi --with-newrelic
> 
> 7. Need help debugging errors from your application.
> 
> There are various debuggers which allow debugging in the browser. A more 
> recent one which has some advantages over others is wdb 
> (https://github.com/Kozea/wdb). So long as you have the 'wdb' package 
> installed you can use:
> 
> wsgi-admin serve app.wsgi --with-wdb
> 
> There is no need to run the separate 'wdb.server.py' command as the Apache 
> configuration will be setup to automatically run it from the web server in a 
> separate isolated mod_wsgi daemon group process. This way it is always 
> started up and shutdown automatically for you without caring.
> 
> If using Django, just note the need to set;
> 
> DEBUG_PROPAGATE_EXCEPTIONS = True
> 
> in your Django settings file so that exceptions are propagated back up to the 
> WSGI server.
> 
> 8. Change the directories where things are placed.
> 
> By default a directory is created in '/tmp' to put the files which are 
> generated to do all this. The directory is of the form:
> 
> /tmp/apache-host:port:hid
> 
> The log file is called 'error_log' in that directory.
> 
> You can override that directory name using '--server-root'. You can separate 
> override the directory used for the log file using '--log-directory'.
> 
> So, what are the requirements for using this.
> 
> In order to install it you must have Apache 2.2 or 2.4 installed on your 
> system.
> 
> On a Linux system, you need to have both the core Apache packages, as well as 
> the corresponding 'dev' packages.
> 
> For example, if using Ubuntu and you have:
> 
>     - apache2
>     - apache2-mpm-worker
> 
> you also need:
> 
>     - apache2-threaded-dev
> 
> If you have:
> 
>     - apache2
>     - apache2-mpm-prefork
> 
> you also need:
> 
>     - apache2-prefork-dev
> 
> You will need to work out what you need to install for your system, but if 
> you have previously compiled mod_wsgi from source code, you will already have 
> what you need.
> 
> If you are on MacOS X Mountain Lion, you may need to fix up a bug in the 
> Apple Apache/Xcode package caused by a wrong path in the Apache 'apxs' 
> configuration. This is fixed by doing:
> 
> cd /Applications/Xcode.app/Contents/Developer/Toolchains
> sudo ln -s XcodeDefault.xctoolchain OSX10.8.xctoolchain
> 
> This will be trashed by some system updates and will need to be added back if 
> that occurs.
> 
> When pip is run, the setup.py will go looking for the Apache 'apxs' program 
> in your PATH or '/usr/sbin'. If it isn't in your PATH or you want to use a 
> different Apache installation, use:
> 
> APXS=/some/other/path/bin/apxs pip install wsgi_module
> 
> That should be more than enough to get you started if you are interested.
> 
> Try it out for doing development, see how it goes and let me know.
> 
> Overall I think I am already pretty close to where I want this, but will 
> still be doing some internal code cleanups at least. If you have got any 
> other ideas, or the way the Apache configuration is done will not let your 
> application run, then let me know.
> 
> Time to go to sleep and see what anyone comes up with tomorrow.
> 
> Graham
> 
> 
> 
> 
> 
> 

-- 
You received this message because you are subscribed to the Google Groups 
"modwsgi" 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/modwsgi.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to