PHP loyihani serverga joylashtirish (deploy)

Kod ishlayapti — endi uni internetga chiqarish kerak. Ishlab chiqish kompyuteri bilan haqiqiy server o’rtasidagi farqlar ko’p xatoga sabab bo’ladi.

Ikki muhit

Muhitni ajratish

.env fayli orqali:

APP_MUHIT=production
APP_DEBUG=false
DB_HOST=localhost
DB_NAME=learncode
DB_PAROL=maxfiy
<?php
require __DIR__ . "/../vendor/autoload.php";

$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));
$dotenv->load();

$debug = filter_var($_ENV["APP_DEBUG"] ?? "false", FILTER_VALIDATE_BOOL);

if ($debug) {
    ini_set("display_errors", "1");
    error_reporting(E_ALL);
} else {
    ini_set("display_errors", "0");
    ini_set("log_errors", "1");
    ini_set("error_log", dirname(__DIR__) . "/jurnal/xatolar.log");
    error_reporting(E_ALL);
}
PHP

Papka tuzilishi

/var/www/loyiha/
├── public/          ← server FAQAT shu papkani ko'rsatadi
│   ├── index.php
│   └── assets/
├── src/
├── korinishlar/
├── jurnal/          ← yozish huquqi kerak
├── yuklanmalar/     ← yozish huquqi kerak
├── vendor/
├── .env             ← INTERNETGA CHIQMASIN
└── composer.json

Nginx uchun:

server {
    listen 443 ssl;
    server_name sayt.uz;
    root /var/www/loyiha/public;    # public/ ga ishora

    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Yashirin fayllarni bloklash
    location ~ /\. {
        deny all;
    }
}

Huquqlar

# Egasi — web server foydalanuvchisi
sudo chown -R www-data:www-data /var/www/loyiha

# Kod: o'qish; papkalar: kirish
sudo find /var/www/loyiha -type f -exec chmod 644 {} \;
sudo find /var/www/loyiha -type d -exec chmod 755 {} \;

# Faqat shu ikkitasiga yozish huquqi
sudo chmod -R 775 /var/www/loyiha/jurnal
sudo chmod -R 775 /var/www/loyiha/yuklanmalar

# .env — faqat egasi o'qiydi
sudo chmod 600 /var/www/loyiha/.env

php.ini sozlamalari

; Xatolar
display_errors = Off
log_errors = On
error_log = /var/www/loyiha/jurnal/php-xatolar.log

; Xavfsizlik
expose_php = Off                  ; PHP versiyasini yashirish

; Yuklash
upload_max_filesize = 5M
post_max_size = 8M
max_file_uploads = 10

; Vaqt va xotira
max_execution_time = 30
memory_limit = 256M

; Sessiya
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Lax
session.use_strict_mode = 1

; Tezlik
opcache.enable = 1
opcache.memory_consumption = 128
opcache.validate_timestamps = 0   ; ishlab chiqarishda

Deploy qadamlari

# 1. Kodni olish
cd /var/www/loyiha
git pull origin main

# 2. Bog'liqliklar — ishlab chiqarish rejimida
composer install --no-dev --optimize-autoloader

# 3. Baza migratsiyasi
php migratsiya.php

# 4. Keshni tozalash
php artisan cache:clear    # Laravel bo'lsa
# yoki
sudo service php8.3-fpm reload

# 5. Huquqlarni tiklash
sudo chown -R www-data:www-data jurnal yuklanmalar
Bayroq Nima qiladi
--no-dev PHPUnit kabi ishlab chiqish paketlarini o’rnatmaydi
--optimize-autoloader Klass xaritasini oldindan tuzadi (tezroq)

Jurnal

PHP

Amalda monolog/monolog paketi ishlatiladi — u fayl, Telegram, Sentry va boshqa joylarga yozishni tayyor beradi.

Sog’liq tekshiruvi

<?php
// public/salomatlik.php
header("Content-Type: application/json");

$holat = ["holat" => "ok", "vaqt" => date("c")];

try {
    $pdo->query("SELECT 1");
    $holat["baza"] = "ok";
} catch (PDOException) {
    $holat["holat"] = "xato";
    $holat["baza"] = "ulanmadi";
    http_response_code(503);
}

$holat["yozish"] = is_writable(__DIR__ . "/../jurnal") ? "ok" : "xato";

echo json_encode($holat);

Kuzatuv tizimi shu manzilni tekshirib turadi va muammo bo’lsa xabar beradi.

Zaxira nusxa

Tekshiruv ro’yxati

Xavfsizlik:

  • Hujjat ildizi public/ ga ishora qiladimi?
  • .env va vendor/ manzil orqali ochilmaydimi?
  • display_errors = Off mi?
  • Sayt HTTPS dami (sertifikat avtomatik yangilanadimi)?
  • Sessiya cookie sozlamalari qo’yilganmi?
  • composer audit toza chiqadimi?

Ishlash:

  • composer install --no-dev --optimize-autoloader bajarilganmi?
  • OPcache yoqilganmi?
  • Jurnal yoziladigan joyi bormi va u aylantiriladi (rotate)mi?
  • Zaxira sozlanganmi va tiklash sinalganmi?
  • Sog’liq tekshiruvi manzili bormi?
  • PHP versiyasi qo’llab-quvvatlanadiganmi?

Amaliy mashq

  1. .env fayl yasab, APP_DEBUG bo’yicha xato rejimini almashtiring;
  2. muhitga qarab sozlama qaytaradigan funksiya yozing;
  3. daraja bilan ishlaydigan jurnal klassini yozing;
  4. sog’liq tekshiruvi manzilini yasang;
  5. public/ ni hujjat ildizi qilib sozlang;
  6. huquqlarni 755/644 qilib qo’ying, yozish papkasiga 775.

Qisqacha xulosa

  • Kod bir xil, farq faqat sozlamada (.env).
  • Ishlab chiqarishda display_errors = Off, lekin jurnal yoqiq.
  • Hujjat ildizi — public/; .env internetga chiqmasin.
  • Huquqlar 755/644; 777 hech qachon.
  • Serverda composer install --no-dev --optimize-autoloader.
  • OPcache tezlikni bir necha barobar oshiradi.
  • Jurnalga maxfiy ma’lumot yozilmaydi.
  • Zaxira bo’lsin va uni tiklash sinalgan bo’lsin.

Keyingi darsda yakuniy loyiha — o’rganilganlarni birga qo’llaymiz.

Bu dars foydali bo'ldimi?

marta ko'rildi