Dreifir forriti í Laravel 7 á Ubuntu og Nginx

Dreifir forriti í Laravel 7 á Ubuntu og Nginx

Ég ákvað að búa til eignasafnið mitt með því að nota Laravel 7. Þannig að aðalsíðan yrði áfangasíða og hægt væri að breyta öllum upplýsingum á henni með því að nota stjórnborðið. Ekki málið. Það kom að dreifingu. Ég fann nokkrar góðar leiðbeiningar um hvernig á að gera þetta á fullgildum server með öllum vandræðum. Ég er ekki mjög sterkur í dreifingu; ég er almennt frekar frammi en fullur stafla. Og ef ég get samt skrifað og prófað í PHP, þá áður en ég stjórna þjóninum osfrv. Ég er ekki orðin fullorðin ennþá. En ég varð að finna út úr því.

Nú förum við í gegnum öll skrefin, byrja með ræsingu í gegnum SSH og endar með vinnusíðunni. Við munum reyna að forðast allar gildrurnar.

Þú gætir fundið svipaðar leiðbeiningar á netinu. Enda fann ég það loksins. Að vísu ekki á einum stað, ekki án aðstoðar StackOverflow, og varla á rússnesku. Ég þjáðist. Þess vegna ákvað ég að einfalda líf þitt.

Við munum gera allt með dropatali á DigitalOcean. Þetta er auðvitað ekki nauðsynlegt; veldu hvaða hýsingu sem er. Þegar þú nærð virkum netþjóni á Ubuntu, komdu aftur. Fyrir þá sem enn ákveða að gera það á DigitalOcean verða fleiri ráð um að setja upp lén. Og $100 tilvísunartengill.

Öll DigitalOcean-sértæk skref verða gefin í neðanmálsgreinum eins og þessum.

Byrjum.

TL;DR (aðeins grunnskipanir)

Búðu til notanda

  • ssh root@[IP-адрес вашего дроплета]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

Bættu SSH við það

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Settu opinbera lykilinn inn
  • chmod 600 ~/.ssh/authorized_keys

Eldveggur

  • sudo ufw allow OpenSSH
  • sudo ufw enable
  • sudo ufw status

Nginx

  • sudo apt update
  • sudo apt install -y nginx
  • sudo ufw allow 'Nginx HTTP'
  • sudo ufw status

MySQL

  • sudo apt install -y mysql-server
  • sudo mysql_secure_installation, NYNNY
  • sudo mysql
  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';
  • SELECT user,authentication_string,plugin,host FROM mysql.user;
  • FLUSH PRIVILEGES;
  • exit

PHP

  • sudo apt update

  • sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https

  • sudo apt-add-repository ppa:ondrej/php

  • sudo apt update

  • 7.3: sudo apt install -y php7.3-fpm php7.3-mysql

  • 7.4: sudo apt install -y php7.4-fpm php7.4-mysql

  • sudo vim /etc/nginx/sites-available/<Ваш домен>

Grunnuppsetning:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name <Ваш домен или IP>;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ .php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }

        location ~ /.ht {
                deny all;
        }
}

Aðeins HTTP uppsetning fyrir Laravel:

server {
    listen 80;
    listen [::]:80;

    root /var/www/html/<Имя проекта>/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name <Ваш домен или IP>;

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

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
        deny all;
    }
}

HTTPS stilling fyrir Laravel:

server {
    listen 80;
    listen [::]:80;

    server_name <Ваш домен> www.<Ваш домен>;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name <Ваш домен> www.<Ваш домен>;
    root /var/www/html/<Имя проекта>/public;

    ssl_certificate /etc/letsencrypt/live/<Ваш домен>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<Ваш домен>/privkey.pem;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php index.html index.htm index.nginx-debian.html;

    charset utf-8;

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

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
            deny all;
    }

    location ~ /.well-known {
            allow all;
    }
}

  • sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • sudo unlink /etc/nginx/sites-enabled/default
  • sudo nginx -t
  • sudo systemctl reload nginx

Laravel

  • 7.3: sudo apt install -y php7.3-mbstring php7.3-xml composer unzip

  • 7.4: sudo apt install -y php7.4-mbstring php7.4-xml composer unzip

  • mysql -u root -p

  • CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • sudo mkdir -p <Имя проекта>

  • sudo chown laravel:laravel <Имя проекта>

  • cd ./<Имя проекта>

  • git clone <ссылка на проект> . / git clone -b <имя ветки> --single-branch <ссылка на проект> .

  • composer install

  • vim .env

APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ваш домен>

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ваш пароль от MySQL>

  • php artisan migrate

  • php artisan key:generate

  • sudo chown -R $USER:www-data storage

  • sudo chown -R $USER:www-data bootstrap/cache

  • chmod -R 775 storage

  • chmod -R 775 bootstrap/cache

HTTPS

  • sudo add-apt-repository ppa:certbot/certbot

  • sudo apt install -y python-certbot-nginx

  • sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>

  • sudo nginx -t

  • sudo ufw allow 'Nginx HTTPS'

  • sudo ufw status

  • sudo systemctl reload nginx

Búðu til dropa á DigitalOcean og skráðu nýjan SSH lykil

Ég trúi því sannarlega að þú munt finna út hvernig á að skrá þig hjá DigitalOcean sjálfur. Það er ekki auðvelt, með fullt af sannprófunum og öðru. Ef þú færð stöðugt netvillu þegar þú staðfestir notkun skjala skaltu reyna að gera allt í gegnum VPN, það ætti að hjálpa.

Í valmyndinni efst, smelltu Búa til->Droplets. Veldu ubuntu.

Um leið og þú skráir þig færðu $100 inn á reikninginn þinn. En ekki láta blekkjast. Þú hefur aðeins 60 daga til að eyða því. Og þetta er mjög lítið. Þú gætir, eins og ég, viljað nota dýrari áætlun, svo að seinna, þegar alvöru peningar byrja að streyma, geturðu skipt yfir í ódýrari. Ég skal segja þér strax að það mun ekki virka. Þú getur aukið það, en þú getur ekki minnkað það. Svona fer það. ég vel Standard->$5.

Ég vel það svæði sem er næst okkur Frankfurt. VPC net->sjálfgefið-fra1

Við munum strax framkvæma auðkenningu í gegnum SSH. Smellur Nýr SSH lykill. Ef þú ert ekki með SSH eru mjög einfaldar leiðbeiningar til hægri. Opnaðu bash terminal og límdu ssh-keygen. Síðan förum við í skrána með almenningslyklinum /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (eða einfaldlega cat ~/.ssh/id_rsa.pub), afritaðu innihaldið og límdu það inn í gluggann til vinstri. Hvaða nafn sem er.

Við komum með hýsingarheiti fyrir dropann.

Ýttu Búðu til dropa

Búðu til nýjan notanda

  • ssh root@[IP-адрес вашего дроплета]
  • Ertu viss um að þú viljir halda áfram að tengjast (já/nei/[fingrafar])? yes
  • Sláðu inn SSH lykilorðið þitt
  • Búðu til notanda lirfa: adduser laravel
  • Sláðu inn lykilorðið þitt og aðrar upplýsingar (ég slá aðeins inn fullt nafn)
  • Bættu notandanum við sudo hópinn: usermod -aG sudo laravel

SSH fyrir nýjan notanda

  • Skiptu yfir í nýja notandann: su laravel

Við framkvæmum allar aðgerðir frekar, þar til í lok greinarinnar, fyrir hönd laravel notandans. Þess vegna, ef þú verður skyndilega truflun, skráðu þig aftur inn og sláðu inn su laravel

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys

Við opnuðum skrána í Vim. Ef þú þekkir það alls ekki geturðu unnið í Nano, rétt þinn.

Helstu Vim skipanir

Til þess að nota Vim ritstjórann í gegnum greinina þarftu bara að vita eftirfarandi.

  • Vim hefur mismunandi stillingar: Venjuleg stilling, þar sem þú slærð inn skipanir og velur stillingar og aðra.
  • Til að fara úr hvaða stillingu sem er og fara aftur í venjulega stillingu, ýttu bara á Esc
  • Færðu þig um: þú getur bara notað örvarnar
  • Hætta án þess að vista <Normal mode>: :q!
  • Hætta og vista <Normal mode>: :wq
  • Skiptu yfir í textainnsláttarstillingu <Normal mode>: i (úr ensku. setja)
  • Við setjum inn opinbera lykilinn okkar (sem við gerðum hér að ofan)
  • Við verndum gegn breytingum: chmod 600 ~/.ssh/authorized_keys

Að setja upp eldvegg

  • Við skulum skoða allar tiltækar stillingar: sudo ufw app list
  • Leyfa OpenSSH (annars mun það læsa okkur): sudo ufw allow OpenSSH
  • Við skulum ræsa eldvegginn: sudo ufw enable, y
  • Við athugum: sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Allt er í lagi.

Að setja upp Nginx

Við uppsetningu verður þú stundum spurður "Ertu viss?" Svaraðu y (jæja, bara ef þú ert viss).

  • sudo apt update
  • sudo apt install nginx

Bætir Nginx við eldveggstillingarnar

  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTP'
  • sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Farðu á IP-inn þinn. Ef allt gengur vel ættirðu að sjá eftirfarandi.

Dreifir forriti í Laravel 7 á Ubuntu og Nginx

Að setja upp MySQL

  • sudo apt install mysql-server
  • Ræsir sjálfvirkt verndarforskrift sudo mysql_secure_installation

Svaraðu spurningunum sem spurt er um. Ef þú veist ekki hverju þú átt að svara, hér eru nokkrar tillögur að valmöguleikum:

  • Staðfesta lykilorð viðbót - N

  • Fjarlægja nafnlausa notendur? — Y

  • Banna rótarinnskráningu fjarstýrt? — N

  • Fjarlægja prófunargagnagrunn og aðgang að honum? — N

  • Endurhlaða forréttindatöflur núna? — Y

  • Við skulum fara í MySQL: sudo mysql

  • Við skulum skoða aðgangsaðferðirnar: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Stilltu lykilorð fyrir rót: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • Við skulum skoða aðgangsaðferðirnar aftur: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Notaðu breytingarnar og farðu úr MySQL: FLUSH PRIVILEGES; и exit

  • Nú, til að skrá þig inn á MySQL þarftu að nota mysql -u root -p og sláðu inn lykilorðið

Að setja upp PHP

Við skulum nota geymslu frá þriðja aðila frá Ondrej Surý

  • sudo apt update
  • sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https
  • sudo apt-add-repository ppa:ondrej/php
  • sudo apt update

Nú skulum við velja. Fyrir Laravel 7 geturðu valið PHP 7.3 eða 7.4. Eini munurinn verður á tölunum 3 og 4.

  • 7.3: sudo apt install -y php7.3-fpm php7.3-mysql
  • 7.4: sudo apt install -y php7.4-fpm php7.4-mysql

PHP FastCGI Process Manager (fpm) vinnur með PHP beiðnum. mysql, auðvitað, til að vinna með MySQL.

Héðan í frá mun ég gera allt þann 7.4.

Að setja upp Nginx

  • sudo vim /etc/nginx/sites-available/<Ваш домен>

Sláðu inn lénið í stað „<lénsins þíns>“ (til dæmis, mysite.ru) sem þú vilt nota í framtíðinni. Ef þú ert ekki með einn, skrifaðu þá, endurtaktu síðan skrefin í þessum kafla fyrir lénið þitt þegar þú velur það.

Skráðu Eftirfarandi:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name <Ваш домен или IP>;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ .php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }

        location ~ /.ht {
                deny all;
        }
}

Ef þú velur útgáfu 7.3 í staðinn php7.4-fpm.sock skrifa inn php7.4-fpm.sock.

Hlustaðu á port 80 á server_nameþegar við komum að rótarbeiðni /var/www/html taktu vísitöluskrána. Ef eftir server_name Það er eitthvað, við erum að leita að slíkri skrá. Ef við finnum það ekki, þá hentum við út 404. Ef það endar með .php, hlaupa gegn um fpm... Ef það er .ht, banna (403).

  • Gerir tengil frá sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Fjarlægir tengilinn á default: sudo unlink /etc/nginx/sites-enabled/default
  • Leitar að villum: sudo nginx -t
  • Endurræsa: sudo systemctl reload nginx

Athugaðu verkið:

  • sudo vim /var/www/html/info.php
  • Við skrifum: <?php phpinfo();
  • Förum til <Ваш IP>/info.php

Þú ættir að sjá eitthvað á þessa leið:

Dreifir forriti í Laravel 7 á Ubuntu og Nginx

Nú er hægt að eyða þessari skrá: sudo rm /var/www/html/info.php

Settu upp Laravel

  • 7.3: sudo apt install php7.3-mbstring php7.3-xml composer unzip

  • 7.4: sudo apt install php7.4-mbstring php7.4-xml composer unzip

  • Við skulum fara í MySQL: mysql -u root -p

  • Búðu til gagnagrunn með nafninu lirfa: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • Við veitum rótaraðgang að lirfa: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Búðu til möppu fyrir verkefnið: sudo mkdir -p <Имя проекта>

  • Við veitum notandanum lirfa réttindi á verkefninu: sudo chown laravel:laravel <Имя проекта>

Næst þarftu að flytja verkefnið. Til dæmis, klónun frá Github.

  • cd ./<Имя проекта>
  • git clone <ссылка на проект> .

Það er þess virði að íhuga að ef þú vistaðir ekki truflanir skrár (til dæmis frá /public) á Github, þá muntu náttúrulega ekki hafa þá. Til dæmis bjó ég til sérstakan þráð til að leysa þetta deploy, sem ég hef þegar klónað: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Að setja upp ósjálfstæði: composer install
  • Búa til .env: vim .env

Grunnútgáfan af því lítur svona út:

APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ваш домен>

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ваш пароль от MySQL>

Ef þú afritar .env þinn skaltu skipta út APP_ENV fyrir framleiðslu, APP_DEBUG fyrir false og sláðu inn réttar stillingar fyrir MySQL.

  • Flutningur gagnagrunnsins: php artisan migrate
  • Búa til kóðann: php artisan key:generate

Breyting á heimildum:

  • sudo chown -R $USER:www-data storage
  • sudo chown -R $USER:www-data bootstrap/cache
  • chmod -R 775 storage
  • chmod -R 775 bootstrap/cache

Það síðasta sem er eftir er að endurstilla Nginx fyrir Laravel:

sudo vim /etc/nginx/sites-available/<Ваш домен>

server {
    listen 80;
    listen [::]:80;

    root /var/www/html/<Имя проекта>/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name <Ваш домен или IP>;

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

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
        deny all;
    }
}

Eins og síðast, ef þú valdir útgáfu 7.3 í staðinn php7.4-fpm.sock skrifa inn php7.4-fpm.sock.

Að setja upp lén á DigitalOcean

Allt er í rauninni mjög einfalt. Þú kaupir lén (hvar sem er), skiptir yfir í DigitalOcean á Búa til->Lén/DNS... Á sviði Bættu við léni þú slærð inn þetta lén og smellir á bæta við. Farðu síðan í lénsstillingarnar og í reitinn HÚSNEFNI koma inn @. Veldu verkefni og smelltu Búðu til skrá.
Farðu nú á síðuna þar sem þú keyptir lénið, finndu “DNS Servers” þar (eða eitthvað álíka) og sláðu inn DigitalOcean netþjónana (þ.e. ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Nú þarftu að bíða aðeins (eða mikið) þar til þessar stillingar eru samþykktar. Tilbúið!
Eina vandamálið er að síðan þín opnast aðeins sem HTTP. Til að hafa HTTPS skaltu fara í næsta hluta.

Að setja upp HTTPS

Settu upp certbot og sendu því lénið (snið mysite.ru) og lén með www (www.mysite.ru).

  • sudo add-apt-repository ppa:certbot/certbot
  • sudo apt install python-certbot-nginx
  • sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>

Nú þarftu að endurstilla Nginx (ekki gleyma að skipta um gildin þín):

server {
    listen 80;
    listen [::]:80;

    server_name <Ваш домен> www.<Ваш домен>;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name <Ваш домен> www.<Ваш домен>;
    root /var/www/html/<Имя проекта>/public;

    ssl_certificate /etc/letsencrypt/live/<Ваш домен>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<Ваш домен>/privkey.pem;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php index.html index.htm index.nginx-debian.html;

    charset utf-8;

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

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
            deny all;
    }

    location ~ /.well-known {
            allow all;
    }
}

Ég held að þú skiljir nú þegar hverju þarf að breyta fyrir PHP 7.3.

Hér er í raun allt einfalt. Við beinum einfaldlega öllum beiðnum frá HTTP (gátt 80) til HTTPS (gátt 443). Og þar gerum við allt eins og áður, en með dulkóðun.

Allt sem er eftir er að stilla heimildirnar í eldveggnum:

  • sudo nginx -t
  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTPS'
  • sudo ufw status
  • sudo systemctl reload nginx

Nú ætti allt að virka eins og það á að gera.

[Advanced] Að setja upp Node.js

Ef þú þarft skyndilega að keyra npm skipanir beint á þjóninum þarftu að setja upp Node.js.

  • sudo apt update
  • sudo apt install -y nodejs npm
  • nodejs -v

Það er það, ég hætti á þessu stigi. Í grundvallaratriðum er ég sáttur við niðurstöðuna. Kannski mun ég skipta úr DigitalOcean einhvers staðar nær Rússlandi og ódýrara. En þar sem ég var búinn að fara í gegnum allar sannprófunarloturnar á síðunni og gerði allt þar sýndi ég þær með dæmi. Að auki, byrjun $100 þeirra er frábær stökkpallur fyrir þjálfun.

PS Sérstakar þakkir til höfundar þessi kjarni, sem var grundvöllur allra ofangreindra aðgerða. Í sumum tilfellum virkar það ekki fyrir Laravel 7, ég lagaði það.

PPS Ef þú ert yfirmaður verkfræðingur sem hugsar í bash skipunum, vinsamlegast ekki dæma hart. Þér gæti fundist þessi grein vera á lágu stigi, en ég hefði verið fegin að finna eina þegar ég þurfti á henni að halda. Ef það eru tillögur til úrbóta þá er ég alveg til í það.

Heimild: www.habr.com

Bæta við athugasemd