Apache 2.4 + PHP-FPM + ProxyPassMatch

31

Niedawno zainstalowałem Apache 2.4 na moim komputerze lokalnym, wraz z PHP 5.4.8, używając PHP-FPM.

Wszystko poszło dość płynnie (po chwili ...), ale nadal występuje dziwny błąd:

Skonfigurowałem Apache dla PHP-FPM w następujący sposób:

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "/Users/apfelbox/WebServer"
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1
</VirtualHost>

Działa, na przykład, jeśli zadzwonię http://localhost/info.php, otrzymam prawidłowy phpinfo()(to tylko plik testowy).

Jeśli jednak wywołam katalog, otrzymam 404 z treścią File not found.i dziennikiem błędów:

[Tue Nov 20 21:27:25.191625 2012] [proxy_fcgi:error] [pid 28997] [client ::1:57204] AH01071: Got error 'Primary script unknown\n'

Aktualizacja

Próbowałem teraz wykonać proxy z mod_rewrite:

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "/Users/apfelbox/WebServer"

    RewriteEngine on    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>

Ale problem polega na tym, że zawsze przekierowuje, ponieważ http://localhost/automatycznie http://localhost/index.phpjest wymagane, z powodu

DirectoryIndex index.php index.html

Aktualizacja 2

Ok, więc myślę, że „może najpierw sprawdź, czy jest plik, który należy przekazać proxy:

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "/Users/apfelbox/WebServer"

    RewriteEngine on    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>

Teraz kompletne przepisywanie już nie działa ...

Aktualizacja 3

Teraz mam to rozwiązanie:

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "/Users/apfelbox/WebServer"

    RewriteEngine on    
    RewriteCond /Users/apfelbox/WebServer/%{REQUEST_FILENAME} -f
    RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>

Najpierw sprawdź, czy istnieje plik do przekazania do PHP-FPM (z pełną i bezwzględną ścieżką), a następnie przeredaguj.

To nie działa, gdy używasz przepisywania adresów URL w podkatalogu, a także nie działa w przypadku adresów URL typu http://localhost/index.php/test/ So z powrotem do kwadratu.


Jakieś pomysły?

apfelbox
źródło

Odpowiedzi:

34

Po wielu godzinach przeszukiwania i czytania dokumentacji Apache wpadłem na rozwiązanie, które pozwala korzystać z puli, a także pozwala na działanie dyrektywy Rewrite w .htaccess, nawet jeśli adres URL zawiera pliki .php.

<VirtualHost ...>

 ...

 # This is to forward all PHP to php-fpm.
 <FilesMatch \.php$>
   SetHandler "proxy:unix:/path/to/socket.sock|fcgi://unique-domain-name-string/"
 </FilesMatch>

 # Set some proxy properties (the string "unique-domain-name-string" should match
 # the one set in the FilesMatch directive.
 <Proxy fcgi://unique-domain-name-string>
   ProxySet connectiontimeout=5 timeout=240
 </Proxy>

 # If the php file doesn't exist, disable the proxy handler.
 # This will allow .htaccess rewrite rules to work and 
 # the client will see the default 404 page of Apache
 RewriteCond %{REQUEST_FILENAME} \.php$
 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
 RewriteRule (.*) - [H=text/html]

</VirtualHost>

Zgodnie z dokumentacją Apache parametr proxy SetHandler wymaga serwera HTTP Apache 2.4.10.

Mam nadzieję, że to rozwiązanie również ci pomoże.

FrancescoA
źródło
2
To zdecydowanie odpowiedź na 2015 rok, wszystko inne tutaj jest badziewiem dla nowoczesnej konfiguracji (powiedzmy, że Debian stabilny)
Dmitri DB
1
Uderzam głową o ścianę na ten sam problem od dłuższego czasu i mam bardzo podobną konfigurację do twojej. Czy mógłbyś opublikować swoje .htaccess Przepisz dyrektywy? Z tego, co rozumiem, wszystko w tej odpowiedzi jest tylko tym, co masz w pliku httpd.d / site.conf.
David W
1
W tej chwili używanie tej RewriteRule wydaje się dość niebezpieczne, ponieważ może ujawnić config.php pliki w zwykły sposób, jeśli znajdują się one w katalogach Alias, a zatem nie istnieją w% {DOCUMENT_ROOT} /% {REQUEST_URI}.
Zulakis,
1
Niesamowite 9 linii kodu. To święty Graal i jedyna rzecz, która działa dla mnie w 100%. Po prostu: jeśli zmieniasz rozwiązanie za pomocą LocationMatch, nie musisz dołączać bezwzględnej ścieżki pliku do adresu URL fcgi. Włącz proxy i przepisz logowanie do apache, aby na to uważać.
Phil
1
+1, ponieważ ten post, w przeciwieństwie do wszystkich innych zasobów, które widziałem, pomógł mi zrozumieć, co powinien reprezentować „unikatowy ciąg nazwy domeny”.
trzy
10

Wczoraj również natknąłem się na ten problem - Apache 2.4 przeniósł się z Debiana / eksperymentalnego do Debiana / niestabilnego, zmuszając mnie do radzenia sobie z tymi nowymi sprawami; oczywiście nie na naszych serwerach produkcyjnych;).

Po przeczytaniu czegoś, co wydaje się być milionami witryn, dokumentów Apache, raportów o błędach i wyników debugowania w dzienniku błędów, w końcu udało mi się go uruchomić. Nie, jeszcze nie ma wsparcia dla FPM z gniazdami . Domyślna konfiguracja Debiana używa już gniazd, więc użytkownicy Debiana również będą musieli to zmienić.

Oto, co działa dla strony CakePHP i PHPMyAdmin (ten drugi wymaga trochę konfiguracji, jeśli używasz pakietów Debiana), więc mogę potwierdzić, że mod_rewritenadal działa zgodnie z oczekiwaniami, aby zrobić fantazyjne przepisywanie adresów URL.

Zauważ DirectoryIndex index.php, że może to być powód, dla którego żadna z twoich konfiguracji nie działała dla „folderów” (przynajmniej to tutaj nie działało).

Nadal dostaję File not found.katalogi, ale tylko wtedy, gdy nie ma pliku indeksu, można go przeanalizować. Chciałbym się tego także pozbyć, ale na razie nie jest to tak ważne.


<VirtualHost *:80>
    ServerName site.localhost

    DocumentRoot /your/site/webroot
    <Directory />
            Options FollowSymlinks
            DirectoryIndex index.php
            AllowOverride All
            Require all granted
    </Directory>

    <LocationMatch "^(.*\.php)$">
            ProxyPass fcgi://127.0.0.1:9000/your/site/webroot
    </LocationMatch>

    LogLevel debug
    ErrorLog /your/site/logs/error.log
    CustomLog /your/site/logs/access.log combined
</VirtualHost>

Powyższy vhost działa doskonale z .htaccess w katalogu głównym w następujący sposób:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

Nie do końca rozumiem, co masz na myśli URL rewriting inside a subdirectory(przepisuję tylko do pliku root.php roota).


(Och, musisz się upewnić, że Xdebug nie będzie w konflikcie z FPM w twoim systemie, po wyjęciu z pudełka chcą używać tych samych portów).

Alex
źródło
To dobre rozwiązanie, ale niestety to podejście nie działa, gdy adresy URL zawierające .php muszą zostać przepisane, np. Dla wielu witryn WordPress. /ms_blog_1/wp-admin/load-scripts.php?blah=blah
Phil
Dla mnie po prostu dodanie przesłonięcia DirectoryIndex index.htmlw vhostie, o którym mowa, naprawiło to. Jeśli tak DirectoryIndex index.php, wydaje się, że inne pliki PHP kończą się błędem „Nie znaleziono pliku” i „Podstawowy skrypt nieznany”. W moim przypadku mam index.htmlplik php test.php.
geerlingguy
4

Wszystko, co musisz zrobić, to ustawić:

 ProxyErrorOverride on

I nie zapomnij ustawić strony klienta przez:

ErrorDocument 404 /path/to/error_page_file    
Shiqi Zhong
źródło
2

Oto co mam. Wygląda na to, że działa OK. Umieszczam Drupala w podkatalogu, a jego przepisywanie działa, indeksy katalogów i PATH_INFO.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} ^/((.*\.php)(/.*)?)$
RewriteCond %2 -f
RewriteRule . fcgi://127.0.0.1:9000/%1 [L,P]
RewriteOptions Inherit

Próbowałem zrobić coś takiego bez przepisywania („Jeśli” i tak dalej), ale nie mogłem nic zrobić.

EDYCJA: Pamiętaj, że jeśli zaimplementujesz to jako dostawca hostingu współdzielonego, może to być problem z bezpieczeństwem. Pozwoliłoby to użytkownikom przekazywać skrypty PHP do dowolnego serwera proxy fcgi. Jeśli miałbyś oddzielną pulę dla każdego użytkownika, pozwoliłoby to na podniesienie uprawnień do ataków.

RockinRoel
źródło
2

Jeszcze inne rozwiązanie (wymaga Apache> = 2.4.10) - Wewnątrz vhosta:

# define worker
<Proxy "unix:/var/run/php5-fpm-wp.bbox.nuxwin.com.sock|fcgi://domain.tld" retry=0>
    ProxySet connectiontimeout=5 timeout=7200
</Proxy>

<If "%{REQUEST_FILENAME} =~ /\.php$/ && -f %{REQUEST_FILENAME}">
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    SetHandler proxy:fcgi://domain.tld
</If>

Zatem tutaj program obsługi fcgi dla PHP zostanie ustawiony tylko wtedy, gdy plik istnieje i jeśli jego nazwa jest zgodna z rozszerzeniem PHP.

BTW: Dla tych, którzy mieliby pomysł ustawić ProxyErrorOverride na On , pamiętaj, że to naprawdę zły pomysł. Stosowanie tej dyrektywy nie jest pozbawione jakichkolwiek problemów. Na przykład, każda aplikacja PHP wysyłająca kod HTTP, taka jak 503, doprowadziłaby do nieoczekiwanego wyniku. Domyślna obsługa błędów byłaby zaangażowana w każdym przypadku, a dla aplikacji PHP, które zapewniają API, jest to naprawdę złe zachowanie.

Nuxwin
źródło
Niestety nadal występował błąd „AH01071: Wystąpił błąd„ Podstawowy skrypt nieznany \ n ”” przy użyciu tego rozwiązania.
klor
1

Najlepszym sposobem na rozwiązanie tego problemu jest włączenie dzienników debugowania dla mod_proxy i mod_rewrite i php-fpm. W Apache 2.4 możesz teraz włączać dzienniki debugowania tylko dla określonych modułów. http://httpd.apache.org/docs/current/mod/core.html#loglevel Konfiguracja na moduł i na katalog jest dostępna w serwerze Apache HTTP Server 2.3.6 i nowszych

Może masz podwójne cięcie na katalogi?

Oto, czego używam i działa dobrze:

<LocationMatch ^(.*\.php)$>
  ProxyPass fcgi://127.0.0.1:9000/home/DOMAINUSER/public_html$1
</LocationMatch>
Troseman
źródło
1

Jedną z rzeczy, na które natrafiłem podczas rozwiązywania tego problemu, jest to, że jeśli użyjesz kombinacji:

chroot = /path/to/site
chdir = /

W konfiguracji puli fpm nie podawaj pełnej ścieżki do ProxyPassdyrektywy.

ProxyPass fcgi://127.0.0.1:9020/$1

Ale-TYLKO- jeśli pula w tym porcie jest chrootowana.

cienki lód
źródło
1

Nie jestem pewien, czy problem jest związany, ale znalazłem tu częściowo działające rozwiązanie:

https://stackoverflow.com/questions/44054617/mod-rewrite-in-2-4-25-triggering-fcgi-primary-script-unknown-error-in-php-fpm

Sztuką wydaje się być dodanie? char w .htaccess RewriteRule, np. używając:

RewriteRule ^(.*)$ index.php?/$1 [L,NS]

zamiast:

RewriteRule ^(.*)$ index.php/$1 [L,NS]

Źródłem problemu wydaje się być zmiana w mod_rewrite Apache 2.4.25. Użyłem poziomu śledzenia Apache trace1, aby zaobserwować „pętlę”, która przekazuje 1 $ do php-fpm po przejściu index.php / 1 $. 1 USD generuje błąd „AH01071: Wystąpił błąd„ Podstawowy skrypt nieznany \ n ””.

Mam nadzieję, że ten mały smakołyk pomoże komuś rozwiązać jego problemy.

Biapy
źródło
0

mam błąd również po przejściu na php-fpm + apache 2.4.6 dla instancji drupal

ale używam mod zdarzenia mpm

po prostu włóż

DirectoryIndex index.php pracuje dla mnie

wtedy moje ustawienia Vhosta wyglądają jak poniżej

<VirtualHost *:8080>
  ServerAdmin webmaster@localhost
  ServerName sever.com
  DocumentRoot /var/www/html/webroot
    ErrorLog logs/web-error_log
    CustomLog logs/web-access_log common
<IfModule mpm_event_module>
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/webroot/$1
</IfModule>
  <Directory /var/www/html/webroot>
     Options FollowSymlinks
     DirectoryIndex index.php
     AllowOverride All
     Require all granted
  </Directory>
</VirtualHost>

dzięki

nie ma potrzeby zmiany domyślnego pliku .htaccess drupala

uszczelnianie
źródło
[Śr 25 kwietnia 01: 41: 31.526781 2018] [proxy_fcgi: błąd] [pid 2012: tid 140181155772160] (70007) Upłynął limit czasu: [klient 127.0.0.1:60308] AH01075: Błąd wysyłania żądania do:, strona odsyłająca: www / admin / raporty
sealionking
0

Te same problemy występują na moim serwerze (doker Centos 7.3.16). Po śledzeniu dziennika php-fpm znalazłem brak sys lib. WARNING: [pool www] child 15081 said into stderr: "php-fpm: pool www: symbol lookup error: /lib64/libnsssysinit.so: undefined symbol: PR_GetEnvSecure" następnie ponownie uruchamiam nspr, działa. Jeśli nie możesz znaleźć rozwiązań po wypróbowaniu jakichkolwiek metod, możesz spróbować. yum -y install/reinstall nspr

cytrynowy
źródło
0

Działa to z Wordpress 5.1.1 i nowszymi wraz z PHP 7.3, FastCGI, proxy, a także MariaDB / MySQL. Sprawdzone dwukrotnie na moich serwerach. Działa jak marzenie.

Najpierw na CentOS / Fedora / Red Hat

sudo yum remove php*
sudo yum --enablerepo=extras install epel-release
sudo yum install php-fpm php-mysql php-gd php-imap php-mbstring 
sudo grep -E '(proxy.so|fcgi)' /etc/httpd/conf.modules.d/00-proxy.conf
sudo mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf_bak

Edytuj ten plik:

sudo nano /etc/php-fpm.d/www.conf

Wklej to:

[www]

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9000
listen = /run/php-fcgi.sock

sudo ll /run/php-fcgi.sock

Powinien dać srw-rw-rw-.

Lub jak skonfigurować na Debian / Ubuntu

Seminarium:

źródło: https://emi.is/?page=articles&article=php-7-installation-and-configuration-for-apache-2.4-using-php-fpm-(debian,-repository)


sudo apt purge 'php*' or sudo apt-get purge 'php*'
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt install php7.3 php7.3-fpm php-mysql php-mbstring php-gd php-imap libapache2-mod-security2 modsecurity-crs
systemctl status php7.3-fpm
systemctl stop php7.3-fpm.service

sudo a2dismod php7.0 php7.1 php7.2 mpm_event mpm_worker
sudo a2enmod mpm_prefork
sudo a2enmod php7.3
sudo systemctl restart apache2 (httpd in CentOS)

Problem polega na tym, że php 7.3 z repozytorium Ondrej działa tylko w trybie mpm_prefork. Ma git repo, więc możesz go znaleźć w sieci i zapytać, czy zrobi php 7.3 dla mpm_worker i mpm_event. Pozostała część konfiguracji dystrybucji rodziny Debiana znajduje się poniżej:


sudo apt --assume-yes install php7.3-fpm
sudo systemctl stop php7.3-fpm.service
sudo rm /var/log/php7.0-fpm.log
sudo mkdir /var/log/php7.3-fpm/
sudo touch /var/log/php7.3-fpm/error.log
sudo mkdir /var/log/php7.3/
sudo touch /var/log/php7.3/error.log
sudo mkdir /var/tmp/php7.3/
sudo > /etc/php/7.3/fpm/php.ini
sudo > /etc/php/7.3/fpm/php-fpm.conf
sudo rm /etc/php/7.3/fpm/pool.d/www.conf
sudo touch /etc/php/7.3/fpm/pool.d/example.com.conf
sudo useradd --comment "PHP" --shell "/usr/sbin/nologin" --system --user-group php

sudo nano /etc/php/7.3/fpm/php.ini

pasta


[PHP]
date.timezone = Europe/Prague
display_errors = Off
error_log = /var/log/php7.3/error.log
error_reporting = 32767
log_errors = On
register_argc_argv = Off
session.gc_probability = 0
short_open_tag = Off
upload_tmp_dir = /var/tmp/php7.3/

sudo nano /etc/php/7.3/fpm/php-fpm.conf

pasta


[global]
error_log = /var/log/php7.3-fpm/error.log
include = /etc/php/7.3/fpm/pool.d/*.conf

sudo nano /etc/php/7.3/fpm/pool.d/example.com.conf

pasta


[example.com]
group = php
listen = 127.0.0.1:9000
pm = ondemand
pm.max_children = 5
pm.max_requests = 200
pm.process_idle_timeout = 10s
user = php

sudo nano /etc/logrotate.d/php7.3-fpm

skopiuj to do pliku txt:

/var/log/php7.3-fpm.log {
    rotate 12
    weekly
    missingok
    notifempty
    compress
    delaycompress
    postrotate
            /usr/lib/php/php7.3-fpm-reopenlogs
    endscript
}

usuń go, a następnie wklej to zamiast wyżej:

/var/log/php7.3/*.log /var/log/php7.3-fpm/*.log
{
copytruncate
maxage 365
missingok
monthly
notifempty
rotate 12
}

Dodaj dyrektywę

sudo nano /etc/apache2/sites-available/example.com.conf


<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias example.com
    ServerAdmin [email protected]
    DocumentRoot /var/www/html/example.com/public_html
    DirectoryIndex index.php index.htm index.html index.xht index.xhtml
    LogLevel info warn
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <FilesMatch "^\.ht">
    Require all denied
    </FilesMatch>

    <files readme.html>
    order allow,deny
    deny from all
    </files>

    RewriteEngine on
    RewriteCond %{SERVER_NAME} =example.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/example.com/public_html

    <Directory /var/www/html/example.com/public_html>
        Options Indexes FollowSymLinks Includes IncludesNOEXEC SymLinksIfOwnerMatch
        AllowOverride None
    </Directory>
</VirtualHost>

Następnie włącz witrynę:

sudo a2ensite /etc/apache2/sites-available/example.com.conf

Następna edycja strony SSL (W tym przypadku certbot z Let's Encrypt został zainstalowany i skonfigurowany wcześniej na początku konfiguracji certyfikatu SSL).

sudo nano /etc/apache2/sites-available/example.com-le-ssl.conf

<IfModule mod_ssl.c>
    #headers for security man in the middle attack find how to enable this mod in Google
    LoadModule headers_module modules/mod_headers.so
    <VirtualHost *:443>
        Header always set Strict-Transport-Security "max-age=15768000"
        SSLEngine On
        ServerName example.com
        ServerAdmin [email protected]
        DocumentRoot /var/www/html/example.com/public_html
        <Directory /var/www/html/example.com/public_html>
        Options Indexes FollowSymLinks Includes IncludesNOEXEC SymLinksIfOwnerMatch
        AllowOverride All
        Require all granted
        DirectoryIndex index.php
        RewriteEngine On
         <FilesMatch ^/(.*\.php(/.*)?)$>
           SetHandler "fcgi://example.com:9000/var/www/html/example.com/public_html"
          </FilesMatch>
        </Directory>
    # Log file locations
    #LogLevel info ssl:warn
    LogLevel debug
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # modern configuration
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    #SSLCipherSuite HIGH:!aNULL:!MD5
    SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM$
    SSLHonorCipherOrder on
    SSLCompression off
    SSLSessionTickets off

    <FilesMatch "^\.ht">
    Require all denied
    </FilesMatch>

    <files readme.html>
       order allow,deny
       deny from all
    </files>

</VirtualHost>
    #Stapling OCSP for Let's Encrypt certs.
    SSLUseStapling          on
    SSLStaplingResponderTimeout     5
    SSLStaplingReturnResponderErrors        off
    SSLStaplingCache        shmcb:/var/run/ocsp(128000)
</IfModule>

sudo a2enmod proxy proxy_fcgi setenvif
sudo systemctl reload apache2.service
sudo chown --recursive root:adm /etc/php/
sudo chmod --recursive 0770 /etc/php/
sudo chown --recursive php:adm /var/log/php7.3/
sudo chown --recursive php:adm /var/log/php7.3-fpm/
sudo chmod --recursive 0770 /var/log/php7.3/
sudo chmod --recursive 0770 /var/log/php7.3-fpm/
sudo chown --recursive php:php /var/tmp/php7.3/
sudo chmod --recursive 0770 /var/tmp/php7.3/
sudo a2enconf php7.3-fpm
sudo systemctl enable php7.3-fpm.service
sudo systemctl start php7.3-fpm.service

Pamiętaj, aby dodać port 9000 do zapory ogniowej w Debian / Ubuntu

sudo ufw allow 9000/tcp
sudo ufw status

Na CentoOS / Fedora / Red Hat

sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
sudo firewall-cmd --state 
Gall Anonim
źródło