wsgi.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import multiprocessing
  2. import yaml
  3. from os import environ, path
  4. import gunicorn.app.base
  5. from server import fcrepo
  6. default_config_dir = '{}/etc.defaults'.format(
  7. path.dirname(path.abspath(__file__)))
  8. config_dir = environ.get('FCREPO_CONFIG_DIR', default_config_dir)
  9. config_file = '{}/gunicorn.yml'.format(config_dir)
  10. with open(config_file, 'r') as fh:
  11. config = yaml.load(fh, yaml.SafeLoader)
  12. listen_addr = config.get('listen_addr', '0.0.0.0')
  13. listen_port = config.get('listen_port', 8000)
  14. preload_app = config.get('preload_app', True)
  15. app_mode = config.get('app_mode', 'prod')
  16. data_dir = path.realpath(config.get('data_dir'))
  17. def default_workers():
  18. return (multiprocessing.cpu_count() * 2) + 1
  19. options = {
  20. 'bind': '{}:{}'.format(listen_addr, listen_port),
  21. 'workers': config.get('workers', default_workers()),
  22. 'worker_class': config.get('worker_class', 'gevent'),
  23. 'max_requests': config.get('max_requests', 512),
  24. 'user': config.get('user'),
  25. 'group': config.get('group'),
  26. 'raw_env': 'APP_MODE={}'.format(app_mode),
  27. 'preload_app': preload_app,
  28. 'daemon': app_mode=='prod',
  29. 'reload': app_mode=='dev' and not preload_app,
  30. 'pidfile': '{}/run/fcrepo.pid'.format(data_dir),
  31. 'accesslog': '{}/log/gunicorn-access.log'.format(data_dir),
  32. 'errorlog': '{}/log/gunicorn-error.log'.format(data_dir),
  33. }
  34. class WsgiApp(gunicorn.app.base.BaseApplication):
  35. def __init__(self, app, options={}):
  36. self.options = options
  37. self.application = app
  38. super(WsgiApp, self).__init__()
  39. def load_config(self):
  40. for key, value in self.options.items():
  41. self.cfg.set(key.lower(), value)
  42. def load(self):
  43. return self.application
  44. def run():
  45. WsgiApp(fcrepo, options).run()
  46. if __name__ == '__main__':
  47. run()