wsgi.py 2.1 KB

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