Posodobitve kritičnih PHP ranljivosti (CVE-2026-109618, CVE-2026-109619). VEČ O TEM

✕
Košarica (0)
  • Vaša košarica je trenutno prazna

NEOSERV BLOG

Nasveti, vodiči in koristne informacije o domenah, gostovanju, SSL certifikatih, e-pošti, spletni optimizaciji in varnosti na spletu.

Python aplikacija na spletnem gostovanju
Kategorija: Triki in nasveti
Objavljeno:

Z orodji umetne inteligence, kot so ChatGPT, Claude in Cursor, je razvoj spletnih aplikacij danes dostopnejši kot kdaj koli prej. Tudi brez poglobljenega programerskega znanja lahko hitro ustvarite delujočo aplikacijo ali API. Toda razvoj je le prvi korak – aplikacijo je treba nato še pravilno nastaviti in objaviti na spletnem gostovanju.

V tem prispevku boste izvedeli, kako na našem spletnem gostovanju postaviti Python aplikacijo, ki uporablja ogrodje Flask, Django ali FastAPI. Vse spodnje korake smo preizkusili na naših strežnikih.

Kazalo

Kateri paketi podpirajo Python?

Python aplikacije lahko poganjate na paketih Zeleni, Modri in Rdeči, na paketih Reseller gostovanja ter na vseh paketih Turbo gostovanja. Paketa Beli in Oranžni Python aplikacij ne podpirata.

Ali vaš paket podpira Python, najhitreje preverite v nadzorni plošči cPanel: v sekciji Software mora biti ikona Setup Python App. Če je ni, lahko paket kadar koli nadgradite, doplačate pa le razliko v ceni.

cPanel (Jupiter) - Setup Python App

Na voljo so različice Pythona od 2.7 do 3.13. Za nove projekte priporočamo Python 3.11 ali 3.12.

Kako Python aplikacija teče na našem strežniku?

To je pomembno razumeti, saj pojasni večino težav, na katere naletijo razvijalci:

  • Aplikacija ne teče ves čas kot na vašem računalniku (python main.py ali uvicorn main:app). Spletni strežnik LiteSpeed jo zažene ob prvem obisku.
  • Aplikacijo naloži iz datoteke passenger_wsgi.py, nato pa za obdelavo zahtevkov ustvari več delovnih procesov (ang. worker processes).
  • Komunikacija poteka prek standarda WSGI. Flask in Django ga uporabljata privzeto, za FastAPI pa potrebujete majhen vmesnik (več o tem spodaj).
  • Če aplikacija nekaj minut ne prejme zahtevka, se zaustavi in tako ne porablja sredstev. Prvi naslednji zahtevek jo samodejno znova zažene, kar traja približno 0,5–1,5 sekunde. Vsi nadaljnji zahtevki so spet hitri.

1. korak: ustvarite aplikacijo v cPanel

1. V cPanel kliknite Setup Python App in nato CREATE APPLICATION.

2. Izpolnite polja:

  • Python version: npr. 3.11,
  • Application root: mapa z vašo aplikacijo, npr. mojaapi (nahaja se v domači mapi, izven public_html, zato datoteke niso javno dostopne),
  • Application URL: naslov, na katerem bo aplikacija dostopna, npr. vasadomena.si/api ali poddomena,
  • Application startup file: pustite privzeto (passenger_wsgi.py).
  • Application Entry point: pustite privzeto (application).

3. Kliknite CREATE.

cPanel ustvari mapo aplikacije, lastno virtualno okolje (ang. virtual environment) in testno datoteko passenger_wsgi.py. Ko odprete URL aplikacije, se izpiše »It works!«.

Na vrhu strani aplikacije je prikazan ukaz za vstop v virtualno okolje, na primer:

source /home/uporabnik/virtualenv/mojaapi/3.11/bin/activate && cd /home/uporabnik/mojaapi

2. korak: naložite kodo in namestite pakete

Datoteke aplikacije naložite v mapo aplikacije (prek upravitelja datotek, FTP ali Git). Ne nalagajte mape venv, .venv ali __pycache__, ker se virtualno okolje ustvari na strežniku.

Pakete namestite prek SSH ali aplikacije Terminal v cPanel:

source /home/uporabnik/virtualenv/mojaapi/3.11/bin/activate
cd ~/mojaapi
pip install --upgrade pip
pip install -r requirements.txt

Datoteko requirements.txt na svojem računalniku ustvarite z ukazom pip freeze > requirements.txt. Pakete lahko namestite tudi v vmesniku Setup Python App (polje »Configuration files«, gumb »Run Pip Install«).

Za povezavo z bazo MySQL/MariaDB uporabite paket PyMySQL namesto mysqlclient. Več v prispevku Python aplikacija in MySQL.

Virtualno okolje šteje v omejitev števila datotek paketa. Ne nameščajte paketov, ki jih aplikacija ne potrebuje.

3. korak: povežite aplikacijo z datoteko passenger_wsgi.py

V datoteki passenger_wsgi.py določite, kako spletni strežnik zažene vašo aplikacijo. Potrebna koda je odvisna od uporabljenega ogrodja. Spodaj so primeri za Flask, Django in FastAPI.

Flask

from app import app as application

app je ime datoteke app.py, v kateri je app = Flask(__name__).

Django

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mojprojekt.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

V settings.py dodajte svojo domeno v ALLOWED_HOSTS, nastavite DEBUG = False, statične datoteke pa z ukazom python manage.py collectstatic zberite v mapo znotraj public_html.

FastAPI (in druge ASGI aplikacije, npr. Starlette, Quart)

FastAPI je ASGI aplikacija, zato potrebuje vmesnik a2wsgi. Namestite ga s pip install a2wsgi.

Pomembno: na spletu boste pogosto našli kratko različico application = ASGIMiddleware(app). Na naših strežnikih (in na vseh strežnikih LiteSpeed) se pri tej različici zahtevki zataknejo.

Uporabite spodnjo kodo, ki vmesnik ustvari ločeno za vsak delovni proces:

import os, sys
sys.path.insert(0, os.path.dirname(__file__))

from a2wsgi import ASGIMiddleware
from main import app  # FastAPI aplikacija iz datoteke main.py

_mw = {"pid": None, "app": None}

def application(environ, start_response):
    # en vmesnik na delovni proces
    if _mw["pid"] != os.getpid():
        _mw["pid"] = os.getpid()
        _mw["app"] = ASGIMiddleware(app)
    return _mw["app"](environ, start_response)

Po vsaki spremembi kode aplikacijo ponovno zaženite (gumb RESTART v Setup Python App ali ukaz touch ~/mojaapi/tmp/restart.txt).

Kaj deluje in kaj ne pri FastAPI prek a2wsgi?

Funkcija Deluje?
REST API, async funkcije, Pydantic, /docs da
Povezava z bazo (SQLAlchemy, SQLite, MySQL) da
@app.on_event("startup") in lifespan ne, se ne izvedeta
BackgroundTasks delno: izvedejo se, a uporabnik čaka na odgovor, dokler se ne končajo
WebSocket ne
Pretakanje odgovora in SSE z zamikom (odgovor se pošilja v kosih po približno 8 KB)

Za večino AI generiranih aplikacij (REST API + baza + frontend) je to povsem dovolj. Kaj storiti, ko potrebujete WebSocket, SSE ali opravila v ozadju, si preberite v prispevku Python aplikacija z WebSocket, SSE in uvicorn.

Omejitve paketov pri uporabi Pythona

Python aplikacija deli sredstva vašega paketa z vsem ostalim na njem (spletna stran, e-pošta, cron opravila). Za paket Zeleni veljajo naslednje omejitve:

Sredstvo Zeleni Kaj to pomeni za Python?
Procesor 1 jedro Jedro si delijo vse aplikacije in PHP strani na paketu.
Pomnilnik 1 GB En delovni proces FastAPI aplikacije porabi približno 50 MB. Proces, ki preseže omejitev, sistem ustavi.
Procesi in niti 100 Šteje vsak proces in vsaka nit. Knjižnice, kot je numpy, lahko brez nastavitve ustvarijo več deset niti (glejte spodaj).
Sočasni zahtevki (EP) 20 Omejitev velja za vse spletne strani in aplikacije na paketu.

Vse našteto si delijo vsi procesi na paketu: delovni procesi aplikacije, PM2, cron opravila in tudi vaša SSH seja. Ko je omejitev dosežena, aplikacija vrača napako 503, prijava prek SSH pa ne uspe, dokler se procesi ne sprostijo.

Omejitve ostalih paketov najdete v pogojih uporabe. Paketi Turbo gostovanja imajo bistveno več sredstev.

Najpogostejše napake in rešitve

▪️ Stran se nalaga v nedogled ali vrne napako 503. Pri FastAPI uporabljate kratko različico ASGIMiddleware(app). Uporabite zgornjo kodo. Drugi možni vzrok je, da koda ob zagonu zažene nit, zanko dogodkov ali strežnik. Če ima vaš main.py vrstico uvicorn.run(app, ...), mora biti znotraj bloka if __name__ == "__main__":. Enako velja za threading.Thread(...).start() in podobno kodo ob uvozu.

▪️ Aplikacija vrača 503, v stderr.log pa je napaka pthread_create failed ali Resource temporarily unavailable. Knjižnice numpy, pandas, scikit-learn in podobne ob uvozu privzeto ustvarijo eno nit za vsako jedro strežnika, teh pa je veliko več, kot jih dovoljuje vaš paket (npr. Zeleni: 100 procesov in niti skupaj). V Setup Python App → Environment variables dodajte spremenljivki OPENBLAS_NUM_THREADS = 1 in OMP_NUM_THREADS = 1 ter aplikacijo ponovno zaženite. V ukazni vrstici, cron opravilih in PM2 pred zagonom nastavite export OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1.

▪️ Aplikacija na podpoti (npr. vasadomena.si/api) deluje samo na osnovnem naslovu, podstrani pa vrnejo napako 404 vaše WordPress strani. Če na isti domeni teče WordPress ali drug CMS, njegova pravila v .htaccess prestrežejo zahtevke. V datoteko .htaccess v mapi aplikacije (npr. public_html/api/.htaccess) dodajte vrstico RewriteEngine On, in sicer izven blokov, ki jih je ustvaril CloudLinux.

▪️ Proces se nenadoma ustavi brez sporočila o napaki. Aplikacija je presegla pomnilnik paketa (npr. 1 GB pri paketu Zeleni) in sistem jo je ustavil. Ne nalagajte velikih podatkov v pomnilnik naenkrat, obdelujte jih po delih.

▪️ Napaka 500 ali »Internal Server Error«. Poglejte datoteko stderr.log v mapi aplikacije. Najpogosteje manjka paket (ModuleNotFoundError) ali je napačna pot do datoteke.

▪️ Tabele v bazi se ne ustvarijo. Ker se startup in lifespan ne izvedeta, pokličite Base.metadata.create_all(engine) neposredno ob uvozu, na primer na koncu datoteke database.py.

▪️ Sprememba kode se ne pozna. Aplikacijo ponovno zaženite.

▪️ Prvi obisk po daljšem premoru je počasen. To je pričakovano: aplikacija se po nekaj minutah neaktivnosti zaustavi in ob naslednjem obisku znova zažene (približno 0,5–1,5 s).

▪️ Pri večjem številu sočasnih obiskov se pojavi napaka 503. Aplikacija privzeto obdeluje do 8 zahtevkov hkrati. Če ima vaša aplikacija počasne zahtevke, jih optimizirajte. Za zelo obremenjene aplikacije priporočamo paket Turbo gostovanja ali VPS strežnik.

Ko z AI asistentom pripravljate aplikacijo za objavo na našem gostovanju, mu lahko podate naslednje navodilo:

Aplikacijo bom objavil na deljenem gostovanju cPanel s CloudLinux "Setup Python App" in spletnim strežnikom LiteSpeed (WSGI, datoteka passenger_wsgi.py).

- Ne zaganjaj uvicorn/gunicorn ob uvozu, uvicorn.run naj bo samo pod if __name__ == "__main__".

- FastAPI poveži z a2wsgi, vmesnik ustvari lenobno za vsak proces (os.getpid()).

- Ne uporabljaj lifespan/startup dogodkov, inicializacijo izvedi ob uvozu.

- Ob uvozu ne zaganjaj niti, zank dogodkov ali povezav v bazo.

- Za MySQL uporabi PyMySQL, gesla beri iz .env datoteke.

- Frontend naj kliče API z relativno potjo (npr. /api/...), ne localhost:8000.

- Pri numpy/pandas nastavi OPENBLAS_NUM_THREADS=1 (paket ima omejeno število niti).

- Pripravi requirements.txt.

Katero gostovanje izbrati za Python aplikacijo?

Spletno gostovanje je odlično za spletne aplikacije, API-je in manjše projekte.

Če vaša aplikacija potrebuje proces, ki teče ves čas (npr. uvicorn za WebSocket ali delavca v ozadju), ali več sočasnih obiskov, priporočamo Turbo gostovanje. Paketi imajo namreč bistveno več sredstev (npr. paket Turbo T1: 4 procesorska jedra, 6 GB pomnilnika in 100 sočasnih procesov; paket Zeleni: 1 procesorsko jedro, 1 GB pomnilnika in 20 sočasnih procesov), okolje pa ostane enako enostavno za upravljanje.

VPS gostovanje priporočamo, ko potrebujete:

  • stalno obremenitev (obdelava podatkov, analitika, AI modeli),
  • veliko sočasnih uporabnikov ali dolgotrajne povezave (npr. klepetalnice),
  • lastne sistemske pakete ali poljubne nastavitve strežnika,
  • razvojno ali testno okolje.

Na VPS strežniku dobite poln (root) dostop in sistem v celoti prilagodite svoji aplikaciji.

KOMENTARJI

KOMENTIRAJTE OBJAVO

(obvezno)
(obvezno, e-poštni naslov bo skrit)
(neobvezno)
Varnostno vprašanje, ki potrdi, da ste resnična oseba.