Browse code

Keystone support deploy in uwsgi

Keystone is going to remove support for eventlet. Rather than only
have one way to run keystone (in Apache Httpd with mod_wsgi), we
should continue to gate on multiple wsgi containers to ensure that
keystone remains container-agnostic. The suggested alternative
container is uwsgi.

To run keystone in uwsgi rather than httpd or eventlet, set the
following env var in local.conf:

KEYSTONE_DEPLOY=uwsgi

There's a lot of options to uwsgi. Here's some protips:
http://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html

Change-Id: If3b49879ce5181c16f0f0ab0db12fa55fe810a41

Brant Knudson authored on 2015/12/15 06:32:05
Showing 2 changed files
... ...
@@ -1428,14 +1428,17 @@ function run_process {
1428 1428
     local service=$1
1429 1429
     local command="$2"
1430 1430
     local group=$3
1431
+    local subservice=$4
1432
+
1433
+    local name=${subservice:-$service}
1431 1434
 
1432 1435
     time_start "run_process"
1433 1436
     if is_service_enabled $service; then
1434 1437
         if [[ "$USE_SCREEN" = "True" ]]; then
1435
-            screen_process "$service" "$command" "$group"
1438
+            screen_process "$name" "$command" "$group"
1436 1439
         else
1437 1440
             # Spawn directly without screen
1438
-            _run_process "$service" "$command" "$group" &
1441
+            _run_process "$name" "$command" "$group" &
1439 1442
         fi
1440 1443
     fi
1441 1444
     time_stop "run_process"
... ...
@@ -62,6 +62,7 @@ KEYSTONE_USE_MOD_WSGI=${KEYSTONE_USE_MOD_WSGI:-${ENABLE_HTTPD_MOD_WSGI_SERVICES}
62 62
 # KEYSTONE_DEPLOY defines how keystone is deployed, allowed values:
63 63
 # - mod_wsgi : Run keystone under Apache HTTPd mod_wsgi
64 64
 # - eventlet : Run keystone-all
65
+# - uwsgi : Run keystone under uwsgi
65 66
 if [ -z "$KEYSTONE_DEPLOY" ]; then
66 67
     if [ -z "$KEYSTONE_USE_MOD_WSGI" ]; then
67 68
         KEYSTONE_DEPLOY=mod_wsgi
... ...
@@ -244,16 +245,15 @@ function configure_keystone {
244 244
     # Register SSL certificates if provided
245 245
     if is_ssl_enabled_service key; then
246 246
         ensure_certificates KEYSTONE
247
-
248
-        iniset $KEYSTONE_CONF eventlet_server_ssl enable True
249
-        iniset $KEYSTONE_CONF eventlet_server_ssl certfile $KEYSTONE_SSL_CERT
250
-        iniset $KEYSTONE_CONF eventlet_server_ssl keyfile $KEYSTONE_SSL_KEY
251 247
     fi
252 248
 
249
+    local service_port=$KEYSTONE_SERVICE_PORT
250
+    local auth_port=$KEYSTONE_AUTH_PORT
251
+
253 252
     if is_service_enabled tls-proxy; then
254 253
         # Set the service ports for a proxy to take the originals
255
-        iniset $KEYSTONE_CONF eventlet_server public_port $KEYSTONE_SERVICE_PORT_INT
256
-        iniset $KEYSTONE_CONF eventlet_server admin_port $KEYSTONE_AUTH_PORT_INT
254
+        service_port=$KEYSTONE_SERVICE_PORT_INT
255
+        auth_port=$KEYSTONE_AUTH_PORT_INT
257 256
 
258 257
         iniset $KEYSTONE_CONF DEFAULT public_endpoint $KEYSTONE_SERVICE_URI
259 258
         iniset $KEYSTONE_CONF DEFAULT admin_endpoint $KEYSTONE_AUTH_URI
... ...
@@ -273,7 +273,7 @@ function configure_keystone {
273 273
     fi
274 274
 
275 275
     # Format logging
276
-    if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ] && [ "$KEYSTONE_DEPLOY" == "eventlet" ]  ; then
276
+    if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ] && [ "$KEYSTONE_DEPLOY" != "mod_wsgi" ] ; then
277 277
         setup_colorized_logging $KEYSTONE_CONF DEFAULT
278 278
     fi
279 279
 
... ...
@@ -285,7 +285,58 @@ function configure_keystone {
285 285
         iniset $KEYSTONE_CONF DEFAULT logging_debug_format_suffix "%(asctime)s.%(msecs)03d %(funcName)s %(pathname)s:%(lineno)d"
286 286
         iniset $KEYSTONE_CONF DEFAULT logging_exception_prefix "%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s"
287 287
         _config_keystone_apache_wsgi
288
-    else
288
+    elif [ "$KEYSTONE_DEPLOY" == "uwsgi" ]; then
289
+        # iniset creates these files when it's called if they don't exist.
290
+        KEYSTONE_PUBLIC_UWSGI_FILE=$KEYSTONE_CONF_DIR/keystone-uwsgi-public.ini
291
+        KEYSTONE_ADMIN_UWSGI_FILE=$KEYSTONE_CONF_DIR/keystone-uwsgi-admin.ini
292
+
293
+        rm -f "$KEYSTONE_PUBLIC_UWSGI_FILE"
294
+        rm -f "$KEYSTONE_ADMIN_UWSGI_FILE"
295
+
296
+        if is_ssl_enabled_service key; then
297
+            iniset "$KEYSTONE_PUBLIC_UWSGI_FILE" uwsgi https $KEYSTONE_SERVICE_HOST:$service_port,$KEYSTONE_SSL_CERT,$KEYSTONE_SSL_KEY
298
+            iniset "$KEYSTONE_ADMIN_UWSGI_FILE" uwsgi https $KEYSTONE_ADMIN_BIND_HOST:$auth_port,$KEYSTONE_SSL_CERT,$KEYSTONE_SSL_KEY
299
+        else
300
+            iniset "$KEYSTONE_PUBLIC_UWSGI_FILE" uwsgi http $KEYSTONE_SERVICE_HOST:$service_port
301
+            iniset "$KEYSTONE_ADMIN_UWSGI_FILE" uwsgi http $KEYSTONE_ADMIN_BIND_HOST:$auth_port
302
+        fi
303
+
304
+        iniset "$KEYSTONE_PUBLIC_UWSGI_FILE" uwsgi wsgi-file "$KEYSTONE_BIN_DIR/keystone-wsgi-public"
305
+        # This is running standalone
306
+        iniset "$KEYSTONE_PUBLIC_UWSGI_FILE" uwsgi master true
307
+        iniset "$KEYSTONE_PUBLIC_UWSGI_FILE" uwsgi threads $(nproc)
308
+        iniset "$KEYSTONE_PUBLIC_UWSGI_FILE" uwsgi enable-threads true
309
+        iniset "$KEYSTONE_PUBLIC_UWSGI_FILE" uwsgi plugins python
310
+        # uwsgi recommends this to prevent thundering herd on accept.
311
+        iniset "$KEYSTONE_PUBLIC_UWSGI_FILE" uwsgi thunder-lock true
312
+        # Override the default size for headers from the 4k default.
313
+        iniset "$KEYSTONE_PUBLIC_UWSGI_FILE" uwsgi buffer-size 65535
314
+        # Make sure the client doesn't try to re-use the connection.
315
+        iniset "$KEYSTONE_PUBLIC_UWSGI_FILE" uwsgi add-header "Connection: close"
316
+
317
+        iniset "$KEYSTONE_ADMIN_UWSGI_FILE" uwsgi wsgi-file "$KEYSTONE_BIN_DIR/keystone-wsgi-admin"
318
+        # This is running standalone
319
+        iniset "$KEYSTONE_ADMIN_UWSGI_FILE" uwsgi master true
320
+        iniset "$KEYSTONE_ADMIN_UWSGI_FILE" uwsgi threads $API_WORKERS
321
+        iniset "$KEYSTONE_ADMIN_UWSGI_FILE" uwsgi enable-threads true
322
+        iniset "$KEYSTONE_ADMIN_UWSGI_FILE" uwsgi plugins python
323
+        # uwsgi recommends this to prevent thundering herd on accept.
324
+        iniset "$KEYSTONE_ADMIN_UWSGI_FILE" uwsgi thunder-lock true
325
+        # Override the default size for headers from the 4k default.
326
+        iniset "$KEYSTONE_ADMIN_UWSGI_FILE" uwsgi buffer-size 65535
327
+        # Make sure the client doesn't try to re-use the connection.
328
+        iniset "$KEYSTONE_ADMIN_UWSGI_FILE" uwsgi add-header "Connection: close"
329
+
330
+    else # eventlet
331
+        if is_ssl_enabled_service key; then
332
+            iniset $KEYSTONE_CONF eventlet_server_ssl enable True
333
+            iniset $KEYSTONE_CONF eventlet_server_ssl certfile $KEYSTONE_SSL_CERT
334
+            iniset $KEYSTONE_CONF eventlet_server_ssl keyfile $KEYSTONE_SSL_KEY
335
+        fi
336
+
337
+        iniset $KEYSTONE_CONF eventlet_server public_port $service_port
338
+        iniset $KEYSTONE_CONF eventlet_server admin_port $auth_port
339
+
289 340
         iniset $KEYSTONE_CONF eventlet_server admin_bind_host "$KEYSTONE_ADMIN_BIND_HOST"
290 341
         iniset $KEYSTONE_CONF eventlet_server admin_workers "$API_WORKERS"
291 342
         # Public workers will use the server default, typically number of CPU.
... ...
@@ -530,7 +581,10 @@ function start_keystone {
530 530
         restart_apache_server
531 531
         tail_log key /var/log/$APACHE_NAME/keystone.log
532 532
         tail_log key-access /var/log/$APACHE_NAME/keystone_access.log
533
-    else
533
+    elif [ "$KEYSTONE_DEPLOY" == "uwsgi" ]; then
534
+        run_process key "uwsgi $KEYSTONE_PUBLIC_UWSGI_FILE" "" "key-p"
535
+        run_process key "uwsgi $KEYSTONE_ADMIN_UWSGI_FILE" "" "key-a"
536
+    else # eventlet
534 537
         # Start Keystone in a screen window
535 538
         run_process key "$KEYSTONE_BIN_DIR/keystone-all --config-file $KEYSTONE_CONF"
536 539
     fi