From f6e2fbc935af648580a286bbd979bd949c84b77f Mon Sep 17 00:00:00 2001 From: Prateek Singh Paudel Date: Thu, 4 Oct 2012 00:43:15 +0545 Subject: [PATCH] Add new website. Older html is modified with redirect code to redirect to relevant part in newsite or docs. So, someone linking to us will still work. --- docs/site/community.html | 72 +-- docs/site/configuration.html | 6 +- docs/site/configure.html | 770 +----------------------------- docs/site/css/index.css | 253 ---------- docs/site/css/style.css | 585 +++++++++++++---------- docs/site/deploy.html | 219 +-------- docs/site/deployment.html | 11 +- docs/site/design.html | 132 +---- docs/site/faq.html | 167 +------ docs/site/images/about.jpg | Bin 0 -> 17551 bytes docs/site/images/arrow.png | Bin 0 -> 408 bytes docs/site/images/banner-bg.jpg | Bin 0 -> 611 bytes docs/site/images/community.jpg | Bin 0 -> 15593 bytes docs/site/images/documents.jpg | Bin 0 -> 17566 bytes docs/site/images/downloads.jpg | Bin 0 -> 15962 bytes docs/site/images/favicon.png | Bin 0 -> 1771 bytes docs/site/images/footer-arrow.png | Bin 0 -> 255 bytes docs/site/images/footer-logo.jpg | Bin 0 -> 2499 bytes docs/site/images/greenbutton.jpg | Bin 0 -> 335 bytes docs/site/images/logo-bottom.png | Bin 0 -> 3145 bytes docs/site/images/logo.jpg | Bin 0 -> 10238 bytes docs/site/images/redbutton.jpg | Bin 0 -> 577 bytes docs/site/images/separator.jpg | Bin 0 -> 440 bytes docs/site/images/title.png | Bin 0 -> 3450 bytes docs/site/images/user1.jpg | Bin 0 -> 2184 bytes docs/site/index.html | 275 +++++++---- docs/site/install.html | 217 +-------- docs/site/installation.html | 7 +- docs/site/js/main.js | 46 ++ docs/site/news.html | 458 +----------------- docs/site/run.html | 172 +------ docs/site/tuning.html | 6 +- docs/site/usage.html | 6 +- 33 files changed, 629 insertions(+), 2773 deletions(-) delete mode 100644 docs/site/css/index.css create mode 100644 docs/site/images/about.jpg create mode 100644 docs/site/images/arrow.png create mode 100644 docs/site/images/banner-bg.jpg create mode 100644 docs/site/images/community.jpg create mode 100644 docs/site/images/documents.jpg create mode 100644 docs/site/images/downloads.jpg create mode 100644 docs/site/images/favicon.png create mode 100644 docs/site/images/footer-arrow.png create mode 100644 docs/site/images/footer-logo.jpg create mode 100644 docs/site/images/greenbutton.jpg create mode 100644 docs/site/images/logo-bottom.png create mode 100644 docs/site/images/logo.jpg create mode 100644 docs/site/images/redbutton.jpg create mode 100644 docs/site/images/separator.jpg create mode 100644 docs/site/images/title.png create mode 100644 docs/site/images/user1.jpg create mode 100755 docs/site/js/main.js diff --git a/docs/site/community.html b/docs/site/community.html index 8bdbf96c..f6fae4d4 100644 --- a/docs/site/community.html +++ b/docs/site/community.html @@ -1,73 +1,13 @@ - + + Green Unicorn - Community - -
- -
-
-
-

Mailing list

-

The user mailing list is general discussion and support list for -Gunicorn users.

-
- -
-

The archive for this list can also be browsed online .

-
-
-

Irc

-

The Gunicorn channel is on the Freenode IRC -network. You can chat with other on #gunicorn channel.

-
-
-

Issue Tracking

-

Bug reports, enhancement requests and tasks generally go in the Github -issue tracker.

-
-
-
-
-
-

Contents

- -
-
- -
+

+ Redirecting to here +

- \ No newline at end of file + diff --git a/docs/site/configuration.html b/docs/site/configuration.html index 63577a82..88bcf302 100644 --- a/docs/site/configuration.html +++ b/docs/site/configuration.html @@ -1,13 +1,13 @@ - - + + Green Unicorn - Configuration

- Redirecting to here + Redirecting to here

diff --git a/docs/site/configure.html b/docs/site/configure.html index 924ee13e..3028eb9c 100644 --- a/docs/site/configure.html +++ b/docs/site/configure.html @@ -1,771 +1,13 @@ - + + Green Unicorn - Configure - -
- -
-
-
-

Overview

-

Gunicorn pulls configuration information from three distinct places.

-

The first place that Gunicorn will read configuration from is the framework -specific configuration file. Currently this only affects Paster applications.

-

The second source of configuration information is a configuration file that is -optionally specified on the command line. Anything specified in the Gunicorn -config file will override any framework specific settings.

-

Lastly, the command line arguments used to invoke Gunicorn are the final place -considered for configuration settings. If an option is specified on the command -line, this is the value that will be used.

-
-
Once again, in order of least to most authoritative:
-
    -
  1. Framework Settings
  2. -
  3. Configuration File
  4. -
  5. Command Line
  6. -
-
-
-
-
-

Framework Settings

-

Currently, only Paster applications have access to framework specific -settings. If you have ideas for providing settings to WSGI applications or -pulling information from Django's settings.py feel free to open an issue to -let us know.

-
-

Paster Applications

-

In your INI file, you can specify to use Gunicorn as the server like such:

-
-[server:main]
-use = egg:gunicorn#main
-host = 192.168.0.1
-port = 80
-workers = 2
-proc_name = brim
-
-

Any parameters that Gunicorn knows about will automatically be inserted into -the base configuration. Remember that these will be overridden by the config -file and/or the command line.

-
-
-
-

Configuration File

-

The configuration file should be a valid Python source file. It only needs to -be readable from the file system. More specifically, it does not need to be -importable. Any Python is valid. Just consider that this will be run every time -you start Gunicorn (including when you signal Gunicorn to reload).

-

To set a parameter, just assign to it. There's no special syntax. The values -you provide will be used for the configuration values.

-

For instance:

-
-import multiprocessing
-
-bind = "127.0.0.1:8000"
-workers = multiprocessing.cpu_count() * 2 + 1
-
-

On a side note, Python's older than 2.6 can use sysconf to get the -number of processors:

-
-import os
-
-def numCPUs():
-    if not hasattr(os, "sysconf"):
-        raise RuntimeError("No sysconf detected.")
-    return os.sysconf("SC_NPROCESSORS_ONLN")
-
-
-
-

Command Line

-

If an option is specified on the command line, it overrides all other values -that may have been specified in the app specific settings, or in the optional -configuration file. Not all Gunicorn settings are available to be set from the -command line. To see the full list of command line settings you can do the -usual:

-
-$ gunicorn -h
-
-

There is also a --version flag available to the command line scripts that -isn't mentioned in the list of settings.

-
-
-

Settings

-

This is an exhaustive list of settings for Gunicorn. Some settings are only -able to be set from a configuration file. The setting name is what should be -used in the configuration file. The command line arguments are listed as well -for reference on setting at the command line.

-
-

Config File

-
-

config

-
    -
  • -c FILE, --config FILE
  • -
  • None
  • -
-

The path to a Gunicorn config file.

-

Only has an effect when specified on the command line or as part of an -application specific configuration.

-
-
-
-

Server Socket

-
-

bind

-
    -
  • -b ADDRESS, --bind ADDRESS
  • -
  • 127.0.0.1:8000
  • -
-

The socket to bind.

-

A string of the form: 'HOST', 'HOST:PORT', 'unix:PATH'. An IP is a valid -HOST.

-
-
-

backlog

-
    -
  • --backlog INT
  • -
  • 2048
  • -
-

The maximum number of pending connections.

-

This refers to the number of clients that can be waiting to be served. -Exceeding this number results in the client getting an error when -attempting to connect. It should only affect servers under significant -load.

-

Must be a positive integer. Generally set in the 64-2048 range.

-
-
-
-

Worker Processes

-
-

workers

-
    -
  • -w INT, --workers INT
  • -
  • 1
  • -
-

The number of worker process for handling requests.

-

A positive integer generally in the 2-4 x $(NUM_CORES) range. You'll -want to vary this a bit to find the best for your particular -application's work load.

-
-
-

worker_class

-
    -
  • -k STRING, --worker-class STRING
  • -
  • sync
  • -
-

The type of workers to use.

-

The default class (sync) should handle most 'normal' types of workloads. -You'll want to read http://gunicorn.org/design.html for information on -when you might want to choose one of the other worker classes.

-

A string referring to one of the following bundled classes:

-
    -
  • sync
  • -
  • eventlet - Requires eventlet >= 0.9.7
  • -
  • gevent - Requires gevent >= 0.12.2 (?)
  • -
  • tornado - Requires tornado >= 0.2
  • -
-

Optionally, you can provide your own worker by giving gunicorn a -python path to a subclass of gunicorn.workers.base.Worker. This -alternative syntax will load the gevent class: -gunicorn.workers.ggevent.GeventWorker. Alternatively the syntax -can also load the gevent class with egg:gunicorn#gevent

-
-
-

worker_connections

-
    -
  • --worker-connections INT
  • -
  • 1000
  • -
-

The maximum number of simultaneous clients.

-

This setting only affects the Eventlet and Gevent worker types.

-
-
-

max_requests

-
    -
  • --max-requests INT
  • -
  • 0
  • -
-

The maximum number of requests a worker will process before restarting.

-

Any value greater than zero will limit the number of requests a work -will process before automatically restarting. This is a simple method -to help limit the damage of memory leaks.

-

If this is set to zero (the default) then the automatic worker -restarts are disabled.

-
-
-

timeout

-
    -
  • -t INT, --timeout INT
  • -
  • 30
  • -
-

Workers silent for more than this many seconds are killed and restarted.

-

Generally set to thirty seconds. Only set this noticeably higher if -you're sure of the repercussions for sync workers. For the non sync -workers it just means that the worker process is still communicating and -is not tied to the length of time required to handle a single request.

-
-
-

graceful_timeout

-
    -
  • --graceful-timeout INT
  • -
  • 30
  • -
-

Timeout for graceful workers restart.

-

Generally set to thirty seconds. How max time worker can handle -request after got restart signal. If the time is up worker will -be force killed.

-
-
-

keepalive

-
    -
  • --keep-alive INT
  • -
  • 2
  • -
-

The number of seconds to wait for requests on a Keep-Alive connection.

-

Generally set in the 1-5 seconds range.

-
-
-
-

Security

-
-

limit_request_line

-
    -
  • --limit-request-line INT
  • -
  • 4094
  • -
-

The maximum size of HTTP request line in bytes.

-

This parameter is used to limit the allowed size of a client's -HTTP request-line. Since the request-line consists of the HTTP -method, URI, and protocol version, this directive places a -restriction on the length of a request-URI allowed for a request -on the server. A server needs this value to be large enough to -hold any of its resource names, including any information that -might be passed in the query part of a GET request. Value is a number -from 0 (unlimited) to 8190.

-

This parameter can be used to prevent any DDOS attack.

-
-
-

limit_request_fields

-
    -
  • --limit-request-fields INT
  • -
  • 100
  • -
-

Limit the number of HTTP headers fields in a request.

-

This parameter is used to limit the number of headers in a request to -prevent DDOS attack. Used with the limit_request_field_size it allows -more safety. By default this value is 100 and can't be larger than -32768.

-
-
-

limit_request_field_size

-
    -
  • --limit-request-field_size INT
  • -
  • 8190
  • -
-

Limit the allowed size of an HTTP request header field.

-

Value is a number from 0 (unlimited) to 8190. to set the limit -on the allowed size of an HTTP request header field.

-
-
-
-

Debugging

-
-

debug

-
    -
  • --debug
  • -
  • False
  • -
-

Turn on debugging in the server.

-

This limits the number of worker processes to 1 and changes some error -handling that's sent to clients.

-
-
-

spew

-
    -
  • --spew
  • -
  • False
  • -
-

Install a trace function that spews every line executed by the server.

-

This is the nuclear option.

-
-
-

check_config

-
    -
  • --check-config
  • -
  • False
  • -
-

Check the configuration..

-
-
-
-

Server Mechanics

-
-

preload_app

-
    -
  • --preload
  • -
  • False
  • -
-

Load application code before the worker processes are forked.

-

By preloading an application you can save some RAM resources as well as -speed up server boot times. Although, if you defer application loading -to each worker process, you can reload your application code easily by -restarting workers.

-
-
-

daemon

-
    -
  • -D, --daemon
  • -
  • False
  • -
-

Daemonize the Gunicorn process.

-

Detaches the server from the controlling terminal and enters the -background.

-
-
-

pidfile

-
    -
  • -p FILE, --pid FILE
  • -
  • None
  • -
-

A filename to use for the PID file.

-

If not set, no PID file will be written.

-
-
-

user

-
    -
  • -u USER, --user USER
  • -
  • 1000
  • -
-

Switch worker processes to run as this user.

-

A valid user id (as an integer) or the name of a user that can be -retrieved with a call to pwd.getpwnam(value) or None to not change -the worker process user.

-
-
-

group

-
    -
  • -g GROUP, --group GROUP
  • -
  • 1000
  • -
-

Switch worker process to run as this group.

-

A valid group id (as an integer) or the name of a user that can be -retrieved with a call to pwd.getgrnam(value) or None to not change -the worker processes group.

-
-
-

umask

-
    -
  • -m INT, --umask INT
  • -
  • 0
  • -
-

A bit mask for the file mode on files written by Gunicorn.

-

Note that this affects unix socket permissions.

-

A valid value for the os.umask(mode) call or a string compatible with -int(value, 0) (0 means Python guesses the base, so values like "0", -"0xFF", "0022" are valid for decimal, hex, and octal representations)

-
-
-

tmp_upload_dir

-
    -
  • None
  • -
-

Directory to store temporary request data as they are read.

-

This may disappear in the near future.

-

This path should be writable by the process permissions set for Gunicorn -workers. If not specified, Gunicorn will choose a system generated -temporary directory.

-
-
-

secure_scheme_headers

-
    -
  • {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-SSL': 'on'}
  • -
-

A dictionary containing headers and values that the front-end proxy -uses to indicate HTTPS requests. These tell gunicorn to set -wsgi.url_scheme to "https", so your application can tell that the -request is secure.

-

The dictionary should map upper-case header names to exact string -values. The value comparisons are case-sensitive, unlike the header -names, so make sure they're exactly what your front-end proxy sends -when handling HTTPS requests.

-

It is important that your front-end proxy configuration ensures that -the headers defined here can not be passed directly from the client.

-
-
-

x_forwarded_for_header

-
    -
  • X-FORWARDED-FOR
  • -
-

Set the X-Forwarded-For header that identify the originating IP -address of the client connection to gunicorn via a proxy.

-
-
-
-

Logging

-
-

accesslog

-
    -
  • --access-logfile FILE
  • -
  • None
  • -
-

The Access log file to write to.

-

"-" means log to stderr.

-
-
-

access_log_format

-
    -
  • --access-logformat STRING
  • -
  • "%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
  • -
-

The Access log format .

-

By default:

-

%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"

-

h: remote address -l: '-' -u: currently '-', may be user name in future releases -t: date of the request -r: status line (ex: GET / HTTP/1.1) -s: status -b: response length or '-' -f: referer -a: user agent -T: request time in seconds -D: request time in microseconds, -p: process ID -{Header}i: request header -{Header}o: response header

-
-
-

errorlog

-
    -
  • --error-logfile FILE, --log-file FILE
  • -
  • -
  • -
-

The Error log file to write to.

-

"-" means log to stderr.

-
-
-

loglevel

-
    -
  • --log-level LEVEL
  • -
  • info
  • -
-

The granularity of Error log outputs.

-

Valid level names are:

-
    -
  • debug
  • -
  • info
  • -
  • warning
  • -
  • error
  • -
  • critical
  • -
-
-
-

logger_class

-
    -
  • --logger-class STRING
  • -
  • simple
  • -
-

The logger you want to use to log events in gunicorn.

-

The default class (gunicorn.glogging.Logger) handle most of -normal usages in logging. It provides error and access logging.

-

You can provide your own worker by giving gunicorn a -python path to a subclass like gunicorn.glogging.Logger. -Alternatively the syntax can also load the Logger class -with egg:gunicorn#simple

-
-
-

logconfig

-
    -
  • --log-config FILE
  • -
  • None
  • -
-

The log config file to use. -Gunicorn uses the standard Python logging module's Configuration -file format.

-
-
-
-

Process Naming

-
-

proc_name

-
    -
  • -n STRING, --name STRING
  • -
  • None
  • -
-

A base to use with setproctitle for process naming.

-

This affects things like ps and top. If you're going to be -running more than one instance of Gunicorn you'll probably want to set a -name to tell them apart. This requires that you install the setproctitle -module.

-

It defaults to 'gunicorn'.

-
-
-

default_proc_name

-
    -
  • gunicorn
  • -
-

Internal setting that is adjusted for each type of application.

-
-
-
-

Django

-
-

django_settings

-
    -
  • --settings STRING
  • -
  • None
  • -
-

The Python path to a Django settings module.

-

e.g. 'myproject.settings.main'. If this isn't provided, the -DJANGO_SETTINGS_MODULE environment variable will be used.

-
-
-

pythonpath

-
    -
  • --pythonpath STRING
  • -
  • None
  • -
-

A directory to add to the Python path for Django.

-

e.g. -'/home/djangoprojects/myproject'.

-
-
-
-

Server Hooks

-
-

on_starting

-
    -
  • -def on_starting(server):
    -    pass
    -
    -
  • -
-

Called just before the master process is initialized.

-

The callable needs to accept a single instance variable for the Arbiter.

-
-
-

on_reload

-
    -
  • -def on_reload(server):
    -    pass
    -
    -
  • -
-

Called to recycle workers during a reload via SIGHUP.

-

The callable needs to accept a single instance variable for the Arbiter.

-
-
-

when_ready

-
    -
  • -def when_ready(server):
    -    pass
    -
    -
  • -
-

Called just after the server is started.

-

The callable needs to accept a single instance variable for the Arbiter.

-
-
-

pre_fork

-
    -
  • -def pre_fork(server, worker):
    -    pass
    -
    -
  • -
-

Called just before a worker is forked.

-

The callable needs to accept two instance variables for the Arbiter and -new Worker.

-
-
-

post_fork

-
    -
  • -def post_fork(server, worker):
    -    pass
    -
    -
  • -
-

Called just after a worker has been forked.

-

The callable needs to accept two instance variables for the Arbiter and -new Worker.

-
-
-

pre_exec

-
    -
  • -def pre_exec(server):
    -    pass
    -
    -
  • -
-

Called just before a new master process is forked.

-

The callable needs to accept a single instance variable for the Arbiter.

-
-
-

pre_request

-
    -
  • -def pre_request(worker, req):
    -    worker.log.debug("%s %s" % (req.method, req.path))
    -
    -
  • -
-

Called just before a worker processes the request.

-

The callable needs to accept two instance variables for the Worker and -the Request.

-
-
-

post_request

-
    -
  • -def post_request(worker, req, environ):
    -    pass
    -
    -
  • -
-

Called after a worker processes the request.

-

The callable needs to accept two instance variables for the Worker and -the Request.

-
-
-

worker_exit

-
    -
  • -def worker_exit(server, worker):
    -    pass
    -
    -
  • -
-

Called just after a worker has been exited.

-

The callable needs to accept two instance variables for the Arbiter and -the just-exited Worker.

-
-
-
-
-
- - -
+

+ Redirecting to here +

- \ No newline at end of file + diff --git a/docs/site/css/index.css b/docs/site/css/index.css deleted file mode 100644 index b67b2673..00000000 --- a/docs/site/css/index.css +++ /dev/null @@ -1,253 +0,0 @@ -/* line 17, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font: inherit; - font-size: 100%; - vertical-align: baseline; -} - -/* line 22, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -html { - line-height: 1; -} - -/* line 24, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -ol, ul { - list-style: none; -} - -/* line 26, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -table { - border-collapse: collapse; - border-spacing: 0; -} - -/* line 28, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -caption, th, td { - text-align: left; - font-weight: normal; - vertical-align: middle; -} - -/* line 30, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -q, blockquote { - quotes: none; -} -/* line 103, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -q:before, q:after, blockquote:before, blockquote:after { - content: ""; - content: none; -} - -/* line 32, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -a img { - border: none; -} - -/* line 116, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary { - display: block; -} - -/* line 15, ../../css/index.sass */ -#container.landing { - margin-left: auto; - margin-right: auto; - width: 960px; -} -/* line 17, ../../css/index.sass */ -#container.landing #menu, #container.landing #header, #container.landing div.blurb, #container.landing #tutorial, #container.landing #actions, #container.landing #footer { - display: inline; - float: left; - margin-left: 10px; - margin-right: 10px; -} -/* line 19, ../../css/index.sass */ -#container.landing #menu, #container.landing #header, #container.landing #footer { - width: 940px; -} -/* line 22, ../../css/index.sass */ -#container.landing div.blurb { - width: 300px; -} -/* line 24, ../../css/index.sass */ -#container.landing #tutorial { - width: 620px; -} - -/* line 4, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -body { - font: 13px/1.5 Helvetica, Arial, 'Liberation Sans', FreeSans, sans-serif; -} - -/* line 6, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -a:focus { - outline: 1px dotted invert; -} - -/* line 8, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -hr { - border-color: #cccccc; - border-style: solid; - border-width: 1px 0 0; - clear: both; - height: 0; -} - -/* line 14, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -h1 { - font-size: 25px; -} - -/* line 16, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -h2 { - font-size: 23px; -} - -/* line 18, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -h3 { - font-size: 21px; -} - -/* line 20, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -h4 { - font-size: 19px; -} - -/* line 22, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -h5 { - font-size: 17px; -} - -/* line 24, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -h6 { - font-size: 15px; -} - -/* line 26, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -ol { - list-style: decimal; -} - -/* line 28, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -ul { - list-style: square; -} - -/* line 30, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -li { - margin-left: 30px; -} - -/* line 32, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -p, -dl, -hr, -h1, -h2, -h3, -h4, -h5, -h6, -ol, -ul, -pre, -table, -address, -fieldset { - margin-bottom: 20px; -} - -/* line 29, ../../css/index.sass */ -a, a:visited, a:hover, a:active { - color: #569633; - text-decoration: none; -} - -/* line 33, ../../css/index.sass */ -#header { - margin: 46px 0px; -} - -/* line 36, ../../css/index.sass */ -#menu { - margin-bottom: 23px; - -moz-border-radius-bottomleft: 10px; - -webkit-border-bottom-left-radius: 10px; - border-bottom-left-radius: 10px; - -moz-border-radius-bottomright: 10px; - -webkit-border-bottom-right-radius: 10px; - border-bottom-right-radius: 10px; - background-color: #959595; - text-align: right; -} -/* line 41, ../../css/index.sass */ -#menu div.logo { - float: left; - margin-left: 10px; - padding-top: 3px; -} -/* line 45, ../../css/index.sass */ -#menu ul { - display: inline; - margin-right: 10px; - list-style: none; -} -/* line 11, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss */ -#menu ul li { - list-style-image: none; - list-style-type: none; - margin-left: 0; -} -/* line 49, ../../css/index.sass */ -#menu ul li { - display: inline; - padding: 0px 3px; -} -/* line 52, ../../css/index.sass */ -#menu ul li a { - font-size: 17px; - color: white; -} - -/* line 56, ../../css/index.sass */ -#footer { - border-top: 1px solid #959595; - padding: 10px 0px; - text-align: center; - color: #959595; -} -/* line 61, ../../css/index.sass */ -#footer p { - margin-bottom: 5px; -} - -/* line 64, ../../css/index.sass */ -pre, tt, code { - font-family: "Andale Mono", "Lucida Console", monospace; - font-size: 12px; -} - -/* line 68, ../../css/index.sass */ -pre { - white-space: pre; - background-color: black; - color: lime; - margin: 5px; - margin-bottom: 20px; - padding: 5px; -} diff --git a/docs/site/css/style.css b/docs/site/css/style.css index 0f7cc672..7803d57d 100644 --- a/docs/site/css/style.css +++ b/docs/site/css/style.css @@ -1,309 +1,392 @@ -/* line 17, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font: inherit; - font-size: 100%; - vertical-align: baseline; +html,body { + margin: 0; + padding: 0; +} + +h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,cite, +code,del,dfn,em,img,q,s,samp,small,strike,strong,sub,sup,tt,var, +dd,dl,dt,li,ol,ul,fieldset,form,label,legend,button,table,caption, +tbody,tfoot,thead,tr,th,td { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; +} + +ol,ul { + list-style: none; } -/* line 22, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ html { - line-height: 1; + overflow-y: scroll; + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; } -/* line 24, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -ol, ul { - list-style: none; +a:hover, a:active, a:focus { + outline: 0; } -/* line 26, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -table { - border-collapse: collapse; - border-spacing: 0; +img { + border: 0; + -ms-interpolation-mode: bicubic; } -/* line 28, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -caption, th, td { - text-align: left; - font-weight: normal; - vertical-align: middle; -} - -/* line 30, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -q, blockquote { - quotes: none; -} -/* line 103, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -q:before, q:after, blockquote:before, blockquote:after { - content: ""; - content: none; -} - -/* line 32, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -a img { - border: none; -} - -/* line 116, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary { - display: block; -} - -/* line 15, ../../css/style.sass */ -#container.twocolumn { - margin-left: auto; - margin-right: auto; - width: 960px; -} -/* line 17, ../../css/style.sass */ -#container.twocolumn #header, #container.twocolumn #menu, #container.twocolumn #footer, #container.twocolumn #toc, #container.twocolumn #content { - display: inline; - float: left; - margin-left: 10px; - margin-right: 10px; -} -/* line 19, ../../css/style.sass */ -#container.twocolumn #header, #container.twocolumn #menu, #container.twocolumn #footer { - width: 940px; -} -/* line 21, ../../css/style.sass */ -#container.twocolumn #toc { - width: 300px; -} -/* line 23, ../../css/style.sass */ -#container.twocolumn #content { - width: 620px; -} - -/* line 4, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ body { - font: 13px/1.5 Helvetica, Arial, 'Liberation Sans', FreeSans, sans-serif; + background: #F8F8F3; + margin: 0; + font: 14px/1.4 "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, "Lucida Grande", sans-serif; + color: #67686B; + height: auto; } -/* line 6, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -a:focus { - outline: 1px dotted invert; +a, +a:hover { + text-decoration: none; } -/* line 8, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -hr { - border-color: #cccccc; - border-style: solid; - border-width: 1px 0 0; - clear: both; - height: 0; +.clearall { + clear: both; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; } -/* line 14, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -h1 { - font-size: 25px; +.logo-wrapper { + border-bottom: 1px solid #2A8729; } -/* line 16, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -h2 { - font-size: 23px; +.logo-div { + width: 1000px; + margin: 0 auto; + padding: 5px; + height: 72px; } -/* line 18, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -h3 { - font-size: 21px; +.logo { + width: 250px; + margin: 0 auto; + height: 119px; + background: url(../images/logo-bottom.png) no-repeat bottom center; + position: relative; + z-index: 99999; } -/* line 20, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -h4 { - font-size: 19px; +.banner-wrapper { + background: url(../images/banner-bg.jpg) repeat; + display: block; + width: 100%; + min-height: 365px; + margin-top: 1px; + margin-bottom: 1px; } -/* line 22, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -h5 { - font-size: 17px; +.banner { + width: 1000px; + margin: 0 auto; + padding: 15px; } -/* line 24, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -h6 { - font-size: 15px; +.title { + width: 250px; + margin: 0 auto; + margin-top: 32px; + text-align:center; } -/* line 26, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -ol { - list-style: decimal; +.banner h1 { + font-size: 20px; + font-weight: lighter; + color: #FFF; + margin: 15px 10px 0; + padding: 5px 40px; + text-align: center; + line-height: 28px; } -/* line 28, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -ul { - list-style: square; +.greenbutton { + background: url(../images/greenbutton.jpg) repeat-x; + height: 54px; + width: 224px; + line-height: 54px; + display: inline-block; + text-align: center; + border-radius: 3px; + border: solid 1px #1D692D; + color: #fff; + font-size: 22px; + letter-spacing: 1px; + text-shadow: 1px 1px 1px #000; } -/* line 30, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -li { - margin-left: 30px; +.greenbutton:hover { + background: url(../images/greenbutton.jpg) repeat-x bottom; } -/* line 32, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */ -p, -dl, -hr, -h1, -h2, -h3, -h4, -h5, -h6, -ol, -ul, -pre, -table, -address, -fieldset { - margin-bottom: 20px; +.redbutton { + background: url(../images/redbutton.jpg) repeat-x; + height: 54px; + width: 224px; + line-height: 54px; + display: inline-block; + text-align: center; + border-radius: 3px; + border: solid 1px #7D180A; + color: #fff; + font-size: 22px; + letter-spacing: 1px; + text-shadow: 1px 1px 1px #000; } -/* line 30, ../../css/style.sass */ -body { - font-family: Helvetica, Arial, sans-serif; +.redbutton:hover { + background: url(../images/redbutton.jpg) repeat-x bottom; } -/* line 33, ../../css/style.sass */ -a, a:visited, a:hover, a:active { - color: #569633; - text-decoration: none; +.banner-button { + width: 460px; + margin: 0 auto; + margin-top: 30px; } -/* line 39, ../../css/style.sass */ -#menu { - margin-bottom: 23px; - -moz-border-radius-bottomleft: 10px; - -webkit-border-bottom-left-radius: 10px; - border-bottom-left-radius: 10px; - -moz-border-radius-bottomright: 10px; - -webkit-border-bottom-right-radius: 10px; - border-bottom-right-radius: 10px; - background-color: #959595; - text-align: right; -} -/* line 44, ../../css/style.sass */ -#menu div.logo { - float: left; - margin-left: 10px; - padding-top: 3px; -} -/* line 48, ../../css/style.sass */ -#menu ul { - display: inline; - margin-right: 10px; - list-style: none; -} -/* line 11, /Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss */ -#menu ul li { - list-style-image: none; - list-style-type: none; - margin-left: 0; -} -/* line 52, ../../css/style.sass */ -#menu ul li { - display: inline; - padding: 0px 3px; -} -/* line 55, ../../css/style.sass */ -#menu ul li a { - font-size: 17px; - color: white; +.banner-link { + width: 250px; + margin: 0 auto; + margin-top: 15px; + padding: 5px; + text-align: center; } -/* line 59, ../../css/style.sass */ -div.document { - border-right: 1px solid #959595; - padding-right: 15px; +.banner-link a { + color: #fff; + font-weight: 700; + letter-spacing: 1px; } -/* line 64, ../../css/style.sass */ -#toc ul ul { - list-style: disc; -} -/* line 66, ../../css/style.sass */ -#toc ul ul ul { - list-style: circle; +.banner-link a:hover { + color: #000; } -/* line 69, ../../css/style.sass */ -p.topic-title { - display: none; +.mid-wrapper { + width: 100%; + border-top: 1px solid #2A8729; + padding-top: 15px; } -/* line 72, ../../css/style.sass */ -pre, tt, code { - font-family: "Andale Mono", "Lucida Console", monospace; - font-size: 12px; +.tabs { + width: 1000px; + margin: 0 auto; + padding: 3px; + margin-top: 5px; + margin-bottom: 25px; +} + +.tab-bar li { + width: 230px; + padding: 3px; + text-align: center; + float: left; + margin-right: 5px; + margin-left: 6px; +} + +.tab-bar li a { + display: inline-block; +} + +.tab-bar li a:hover > p, +.tab-bar li a:hover > h2 { + color: #1D692D; +} + +.tab-bar li a p, +.tab-bar li a h2 { + color: #404028; + margin-top: 8px; + line-height: 1.2; +} + +.tab-bar li a h2 { + font-weight: 700; + text-transform: uppercase; +} + +.withborder { + background: url(../images/separator.jpg) no-repeat; +} + +.gabout, .gcommunity, .gdownloads, .gdocuments { + height: 80px; + width: 230px; + padding-top: 118px; +} + +.gabout { + background: url(../images/about.jpg) no-repeat 50% 0; +} + +.gcommunity { + background: url(../images/community.jpg) no-repeat 50% 0; +} + +.gdocuments { + background: url(../images/documents.jpg) no-repeat 50% 0; +} + +.gdownloads { + background: url(../images/downloads.jpg) no-repeat 50% 0; +} + +.tabs li.active a, +.gabout:hover, +.gcommunity:hover, +.gdocuments:hover, +.gdownloads:hover { + background-position: 50% -220px; +} + +.tabs div { + display:none; +} + +.tabs div.active { + display: block; +} + +.tab-box { + color: #3F3F27; + border: 1px solid #DDDDD5; + padding: 25px 35px; + position: relative; + margin-top: 20px; + border-radius: 3px; +} + +.tab-box h1 { + font-size: 28px; + color: #2A8729; +} + +.tab-box p { + margin: 0 0 9px; +} + +.tab-box ul { + padding-left: 40px; +} + +.tab-box li { + list-style: disc; + margin: 0 0 9px; +} + +.tab-box a { + color: #3F3F27; + text-decoration: underline; +} + +.tab-box a:hover { + color: #1D692D; +} + +.arrow { + background: url(../images/arrow.png) no-repeat; + position: absolute; + left: 115px; + top: -7px; + height: 10px; + width: 20px; } -/* line 76, ../../css/style.sass */ pre { - white-space: pre; - background-color: black; - color: lime; - margin: 5px; - margin-bottom: 20px; - padding: 5px; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + color: #333333; + display: block; + padding: 8.5px; + margin: 0 0 9px; + font-size: 14px; + line-height: 18px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #EEFFCC; + border-top: 1px solid #A9CC99; + border-bottom: 1px solid #A9CC99; } -/* line 84, ../../css/style.sass */ -.note { - border-top: 1px solid #569633; - border-bottom: 1px solid #569633; - padding: 0.6em 0.6em 0.6em 80px; - margin-bottom: 2em; - position: relative; -} -/* line 90, ../../css/style.sass */ -.note p.admonition-title:before { - content: "!"; - font-size: 60px; - font-weight: bold; - color: red; - position: absolute; - left: 30px; - font-family: helvetica, arial; -} -/* line 98, ../../css/style.sass */ -.note p.admonition-title { - font-weight: 700; - margin: 0; - margin-bottom: 4px; - padding: 0; -} -/* line 103, ../../css/style.sass */ -.note p.last { - padding: 0; - margin: 0; +.user-wrapper { + background: url(../images/banner-bg.jpg) repeat; + height: 110px; } -/* line 107, ../../css/style.sass */ -#footer { - border-top: 1px solid #959595; - padding: 10px 0px; - text-align: center; - color: #959595; -} -/* line 112, ../../css/style.sass */ -#footer p { - margin-bottom: 5px; +.users { + width: 1000px; + padding: 20px 5px; + margin: 0 auto; + color: #fff; } -/* line 115, ../../css/style.sass */ -strong { - font-weight: bold; +.users h3 { + font-size: 12px; + margin-left: 5px; + padding-top: 15px; } + +.users h2 { + font-size: 26px; + margin-left: 5px; +} + +.users .left-details { + width: 120px; + float: left; + height: 66px; + background: url(../images/footer-arrow.png) no-repeat top right; + padding-right: 15px; + text-align: right; +} + +.users .company-logos { + float: left; + width: 820px; + height: 70px; + margin-left: 20px; +} + +.users .company-logos a img { + float: left; + border: solid 1px #004000; + margin: 0 6px; +} + +.users .company-logos a:hover img { + border: solid 1px #000; +} + +.footer { + background-color: #F8F8F3; + display: block; + height: 70px; +} + +.footer .footer-wp { + margin: 0 auto; + padding: 15px 5px; + width: 930px; + background: url(../images/footer-logo.jpg) no-repeat 0 50%; + padding-left: 70px; +} + +.footer-wp a { + color: #3F3F27; + text-decoration: underline; +} + +.footer-wp a:hover { + color: #1D692D; +} \ No newline at end of file diff --git a/docs/site/deploy.html b/docs/site/deploy.html index 85ef8335..97568d2e 100644 --- a/docs/site/deploy.html +++ b/docs/site/deploy.html @@ -1,220 +1,13 @@ - - Green Unicorn - Deploy - + + + Green Unicorn - Deployment -
- -
-
-
-

Nginx Configuration

-

Although there are many HTTP proxies available, we strongly advise that you -use Nginx. If you choose another proxy server you need to make sure that it -buffers slow clients when you use default Gunicorn workers. Without this -buffering Gunicorn will be easily susceptible to denial-of-service attacks. -You can use slowloris to check if your proxy is behaving properly.

-

An example configuration file for fast clients with Nginx:

-
-worker_processes 1;
-
-user nobody nogroup;
-pid /tmp/nginx.pid;
-error_log /tmp/nginx.error.log;
-
-events {
-    worker_connections 1024;
-    accept_mutex off;
-}
-
-http {
-    include mime.types;
-    default_type application/octet-stream;
-    access_log /tmp/nginx.access.log combined;
-    sendfile on;
-
-    upstream app_server {
-        server unix:/tmp/gunicorn.sock fail_timeout=0;
-        # For a TCP configuration:
-        # server 192.168.0.7:8000 fail_timeout=0;
-    }
-
-    server {
-        listen 80 default;
-        client_max_body_size 4G;
-        server_name _;
-
-        keepalive_timeout 5;
-
-
-        location ^~ /static {
-            # path for static files
-            alias /path/to/app/current/public/static;
-        }
-
-        location / {
-            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header Host $http_host;
-            proxy_redirect off;
-
-            proxy_pass   http://app_server;
-        }
-
-        error_page 500 502 503 504 /500.html;
-        location = /500.html {
-            root /path/to/app/current/public;
-        }
-    }
-}
-
-

If you want to be able to handle streaming request/responses or other fancy -features like Comet, Long polling, or Web sockets, you need to turn off the -proxy buffering. When you do this you must run with one of the async worker -classes.

-

To turn off buffering, you only need to add proxy_buffering off; to your -location block:

-
-...
-location / {
-    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-    proxy_set_header Host $http_host;
-    proxy_redirect off;
-    proxy_buffering off;
-
-    if (!-f $request_filename) {
-        proxy_pass http://app_server;
-        break;
-    }
-}
-...
-
-
-
-

Using Virtualenv

-

To serve an app from a Virtualenv it is generally easiest to just install -Gunicorn directly into the Virtualenv. This will create a set of Gunicorn -scripts for that Virtualenv which can be used to run applications normally.

-

If you have Virtualenv installed, you should be able to do something like -this:

-
-$ mkdir ~/venvs/
-$ virtualenv ~/venvs/webapp
-$ source ~/venvs/webapp/bin/activate
-$ ~/venvs/webapp/bin/easy_install -U gunicorn
-$ deactivate
-
-

Then you just need to use one of the three Gunicorn scripts that was installed -into ~/venvs/webapp/bin.

-

Note: You can force the installation of Gunicorn in your Virtualenv by -passing -I or --ignore-installed option to pip:

-
-$ source ~/venvs/webapp/bin/activate
-$ pip install -I gunicorn
-
-
-
-

Monitoring

-
-

Note

-

Make sure that when using either of these service monitors you do not -enable the Gunicorn's daemon mode. These monitors expect that the process -they launch will be the process they need to monior. Daemonizing -will fork-exec which creates an unmonitored process and generally just -confuses the monitor services.

-
-
-

Runit

-

A popular method for deploying Gunicorn is to have it monitored by runit. -Here is an example service definition:

-
-#!/bin/sh
-
-GUNICORN=/usr/local/bin/gunicorn
-ROOT=/path/to/project
-PID=/var/run/gunicorn.pid
-
-APP=main:application
-
-if [ -f $PID ]; then rm $PID; fi
-
-cd $ROOT
-exec $GUNICORN -c $ROOT/gunicorn.conf.py --pid=$PID $APP
-
-

Save this as /etc/sv/[app_name]/run, and make it executable -(chmod u+x /etc/sv/[app_name]/run). -Then run ln -s /etc/sv/[app_name] /etc/service/[app_name]. -If runit is installed, gunicorn should start running automatically as soon -as you create the symlink.

-

If it doesn't start automatically, run the script directly to troubleshoot.

-
-
-

Supervisor

-

Another useful tool to monitor and control Gunicorn is Supervisor. A -simple configuration is:

-
-[program:gunicorn]
-command=/path/to/gunicorn main:application -c /path/to/gunicorn.conf.py
-directory=/path/to/project
-user=nobody
-autostart=true
-autorestart=true
-redirect_stderr=True
-
-
-
-
-

Logging

-

Logging can be configured by using various flags detailed in the -configuration documentation or by creating a logging configuration file. -Send the USR1 signal to rotate logs if you are using the logrotate -utility:

-
-kill -USR1 $(cat /var/run/gunicorn.pid)
-
-
-
-
- - -
+

+ Redirecting to here +

diff --git a/docs/site/deployment.html b/docs/site/deployment.html index 65b90c65..2ccee4bb 100644 --- a/docs/site/deployment.html +++ b/docs/site/deployment.html @@ -1,12 +1,13 @@ + - - - Green Unicorn - Deploy + + + Green Unicorn - Deployment

- Redirecting to here + Redirecting to here

- + \ No newline at end of file diff --git a/docs/site/design.html b/docs/site/design.html index c7f238e5..38f04705 100644 --- a/docs/site/design.html +++ b/docs/site/design.html @@ -1,133 +1,13 @@ - + + Green Unicorn - Design - -
- -
-
-
-

Server Model

-

Gunicorn is based on the pre-fork worker model. This means that there is a -central master process that manages a set of worker processes. The master -never knows anything about individual clients. All requests and responses are -handled completely by worker processes.

-
-

Master

-

The master process is a simple loop that listens for various process signals -and reacts accordingly. It manages the list of running workers by listening -for signals like TTIN, TTOU, and CHLD. TTIN and TTOU tell the master to -increase or decrease the number of running workers. CHLD indicates that a child -process has terminated, in this case the master process automatically restarts -the failed worker.

-
-
-

Sync Workers

-

The most basic and the default worker type is a synchronous worker class that -handles a single request at a time. This model is the simplest to reason about -as any errors will affect at most a single request. Though as we describe below -only processing a single request at a time requires some assumptions about how -applications are programmed.

-
-
-

Async Workers

-

The asynchronous workers available are based on Greenlets (via Eventlet and -Gevent). Greenlets are an implementation of cooperative multi-threading for -Python. In general, an application should be able to make use of these worker -classes with no changes.

-
-
-

Tornado Workers

-

There's also a Tornado worker class. It can be used to write applications using -the Tornado framework. Although the Tornado workers are capable of serving a -WSGI application, this is not a recommended configuration.

-
-
-
-

Choosing a Worker Type

-

The default synchronous workers assume that your application is resource bound -in terms of CPU and network bandwidth. Generally this means that your -application shouldn't do anything that takes an undefined amount of time. For -instance, a request to the internet meets this criteria. At some point the -external network will fail in such a way that clients will pile up on your -servers.

-

This resource bound assumption is why we require a buffering proxy in front of a -default configuration Gunicorn. If you exposed synchronous workers to the -internet, a DOS attack would be trivial by creating a load that trickles data to -the servers. For the curious, Slowloris is an example of this type of load.

-

Some examples of behavior requiring asynchronous workers:

-
-
    -
  • Applications making long blocking calls (Ie, external web services)
  • -
  • Serving requests directly to the internet
  • -
  • Streaming requests and responses
  • -
  • Long polling
  • -
  • Web sockets
  • -
  • Comet
  • -
-
-
-
-

How Many Workers?

-

DO NOT scale the number of workers to the number of clients you expect to have. -Gunicorn should only need 4-12 worker processes to handle hundreds or thousands -of requests per second.

-

Gunicorn relies on the operating system to provide all of the load balancing -when handling requests. Generally we recommend (2 x $num_cores) + 1 as the -number of workers to start off with. While not overly scientific, the formula -is based on the assumption that for a given core, one worker will be reading -or writing from the socket while the other worker is processing a request.

-

Obviously, your particular hardware and application are going to affect the -optimal number of workers. Our recommendation is to start with the above guess -and tune using TTIN and TTOU signals while the application is under load.

-

Always remember, there is such a thing as too many workers. After a point your -worker processes will start thrashing system resources decreasing the throughput -of the entire system.

-
-
-
- - -
+

+ Redirecting to here +

- \ No newline at end of file + diff --git a/docs/site/faq.html b/docs/site/faq.html index 7474a2b9..5dbdc0b1 100644 --- a/docs/site/faq.html +++ b/docs/site/faq.html @@ -1,168 +1,13 @@ - + + Green Unicorn - FAQ - -
- -
-
-
-

WSGI Bits

-
-

How do I set SCRIPT_NAME?

-

By default SCRIPT_NAME is an empy string. The value could be set by -setting SCRIPT_NAME in the environment or as an HTTP header.

-
-
-
-

Server Stuff

-
-

How do I reload my application in Gunicorn?

-

You can gracefully reload by sending HUP signal to gunicorn:

-
-$ kill -HUP masterpid
-
-
-
-

How might I test a proxy configuration?

-

The Slowloris script is a great way to test that your proxy is correctly -buffering responses for the synchronous workers.

-
-
-

How can I name processes?

-

If you install the Python package setproctitle Gunicorn will set the process -names to something a bit more meaningful. This will affect the output you see -in tools like ps and top. This helps for distinguishing the master -process as well as between masters when running more than one app on a single -machine. See the proc_name setting for more information.

-
-
-

Gunicorn fails to start with upstart

-

Make sure you run gunicorn with --daemon option.

-
-
-

Why is there no HTTP Keep-Alive?

-

The default Sync workers are designed to run behind Nginx which only uses -HTTP/1.0 with its upstream servers. If you want to deploy Gunicorn to -handle unbuffered requests (ie, serving requests directly from the internet) -you should use one of the async workers.

-
-
-
-

Worker Processes

-
-

How do I know which type of worker to use?

-

Read the design page for help on the various worker types.

-
-
-

What types of workers are there?

-

Check out the configuration docs for worker_class

-
- -
-

How can I change the number of workers dynamically?

-

TTIN and TTOU signals can be sent to the master to increase or decrease -the number of workers.

-

To increase the worker count by one:

-
-$ kill -TTIN $masterpid
-
-

To decrease the worker count by one:

-
-$ kill -TTOU $masterpid
-
-
-
-
-

Kernel Parameters

-

When dealing with large numbers of concurrent connections there are a handful of -kernel parameters that you might need to adjust. Generally these should only -affect sites with a very large concurrent load. These parameters are not -specific to Gunicorn, they would apply to any sort of network server you may be -running.

-

These commands are for Linux. Your particular OS may have slightly different -parameters.

-
-

How can I increase the maximum number of file descriptors?

-

One of the first settings that usually needs to be bumped is the maximum number -of open file descriptors for a given process. For the confused out there, -remember that Unices treat sockets as files.

-
-$ sudo ulimit -n 2048
-
-
-
-

How can I increase the maximum socket backlog?

-

Listening sockets have an associated queue of incoming connections that are -waiting to be accepted. If you happen to have a stampede of clients that fill up -this queue new connections will eventually start getting dropped.

-
-$ sudo sysctl -w net.core.somaxconn="2048"
-
-
-
-
-
- - -
+

+ Redirecting to here +

- \ No newline at end of file + diff --git a/docs/site/images/about.jpg b/docs/site/images/about.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4aab4d50f53ffc2f77e8ee20667b3e4d648bcf06 GIT binary patch literal 17551 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 literal 0 HcmV?d00001 diff --git a/docs/site/images/arrow.png b/docs/site/images/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..754d3091963e5732e509ce7914c6a021a87ec9c0 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~g!3HGv?z=Y!NU;<zo7-q&JnvO(0TEc)td-$wI-PP4EAvE+TxSAF+M9ho8jh~stUt(um& z^}9QY?>taxd9(JC!m&RL))Dg#7|grAq4RM*o8hx!i=#|om$&>3T6+6+Y5MWydz1BB z-dJjO`7vLAkz6ljM3& tdw#xe6wpooxa#93@wBi1-=zMN;lq^Zk4qO`%>eqH!PC{xWt~$(698>8q}Kod literal 0 HcmV?d00001 diff --git a/docs/site/images/banner-bg.jpg b/docs/site/images/banner-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ba44ffab74b351732f74137593e3caf861c9222 GIT binary patch literal 611 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 HH~T*TOk(2@ literal 0 HcmV?d00001 diff --git a/docs/site/images/documents.jpg b/docs/site/images/documents.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d96d8ca90217e6df4e7cb8aa75970ce685c571e0 GIT binary patch literal 17566 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 Pk8A&5EZLO3o&LW7$>xZ$ literal 0 HcmV?d00001 diff --git a/docs/site/images/downloads.jpg b/docs/site/images/downloads.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c4f93734aaf6a1ab0512e63b07d84cb3d9ebdb3 GIT binary patch literal 15962 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

YbStsWba#$`zVc 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 Jx)5?j`d_V&u)qKS literal 0 HcmV?d00001 diff --git a/docs/site/images/favicon.png b/docs/site/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..63bef255b39f70d9ad144a76b16f1340178077a1 GIT binary patch literal 1771 zcmV;P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX2Nw_q8Tip@^Z)<`eMv+?R7l6Q zR&9(GR~deuGc)(jUGDAzyTAeqwLqXPx>_QLVq(OaGze+>qXf|cEv3PxYMNLR5)(C5 zYfNlN6Jyf;Xwnp@5>nbo3lfcy+F!5=f)r?>eC znVECmujhT9_b`eFJbI~3Ndh1Z0m%u3B!Yq{0t5x*%l`Mvoa;aT;(^~)N)-S`eE;(M zM=u>K2VvPO1%BYcfS?E%cjwjtFiD0!ymscde|uqG`@FS_*7Vo=9(-w4TeYpV+|pic zUova)rllLJr3oYf5yTz(U_GhR+wJ>$K5=DnwOJq;Q|NVzf9;(^`kcP^TBf0iYpxp6P)@-+Y@kQ@o@1`J4o zBx#*pzTlgmpV8%h;dq}H(I`)~Y!q-aQykn(>{G7|GAN$1=+Ame7}taU{ZNC3td z0QD?6bnZ~GNJW)$R3rxokl;uoj_2U!ngL+uvLuU1I43}<&0g!?k(*sSG-TwH++C>1Axz!+}c%ZN>Rm#;3+aKR|V(+Of$9o5QSHHS8P7|@HS;MAtC*R$$ z$(7-2Q5yTkGsYMi>ukVa%L70D&f;}ZG*HlHWS4(qPsGXa#w8m%CQJ>yprhJR^2>>B z2t7?egE)}yhsKiT`!l3#jg;mS;w0#(rdlMF`jBWUF$yW-`CFArbJ zo9xq@T@qn@&)c=`_0HB#QUXXb7K2=c9Grmw10y3sx3>;JP(7*d`OiD0pd^qm`FC^6 zQp!mnAW9-Y-JY)^pui8d9(d97LqTG}BQp-UNrJVwHr$Ac#N;H51gfI%rTn9qOB5S6 zwa_c?y&U@GoTs;xh(*v=_L(=I9Y|`qeJ4XWz{ycCfK!o|02v2DQ5tPt`b60)?>Vv0 zNf1awa-0mpu;uApKkUBnPmewT$`#54j}Ty8QM00Uj!0d0@6-hkbv;}O!k${sP-A#h z6USl@_`%NZ*AJZihwu9iF0+|H&{X`UB#VaAC~CxUmNc>ia0UcmAc75>&Y!wqTJw}z zT*K2dy=6uw5q5FLImuD{?Cj$aK1HC7%oFKVn`Lp{r@BQ|owV_u^ zWlvxI&_m!Ek08OW>0JT+%%wm2`ZH_pU!7zP-}rAF+x^wMmo>8F;Dv)D-FpkjgUOI{ zwzb^4VabNfX3ar3scEv6J<@wrR8DDy|vWpncwv zo+GI&#}zvgsch%O=`cQs_G;T_+GZP?fAtSw@UR(Q$4~xFDpl^8x-cJQhGt9`p}jh}qq!rt(F=dy3LtaYBa7C|XrA65 z_1B`BA#;*mt6!D$#m+@tGd?HDN;}tWuSK=qfnL&(#Y7wja;W<1HEV6x%q~Mi0&vacYG>=r(|udZKf;w%9$I5^bSHkrfq>v;weoO9M%N!HrjU!GQy zCaFt9FC59zIXOtA8I3Fm0xMT3mp#ufl}f(va>a+Qj#vNx|1UYgP?%ZFf%jnh zeYsaj!7qP*xb0k+b8E4DUG<4Zy%Pry91!R|tMm~l`%B>I67NqjpQ2}6V4Vr(fz~j1y85}Sb4q9e0GH@hApigX literal 0 HcmV?d00001 diff --git a/docs/site/images/footer-logo.jpg b/docs/site/images/footer-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf6e5e399db2676ca79e0691690a06d6e26f443f GIT binary patch literal 2499 zcmbtVc{tQ-8~)A0vBt=fZRTW#$* zK!E*j06TAi<3CUT2tP&sk-*R5ogM%t2IvAuAs`q4hJhe3&<+Ps1po->=lUN+e-Q&g zMI?4feOUku27@3_5Evr<_l4aADgqM)^Jw+Fyq56`tE9YERBq$7YsS-#3)X9oz}j>@sBNtLnhKZ zuj9%cY{9d`>d6pSapg9MI}ZDyw)VA;bCl^~mp5GV*1iv|E|v~Uz0s}Q1Fx>q7t+Q~ z(vDP~@w$_n!m1w4KmQob;CysS=4{wM9~iCA^ybz(X+y7oObhs;g<}oak&eaoOAl`7 zc5_<%e_;0Z>cpD_o6BdvR$ZOAD82GRHQ`Q??!K27b=JD*-LYz+MarEX$^}_1*b}J@ zf=Bm#{}^Z8@07Ji)s z$?`qwcJ-+6OuCh)RdPIO_M7_+C1FasV_@}wZa?)VR#JVkv;_V;>oB? zIjF2=BUPxm0=>>i*GBl{zh#QFNz?mLBS@;#!|sAGN^L;62y~((+}nL@4~}bLJLyDG z>PY7sUn^}Z;#y!IIlrA9l0t3EDeK(XifWuW(rYB05gF6_R`c7_OOS78U7os9n0HBP z)9kN1Kxeb?Uv(kI%Q715tbW&C*BEN6HG1KMvc_?OOptUSa-_lH`;E4gfULfSGkz10 z9RI5H1I=rBR`lDZ@Mz4?A(>~S2A(Ln=*`C(6l_`8p%|uy3U9DPgh-C8QwB;}j_&+*2@9t+)fY&Lcjv{`y9aNwRD9>F!H9 zwKCIiH0{_PMtD@NS3H? z=#T#hx-){|L(>dNP9>7OcZ*Kfm#zsTFL!)B-Cgf~YC~{y-1MBxhM@()+(y?@GGY+) z(6fE3?{n3ccM#jIGvelI_H`UBX9bS?U7uF}rVBUGB9YbM9*g95W$$M*wmjRzi=R|p zU7|ZYNx(K0VvyPI>kTns*2eJklkH5Gh{T(feq&KN4_N8@0)Y(jqoLSvMX!E-Q3mSB zC#lGgr*kg%{8ipAc!otGtjsSTf3NE(Y-EObe#nt|JQ$2;)3$@QTn4R`5}HCJ;luiA z)QQKEM^%h86MEKxXErJ(N?9|gzJ9gbWj*E25+%a$AJu~2NXg767VD{@&hoj@)@Grz z9j$R{B2E@5^vYbz(So4Zg|dAq72aiCS1g08_j4<(_FS!lX%a`Lphd+O2fo&PH;qzc z5rR~H3B2G|LdtokC=dM9qJN45B|T z`#FwZ*cet&(pca&Is_#Q)Q}1{K^vH`$E8Dtb(4nOhTX*^fA} z9}#ATEyzSFo9wviyxOGFYj=2$gT1<*WHF+&Rca{SLEl25EkLTu|b+WJ82hL7XcnoPoi%F0V<%%U^zG5U^SUu9| zN&fqrI2I|3IX`~NC|YUSez{jiw@@d?n^EGbpt`m)>89@{{Jo`zFEBRCSWn%fS`WSl z#L3g_NU=wx=WxGIcHD2o*Thy~*PB%DNzpI$rR?DlH~%nZE(K71 zSwu4evhTG5p|9-Q<5GWrKE0xm$7yMn5Fe|RoG%S6qxbmD_Hw2r0!O}twHovFEZ&6- zilcm5x~*&ok`Hi9lJ@G8gW4SG)bbQq5fK;^@!2)8UM9PkQ!$uPtVZ@WdGMO@=-snB zo%(ByH(=%N>iw)YwHSVnoP)Xfe7-<$%mEqWxVi(J^^ck^|LO`r>Y5Fzh{QYtM(Bw~ SXC~Dw&sm5@vAUCXxc>p~s!|jH literal 0 HcmV?d00001 diff --git a/docs/site/images/greenbutton.jpg b/docs/site/images/greenbutton.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f8d7ac3bdb0c3edf4b6d33cdf4fbdf46b867044 GIT binary patch literal 335 zcmex=i3*BJ!6k`h{6D}T z$ia}qz{Jcb$iO7X$SlbC{|JL50|PV2u}FZCg_VgJC?zYv$iT$FjwHh%B+SSnC=$Hz zB2Zcas102w6Du1~MpO{hK%fbN|8FtyFaymKWENzwXSlZUL?z2Mj#&qV&&Ub0d}h9x ZZt?r@g>0@T+<}~u3lfw?l==VP1OPDBGjIR^ literal 0 HcmV?d00001 diff --git a/docs/site/images/logo-bottom.png b/docs/site/images/logo-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..9264bed93577d581d2b8d72898e97197c019fb48 GIT binary patch literal 3145 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 literal 0 HcmV?d00001 diff --git a/docs/site/images/logo.jpg b/docs/site/images/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f96c50cf5291d8d93ba80a4a52e774b77ab812ad GIT binary patch literal 10238 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 BgQWlf literal 0 HcmV?d00001 diff --git a/docs/site/images/redbutton.jpg b/docs/site/images/redbutton.jpg new file mode 100644 index 0000000000000000000000000000000000000000..735f73040151f9924bd4432af7a6a45a89c7eac1 GIT binary patch literal 577 zcmex=rI!if`Eg#tgYun8(AH7>mPkex%+ z$kZ{cux!f4%hw+Lzs0}u7+S&+e=;j+-PnE8d$C%!b#x;kAby}RPo>ZLu+TDLZ< z{n*~O((>~x35I(gyU!o_y>)YP^a0V1Ij71N9bhznUQz11t2z7%Y zLb~tj&S5A|D0g?6Tm9r;Lm`OOePe5F+SQ~p$7d9r(0reC_3Ny*SEYwNPOe-rnb)k} z;M9Dx7&XmMxy3xfN-fr*3~y|2F#Kn54A1H~crjG&q2$!yb;qw2?_5{*XYr=X9#iyG Qo@EAa&b;^ZtK$Eg0BT>LlmGw# literal 0 HcmV?d00001 diff --git a/docs/site/images/separator.jpg b/docs/site/images/separator.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e6cbb8b49fc80774bd36a2d2bf7542531a51eb3 GIT binary patch literal 440 zcmex=``=7@3(_k>nUfm=Y%j1}zd*XLeuH%#2Jd ztRU@zj0}uSY)s4uIYz-iCZWWM3ojOKESmK2|1Aa{W=5bhm<1W^8Fop&ETUSASr#x*}|-^F7&=HD)KzAri{pjLI~lef(a7XRh(IS)8r#VHEZ9e zT+_ZPu7@`hr*l2LJ#ouyzk@N>HcC4SZr=#yJI(WMo_XJ)9c53#=F6{t5zcp> YR^6w#S?6UHW0mKfT6lZnn)?4Y0e-+`8UO$Q literal 0 HcmV?d00001 diff --git a/docs/site/images/title.png b/docs/site/images/title.png new file mode 100644 index 0000000000000000000000000000000000000000..e257bf20673385998fcd4c0bf4b8dabf0297ca6c GIT binary patch literal 3450 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 literal 0 HcmV?d00001 diff --git a/docs/site/images/user1.jpg b/docs/site/images/user1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6373b77f6d8c13e00ceee6b5ba6d1f9752a061c7 GIT binary patch literal 2184 zcmbuAXIRt87Ki^a5I_YCEfEMRAVp9CWra|zG${(9X(SRUq9h=Z5)A=Eks4S;SeGIi zkw6q7Nbe#@Kt+KhKuDx3MVc%{6j1Dgt{l(ftqU0K!R_IhG4xQhO!TITPZ ze*u3)p?{Lc{JzPl#;>TS z>MTXq6cwsbZL48cCzX0;tm8~QE9Yt)?hPA9LPEUVem zB<=eV2@P{$VU61-04e>pz8u$`;CSTNaF|(f+{v2?5=M2u4;xJPzJ~sx=VkaAJ`8pT z$wMsl8YJ``rzZ+RT?Yk+9SO=b8jT+4h#Ajsh&Efd53iN1{JB#l%o6n(iO}#y0*3*+Z(-Xv%(s#H?nlMI2&C}fNgs<_#q4LzZyotKDlsuzyf?e zrUrLHEmID`4!EF{cQwnaD$RR2G*`Sp{>2VUIb)pq9U%!T#b-C;X={@yo)}a_{f!owK?-tu;sX)qj z(CjVCn^wXleYgnK*w}^gB*!OF=U$SAN)s^4RtB8L6&s(<##0grgFi2eyB*#C+2YK$ z(Vge{Rtx@gwq8VuiRX3etdY+SBVARU6hx6xd!y~4n8~YkMdo!z#IL&v>k<4hcuB(u z%-VJZMSgljORIlwR1?zb*5dpS9_c{cwQl=GUVk9HDjdEO<~3T_op3nmH{AFhsSmX9 z9cV88W>Bf-b^W(_xjp1u&WB@*GMALaI$WR2TvXG#Kk8g>xP6N-g*newje+IcWeXEC zJ~D4O1u=c}9$C9pBpeudBh!#9d%r?{7NvFXVx;L&mMSsHQT;A9?UG0kVW&h_D0|U#Hv;TR96iRhw34elU6ju8luhxxY2R$f{Gp)U( z%`}TN)hslzF-SW4y*Yh&AGN)+to=jB=Ss!=;f_<2^z`Y=5c==INOH(UsdxMkbR?&R zyNK)-Bh!oTo?g;PMZi7xlihP>T`Kquib|J#{G!%F*getufsz^oeG~H182%x9A&}|V zUbBWt#4Jt2((EEqdR$6Vr;}C+Z)-xQ&Ppj!oKS!<-oB~_=v+^ub1oxU}X7eiMDGonRUkfRN)^M1j0|e}ucp^$g z);L;O`=NmpV7>upYhdQ#Gsxzw{8E2}$ry?!2b(4|1sqclcSgWif%_+YcwKhS zd45}CN$6gwumqG&GA^L}F#9Y1TGH;~S;VK#0fb7;!6#WqbSvi9x1BA*4DfE4gqM9= zFIN6yWrInp#$qM+4$JoJ6Q_kn7;DadzEpm2&F?1dyS*_jmXT8q71dRNulGvv2bR@?>pK^Ib*nv@B zGmRxlHnwh@?6p7&=^JO*LxK+XWDeW;c%*#U{!6t^kjQ^a0>$%-2x5Z&sPHv=`KD`6 zU{~7X<1iLsPy4R$Q>$M+oLP}bBqKk!l_VPbOrbXFi|z|rZ9!-HD+#&W5zK)KNb{tf zd8Gg@cra9uu>#Yn-!<{_9ta72C&ubQTJ=eeN>;DFFX$Ue46eWXwP`kjXmLEIkfYX0 zzerHbj#BTPjFA$uZezZ7_O`x)X^T_EkvPm>qa{7BoabPA6@<~9R6h=VF4{s1o$_&b z8q<`-i#&g*|6HgQH{67}w{53Vqb}r?4nbJXKwO2Dh+{sV9;%TkO_Lw9C5wyWknvaZ sY0>C&7|^R22@O;;77(I($mgW3&V16kzj&ShNyF*qr}zII$&J200cb3{Gynhq literal 0 HcmV?d00001 diff --git a/docs/site/index.html b/docs/site/index.html index cc1d0c4d..f4b25b06 100644 --- a/docs/site/index.html +++ b/docs/site/index.html @@ -1,97 +1,186 @@ - - - Green Unicorn - Welcome - - - -

- - -
-

Quick Start

-
-$ sudo easy_install virtualenv
-$ mkdir ~/environments/
-$ virtualenv ~/environments/tutorial/
-$ cd ~/environments/tutorial/
-$ ls
-bin  include  lib
-$ source bin/activate
-(tutorial) $ ./bin/easy_install gunicorn
-(tutorial) $ mkdir myapp
-(tutorial) $ cd myapp/
-(tutorial) $ vi myapp.py
-(tutorial) $ cat myapp.py
-
-def app(environ, start_response):
-    data = "Hello, World!\n"
-    start_response("200 OK", [
-        ("Content-Type", "text/plain"),
-        ("Content-Length", str(len(data)))
-    ])
-    return iter([data])
-
-(tutorial) $ ../bin/gunicorn -w 4 myapp:app
-2010-06-05 23:27:07 [16800] [INFO] Arbiter booted
-2010-06-05 23:27:07 [16800] [INFO] Listening at: http://127.0.0.1:8000
-2010-06-05 23:27:07 [16801] [INFO] Worker spawned (pid: 16801)
-2010-06-05 23:27:07 [16802] [INFO] Worker spawned (pid: 16802)
-2010-06-05 23:27:07 [16803] [INFO] Worker spawned (pid: 16803)
-2010-06-05 23:27:07 [16804] [INFO] Worker spawned (pid: 16804)
-
-
-
-

About

-

- Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's - a pre-fork worker model ported from Ruby's - Unicorn project. The - Gunicorn server is broadly compatible with various web frameworks, - simply implemented, light on server resources, and fairly speedy. -

-
-
-

Features

-
    -
  • Natively supports WSGI, Django, and Paster
  • -
  • Automatic worker process management
  • -
  • Simple Python configuration
  • -
  • Multiple worker configurations
  • -
  • Various server hooks for extensibility
  • -
  • Compatible with Python 2.x >= 2.5
  • -
-
-
-

Version 0.14.6 / 2012-07-26

-
    -
  • fix gevent &amp; subproces
  • -
  • fix request line length check
  • -
  • fix keepalive = 0
  • -
  • fix tornado worker
  • -
-
-
-