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? -
.envvavendor/manzil orqali ochilmaydimi? -
display_errors = Offmi? - Sayt HTTPS dami (sertifikat avtomatik yangilanadimi)?
- Sessiya cookie sozlamalari qo’yilganmi?
-
composer audittoza chiqadimi?
Ishlash:
-
composer install --no-dev --optimize-autoloaderbajarilganmi? - 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
.envfayl yasab,APP_DEBUGbo’yicha xato rejimini almashtiring;- muhitga qarab sozlama qaytaradigan funksiya yozing;
- daraja bilan ishlaydigan jurnal klassini yozing;
- sog’liq tekshiruvi manzilini yasang;
public/ni hujjat ildizi qilib sozlang;- huquqlarni
755/644qilib qo’ying, yozish papkasiga775.
Qisqacha xulosa
- Kod bir xil, farq faqat sozlamada (
.env). - Ishlab chiqarishda
display_errors = Off, lekin jurnal yoqiq. - Hujjat ildizi —
public/;.envinternetga chiqmasin. - Huquqlar
755/644;777hech 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.