| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 | .. _searxng uwsgi:=====uWSGI=====.. sidebar:: further reading   - `systemd.unit`_   - `uWSGI Emperor`_.. contents:: Contents   :depth: 2   :local:   :backlinks: entry.. _systemd.unit: https://www.freedesktop.org/software/systemd/man/systemd.unit.html.. _One service per app in systemd:    https://uwsgi-docs.readthedocs.io/en/latest/Systemd.html#one-service-per-app-in-systemd.. _uWSGI Emperor:    https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html.. _uwsgi ini file:   https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#ini-files.. _systemd unit template:   http://0pointer.de/blog/projects/instances.htmlOrigin uWSGI============.. _Tyrant mode:   https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html#tyrant-mode-secure-multi-user-hostingHow uWSGI is implemented by distributors varies. The uWSGI project itselfrecommends two methods:1. `systemd.unit`_ template file as described here `One service per app in systemd`_:  There is one `systemd unit template`_ on the system installed and one `uwsgi  ini file`_ per uWSGI-app placed at dedicated locations.  Take archlinux and a  ``searxng.ini`` as example::    systemd template unit: /usr/lib/systemd/system/uwsgi@.service            contains: [Service]                      ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/%I.ini    SearXNG application:   /etc/uwsgi/searxng.ini            links to: /etc/uwsgi/apps-available/searxng.ini  The SearXNG app (template ``/etc/uwsgi/%I.ini``) can be maintained as known  from common systemd units:  .. code:: sh     $ systemctl enable  uwsgi@searxng     $ systemctl start   uwsgi@searxng     $ systemctl restart uwsgi@searxng     $ systemctl stop    uwsgi@searxng2. The `uWSGI Emperor`_ which fits for maintaining a large range of uwsgi   apps and there is a `Tyrant mode`_ to secure multi-user hosting.  The Emperor mode is a special uWSGI instance that will monitor specific  events.  The Emperor mode (the service) is started by a (common, not template)  systemd unit.  The Emperor service will scan specific directories for `uwsgi ini file`_\s  (also know as *vassals*).  If a *vassal* is added, removed or the timestamp is  modified, a corresponding action takes place: a new uWSGI instance is started,  reload or stopped.  Take Fedora and a ``searxng.ini`` as example::    to install & start SearXNG instance create --> /etc/uwsgi.d/searxng.ini    to reload the instance edit timestamp      --> touch /etc/uwsgi.d/searxng.ini    to stop instance remove ini                --> rm /etc/uwsgi.d/searxng.iniDistributors============The `uWSGI Emperor`_ mode and `systemd unit template`_ is what the distributorsmostly offer their users, even if they differ in the way they implement bothmodes and their defaults.  Another point they might differ in is the packaging ofplugins (if so, compare :ref:`install packages`) and what the default pythoninterpreter is (python2 vs. python3).While archlinux does not start a uWSGI service by default, Fedora (RHEL) startsa Emperor in `Tyrant mode`_ by default (you should have read :ref:`uWSGI Tyrantmode pitfalls`).  Worth to know; debian (ubuntu) follow a complete differentapproach, read see :ref:`Debian's uWSGI layout`... _Debian's uWSGI layout:Debian's uWSGI layout---------------------.. _uwsgi.README.Debian:    https://salsa.debian.org/uwsgi-team/uwsgi/-/raw/debian/latest/debian/uwsgi.README.DebianBe aware, Debian's uWSGI layout is quite different from the standard uWSGIconfiguration.  Your are familiar with :ref:`Debian's Apache layout`? .. they do asimilar thing for the uWSGI infrastructure. The folders are::    /etc/uwsgi/apps-available/    /etc/uwsgi/apps-enabled/The `uwsgi ini file`_ is enabled by a symbolic link::  ln -s /etc/uwsgi/apps-available/searxng.ini /etc/uwsgi/apps-enabled/More details can be found in the uwsgi.README.Debian_(``/usr/share/doc/uwsgi/README.Debian.gz``).  Some commands you should know onDebian:.. code:: none    Commands recognized by init.d script    ====================================    You can issue to init.d script following commands:      * start        | starts daemon      * stop         | stops daemon      * reload       | sends to daemon SIGHUP signal      * force-reload | sends to daemon SIGTERM signal      * restart      | issues 'stop', then 'start' commands      * status       | shows status of daemon instance (running/not running)    'status' command must be issued with exactly one argument: '<confname>'.    Controlling specific instances of uWSGI    =======================================    You could control specific instance(s) by issuing:        SYSTEMCTL_SKIP_REDIRECT=1 service uwsgi <command> <confname> <confname>...    where:      * <command> is one of 'start', 'stop' etc.      * <confname> is the name of configuration file (without extension)    For example, this is how instance for /etc/uwsgi/apps-enabled/hello.xml is    started:        SYSTEMCTL_SKIP_REDIRECT=1 service uwsgi start hello.. _uWSGI maintenance:uWSGI maintenance=================.. tabs::   .. group-tab:: Ubuntu / debian      .. kernel-include:: $DOCS_BUILD/includes/searxng.rst         :start-after: START searxng uwsgi-description ubuntu-20.04         :end-before: END searxng uwsgi-description ubuntu-20.04   .. hotfix: a bug group-tab need this comment   .. group-tab:: Arch Linux      .. kernel-include:: $DOCS_BUILD/includes/searxng.rst         :start-after: START searxng uwsgi-description arch         :end-before: END searxng uwsgi-description arch   .. hotfix: a bug group-tab need this comment   .. group-tab::  Fedora / RHEL      .. kernel-include:: $DOCS_BUILD/includes/searxng.rst         :start-after: START searxng uwsgi-description fedora         :end-before: END searxng uwsgi-description fedora.. _uwsgi setup:uWSGI setup===========Create the configuration ini-file according to your distribution and restart theuwsgi application.  As shown below, the :ref:`installation scripts` installs bydefault:- a uWSGI setup that listens on a socket and- enables :ref:`cache busting <static_use_hash>`... tabs::   .. group-tab:: Ubuntu / debian      .. kernel-include:: $DOCS_BUILD/includes/searxng.rst         :start-after: START searxng uwsgi-appini ubuntu-20.04         :end-before: END searxng uwsgi-appini ubuntu-20.04   .. hotfix: a bug group-tab need this comment   .. group-tab:: Arch Linux      .. kernel-include:: $DOCS_BUILD/includes/searxng.rst         :start-after: START searxng uwsgi-appini arch         :end-before: END searxng uwsgi-appini arch   .. hotfix: a bug group-tab need this comment   .. group-tab::  Fedora / RHEL      .. kernel-include:: $DOCS_BUILD/includes/searxng.rst         :start-after: START searxng uwsgi-appini fedora         :end-before: END searxng uwsgi-appini fedora.. _uWSGI Tyrant mode pitfalls:Pitfalls of the Tyrant mode===========================The implementation of the process owners and groups in the `Tyrant mode`_ issomewhat unusual and requires special consideration.  In `Tyrant mode`_ mode theEmperor will run the vassal using the UID/GID of the vassal configuration file(user and group of the app ``.ini`` file)... _#2099@uWSGI: https://github.com/unbit/uwsgi/issues/2099.. _#752@uWSGI: https://github.com/unbit/uwsgi/pull/752.. _#2425uWSGI: https://github.com/unbit/uwsgi/issues/2425Without option ``emperor-tyrant-initgroups=true`` in ``/etc/uwsgi.ini`` theprocess won't get the additional groups, but this option is not available in2.0.x branch (see `#2099@uWSGI`_) the feature `#752@uWSGI`_ has been merged (onOct. 2014) to the master branch of uWSGI but had never been released; the lastmajor release is from Dec. 2013, since the there had been only bugfix releases(see `#2425uWSGI`_). To shorten up:  **In Tyrant mode, there is no way to get additional groups, and the uWSGI  process misses additional permissions that may be needed.**For example on Fedora (RHEL): If you try to install a redis DB with socketcommunication and you want to connect to it from the SearXNG uWSGI, you will see a*Permission denied* in the log of your instance::  ERROR:searx.shared.redis: [searxng (993)] can't connect redis DB ...  ERROR:searx.shared.redis:   Error 13 connecting to unix socket: /usr/local/searxng-redis/run/redis.sock. Permission denied.  ERROR:searx.plugins.limiter: init limiter DB failed!!!Even if your *searxng* user of the uWSGI process is added to additional groupsto give access to the socket from the redis DB::  $ groups searxng  searxng : searxng searxng-redisTo see the effective groups of the uwsgi process, you have to look at the statusof the process, by example::  $ ps -aef | grep '/usr/sbin/uwsgi --ini searxng.ini'  searxng       93      92  0 12:43 ?        00:00:00 /usr/sbin/uwsgi --ini searxng.ini  searxng      186      93  0 12:44 ?        00:00:01 /usr/sbin/uwsgi --ini searxng.iniHere you can see that the additional "Groups" of PID 186 are unset (missing gidof ``searxng-redis``)::  $ cat /proc/186/task/186/status  ...  Uid:      993     993     993     993  Gid:      993     993     993     993  FDSize:   128  Groups:  ...
 |