Deze tutorial maakt deel uit van de Build Your Startup With PHP-serie op Envato Tuts +. In deze serie begeleid ik je door een opstart van concept naar realiteit te starten met behulp van mijn Meeting Planner-app als een realistisch voorbeeld. Elke stap die ik doe, zal ik de Meeting Planner-code vrijgeven als open-source voorbeelden waar je van kunt leren. Ik zal ook opstartgerelateerde zakelijke problemen aanpakken zodra deze zich voordoen.
In deze zelfstudie ga ik op zoek naar een ideaal hostingplatform voor Meeting Planner en de initiële configuratie van onze server. Ik begeleid u door het proces terwijl ik de pre-lanceringswebsite naar een betere productieomgeving migreer voor onze aankomende alpha-lancering.
Als u Meeting Planner nog niet hebt uitgeprobeerd, kunt u uw eerste vergadering plannen. Ik neem wel deel aan de opmerkingen hieronder, dus vertel me wat je denkt! Ik ben vooral geïnteresseerd in het voorstellen van functies of onderwerpen voor toekomstige zelfstudies.
Ter herinnering: alle code voor Meeting Planner is geschreven in het Yii2 Framework voor PHP. Als je meer wilt weten over Yii2, bekijk dan onze parallelle serie Programming With Yii2.
Amazon's AWS is voor veel bedrijven de opkomende go-to-oplossing. Wanneer AWS onderuit gaat, nemen ook veel van de bekendste services op het web het over. Maar AWS is ook duur, vaak te complex en wordt gerund door een bedrijf met een geschiedenis van vijandigheid jegens werknemers, vooral de vrouwelijke en magazijnmedewerkers. Bovendien heeft Amazon de snelle overmatige ontwikkeling van mijn woonplaats Seattle op zo'n manier onderdrukt dat de stad de stad voor altijd heeft veranderd, maar niet noodzakelijk voor goed.
Onlangs schreef ik een handleiding voor alternatieven voor Amazon voor cloud computing-services. Er zijn veel concurrenten, niet zo enorm, maar veel beter, beter betaalbaar en gebruiksvriendelijker. Terwijl Meeting Planner groeit, mag ik AWS opnieuw overwegen, maar nu wil ik ergens anders kijken.
Op korte termijn heb ik hoogstens een server of twee lopende web- en databaseservices nodig. Hiervoor werken managed hosting-bedrijven zoals Rackspace, Linode en mijn favoriete Digital Ocean prima.
Voorlopig kan Meeting Planner op één server worden uitgevoerd, maar naarmate het groeit, is het mogelijk dat ik meerdere web- en databaseservers nodig heb. Op basis van mijn ervaring maakt AWS het eenvoudiger om dit te implementeren, maar ervaren systeembeheerders kunnen dit eenvoudig doen met de bovengenoemde cloudproviders.
Deze zelfstudie begeleidt u bij het lanceren van een web- en databaseserver in de Digital Ocean-clouds.
Ik heb een handvol tutorials geschreven over Digital Ocean bij Envato Tuts +, waaronder het gebruik van hun API voor serverconfiguratie. Ik heb onlangs ook geschreven over mijn positieve ervaringen met het Digital Ocean-partnerprogramma. Volledige ontsluiting: desgevraagd leverde Digital Ocean een klein rekeningsaldo op om de druppelkosten voor deze opstartreeks maximaal zes maanden te dekken.
In de afgelopen twee jaar dat ik daar een gebruiker ben, hebben ze de kwaliteit van hun service, gebruikerservaring, ondersteuning en functies voortdurend verhoogd. Al een tijdje is het uiterst zeldzaam om een vertraging of uitval te ervaren, gebruikelijk in de vroege cloud hosting markt.
Laten we beginnen met het configureren van de initiële productieserver voor Meeting Planner.
Digital Ocean-instanties worden druppels genoemd. Ik weet zeker dat ze dachten om ze kikkervisjes of vissen te noemen, maar wij ontwikkelaars vernietigen ze vaak, dus het niet-sentimentele druppel is een betere term.
Van de Droplets menu, zullen we Maak een droplet. Eerst kiezen we Ubuntu 14.04 voor onze afbeelding en de serveroptie $ 10 per maand:
Vervolgens koos ik voor de San Francisco regio omdat het het dichtst bij mij staat:
Ik heb Digital Ocean ook gevraagd om mijn openbare sleutel opnieuw te gebruiken voor het instellen van de login; key-login is veiliger dan wachtwoord-login. Vervolgens koos ik de hostnaam apps.meetingplanner.io voor de server:
Wanneer u klikt creëren, je ziet de druppel worden gevormd:
Zodra het klaar is, krijgt u een IP-adres, waaraan ik meetingplanner.io-domeinrecords toewijs voor de eerste configuratie:
Ik wacht tot later om het root-meetingplanner.io-domein toe te wijzen aan de nieuwe server.
Dit is wat u ziet wanneer u zich de eerste keer aanmeldt bij de server:
$ ssh -i ~ / .ssh / id_lookahead [email protected] U moet uw wachtwoord onmiddellijk wijzigen (root enforced) Welkom bij Ubuntu 14.04.4 LTS (GNU / Linux 3.13.0-85-generic x86_64) * Documentatie: https://help.ubuntu.com/ Systeeminformatie vanaf Woensdag 18 15:59:01 EDT 2016 Systeemvulling: 0.0 Geheugengebruik: 5% Processen: 54 Gebruik van /: 4.2% van 29.40GB Wisselgebruik: 0% Gebruikers ingelogd: 0 Geef een grafiek van deze gegevens en beheer dit systeem op: https://landscape.canonical.com/ 0 pakketten kunnen worden bijgewerkt. 0 updates zijn beveiligingsupdates. De programma's die bij het Ubuntu-systeem zijn inbegrepen, zijn gratis software; de exacte distributievoorwaarden voor elk programma worden beschreven in de afzonderlijke bestanden in / usr / share / doc / * / copyright. Ubuntu wordt geleverd met ABSOLUUT GEEN GARANTIES, voor zover toegestaan door de toepasselijke wetgeving. Veranderen van wachtwoord voor root. (huidig) UNIX-wachtwoord: voer een nieuw UNIX-wachtwoord in: voer het nieuwe UNIX-wachtwoord opnieuw in:
Digital Ocean biedt een breed scala aan handige handleidingen. Ik heb een nieuwe gebruiker gemaakt voor mijn primaire niet-rootaccount en implementatierekeningen met deze uitlegfunctie.
Ik heb ook de SSH-configuratie bewerkt om de rootlogin te verwijderen en de standaard SSH-poort aan te passen vanaf 22.
Vervolgens installeerde ik de typische UAMP-server (Ubuntu, Apache, PHP en MySQL) op de server. Het is mogelijk dat ik zojuist een nieuw kinderletterwoord van LAMP heb gemaakt.
$ sudo apt-get install mysql-server php5-mysql php5 php5-memcached memcached php5-mcrypt Pakketlijsten lezen ... Klaar Gebouw afhankelijkheidsboom Statusinformatie lezen ... Gereed De volgende extra pakketten worden geïnstalleerd: apache2 apache2-bin apache2-data libaio1 libapache2 -mod-php5 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libdbd-mysql-perl libdbi-perl libhtml-template-perl libmemcached10 libmysqlclient18 libterm-readkey-perl mysql-client-5.5 mysql-client-core-5.5 mysql-common mysql -server-5.5 mysql-server-core-5.5 php-pear php5-cli php5-gemeenschappelijke php5-json php5-readline ssl-cert Voorgestelde pakketten: apache2-doc apache2-suexec-pristine apache2-suexec-custom apache2-utils libclone- perl libmldbm-perl libnet-daemon-perl libplrpc-perl libsql-statement-perl libipc-sharedcache-perl libcache-memcached-perl libmemcached tinyca mailx php5-dev php5-user-cache openssl-blacklist De volgende NIEUWE pakketten worden geïnstalleerd: apache2 apache2-bin apache2-data libaio1 libapache2-mod -php5 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libdbd-mysql-perl libdbi-perl libhtml-template-perl libmemcached10 libmysqlclient18 libterm-readkey-perl memcached mysql-client-5.5 mysql-client-core-5.5 mysql-common mysql- server mysql-server-5.5 mysql-server-core-5.5 php-pear php5 php5-cli php5-gemeenschappelijke php5-json php5-memcached php5-mysql php5-readline ssl-cert 0 opgewaardeerd, 31 nieuw geïnstalleerd, 0 om te verwijderen en 0 niet geüpgraded. Noodzaak om 15,7 MB aan archieven te krijgen. Na deze bewerking wordt 126 MB extra schijfruimte gebruikt. Wil je doorgaan? [Y / n] y Ontvang: 1 http://mirrors.digitalocean.com/ubuntu/ trusty / main libaio1 amd64 0.3.109-4 [6.364 B] Get: 2 http://mirrors.digitalocean.com/ubuntu/ trusty / main libapr1 amd64 1.5.0-1 [85.1 kB] ... Module mpm_prefork inschakelen. apache2_switch_mpm Overschakelen naar prefork * Webserver opnieuw opstarten apache2 [OK] apache2_invoke: Module php5 inschakelen * Apache2 webserver opnieuw opstarten [OK] PHp5 instellen (5.5.9 + dfsg-1ubuntu4.16) ... Verwerkingstriggers voor libc-bin (2.19-0ubuntu6 0,7) ...
Vervolgens heb ik mijn standaardtijdzone geconfigureerd. Meeting Planner wordt intern uitgevoerd op Pacific Standard Time (PST). Ik heb bewerkt php.ini:
sudo nano /etc/php5/apache2/php.ini
En ik heb dit toegevoegd:
date.timezone = 'America / Los_Angeles'
Nu is het tijd om onze codebase op de server te krijgen.
Ten eerste heb ik geïnstalleerd git:
sudo apt-get install git
Vervolgens heb ik als gebruiker van mijn code-implementatie een nieuwe SSH-sleutel gemaakt om een beveiligde verbinding tot stand te brengen met GitHub:
ssh-keygen -t rsa -C "[email protected]" Genereren van publiek / privaat rsa-sleutelpaar. Voer een bestand in om de sleutel op te slaan (/home/deploy/.ssh/id_rsa): aangemaakte map '/home/deploy/.ssh'. Voer wachtzin in (leeg voor geen wachtzin): voer dezelfde wachtwoordzin opnieuw in: Uw identificatie is opgeslagen in /home/deploy/.ssh/id_rsa. Uw openbare sleutel is opgeslagen in /home/deploy/.ssh/id_rsa.pub. De vingerafdruk van de toets is: f7: 84: 37: b3: e4: 7b: d3: 9c: 0c: 60: b4: b7: 4c: 86: 53: cb [email protected] De willekeurige afbeelding van de toets is: + - [RSA 2048] ---- + | | | ... | | . =. | | Z A | | + & dd. | | . * X | | + Ooo. | | .OOO | | ... | + ----------------- + deploy @ apps: / var / www $ eval 'ssh-agent -s' Agent pid 7827 deploy @ apps: / var / www $ ssh- add ~ / .ssh / id_rsa Identity added: /home/deploy/.ssh/id_rsa (/home/deploy/.ssh/id_rsa) deploy @ apps: / var / www $ cat < ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDM8JCAg7aPbB7The4Lmk42BpwPv9Eoc/k7As+N7nh5/JUVKK47AjxqvqeHvtntl8vbsaucNmuIM71OzH+36rbypqskfm2bbUk/bJk2qoqZK9V8Qc931Tj5i4IU9t90UOi55vwdZN0/xeEoJtzrerZn9l7xmJX2Ubarb4yKQSlSgiPHYQWYqD7QEGDtE4iUaqwwDWts/u1eajU/I+SubAyxbnT8WwwaqqA2Pm/N7PakKXgQdSquAdjh3mkvYxtL1kyTm/kFRi5tE/K3PIYfh0aLWhNiXEYnh6fQ2iXYRqT40F1IWEHF0Lv1ig5nTgFEUz2xaqzS18JDXw0lpwvZa3Sp [email protected] deploy@apps:/var/www$ ssh -T [email protected] The authenticity of host 'github.com (192.30.252.122)' can't be established. RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'github.com,192.30.252.122' (RSA) to the list of known hosts. Hi newscloud! You've successfully authenticated, but GitHub does not provide shell access.
Je moet ook de sleutel in je Git-accountinstellingen plakken.
Vervolgens heb ik Composer geïnstalleerd:
$ curl -sS https://getcomposer.org/installer | sudo php - --install-dir = / usr / local / bin --filename = composer composer
Ik ben absoluut dol op componist omdat het zoveel tijd bespaart, maar er zijn dagen waarop ik me erger aan het worden, wanneer het ophoudt met werken vanuit het niets, zoals hoe het Yii Framework vereist dat je de installatie installeert FXP / componist-asset-plugin voor juist gebruik:
$ composer global vereist "fxp / composer-asset-plugin: ^ 1.0" $ composer-update
Toegegeven, ik gebruikte GitHub om de nieuwste code te synchroniseren totdat ik me herinnerde dat Yii2 eigenlijk een heleboel bestanden configureert die door GitHub worden genegeerd, inclusief index.php. Er zijn ook lokale sleutelbestanden en geüploade afbeeldingen van gebruikersprofielen. Dus ik heb tar gebruikt om de actieve codebase te comprimeren:
tar czf mp_may2016.tar.gz mp
Vervolgens heb ik SCP gebruikt om de bestanden naar de nieuwe server te verplaatsen en vervolgens heb ik het uitgepakt:
scp -i ~ / .ssh / id_lookahead -P 3327 ~ / mpmigrate / mp_may2016.tar.gz [email protected]: ~ tar -xzf mp_may2016.tar.gz
Uiteindelijk was er ook wat werk in het beoordelen van de lokale databaseknoppen (die ik heb bijgewerkt op de nieuwe server) en het bekijken van mijn bestandsrechten.
Laten we nu de database verplaatsen.
Ten eerste heb ik de bestaande database naar een bestand gedumpt:
$ mysqldump -uroot -p --opt mp> mp_may2016.sql
Daarna heb ik het met scp naar de nieuwe server verplaatst:
$ scp -i ~ / .ssh / id_lookahead -P 22533 [email protected]: ~ / mp_may2016.sql .
Op de nieuwe server heb ik een nieuwe database met nieuwe details gemaakt en een aantal machtigingen voor Apache geconfigureerd:
$ mysql -u root -p Voer wachtwoord in: Welkom bij de MySQL-monitor. Opdrachten eindigen met; of \ g. Uw MySQL-verbindings-id is 43 Serverversie: 5.5.49-0ubuntu0.14.04.1 (Ubuntu) Copyright (c) 2000, 2016, Oracle en / of zijn dochterondernemingen. Alle rechten voorbehouden. Oracle is een gedeponeerd handelsmerk van Oracle Corporation en / of zijn dochterondernemingen. Andere namen kunnen handelsmerken zijn van hun respectieve eigenaars. Typ 'help;' of '\ h' voor hulp. Typ '\ c' om de huidige invoerinstructie te wissen. mysql> maak database mp_database; Query OK, 1 rij beïnvloed (0,00 sec) mysql> verleen alle rechten op mp_database. * NAAR "mp_master" @ "localhost" geïdentificeerd door "xYxYZxZx1a"; Query OK, 0 rijen beïnvloed (0,00 sec) mysql> flush-privileges; Query OK, 0 rijen beïnvloed (0,00 sec) mysql> exit;
Uiteindelijk heb ik het sql-bestand in de nieuwe database geïmporteerd:
$ mysql -u root -p mp_database < ~/mp_may2016.sql
Toen was het tijd om Apache te configureren.
Ik heb een .conf-bestand gemaakt op de nieuwe server:
$ cd / etc / apache2 / sites-beschikbaar $ sudo nano 000-mp.conf
Ik heb er veel van kunnen afleiden uit het bestaande .conf-bestand:
VirtualHost *: 80> Servernaam meetingplanner.io ServerAlias www.meetingplanner.io ServerAlias alpha.meetingplanner.io DocumentRoot "/ var / www / mp / frontend / web"# gebruik mod_rewrite voor mooie URL-ondersteuning RewriteEngine op # Als een map of bestand bestaat, gebruik dan de aanvraag direct RewriteCond% REQUEST_FILENAME! -f RewriteCond% REQUEST_FILENAME! -d # Stuur het verzoek door naar index.php RewriteRule. index.php
Vervolgens heb ik de site geactiveerd en Apache opnieuw geladen:
sudo a2ensite 000-mp.conf sudo service apache2 herladen
Zoals ik eerder al zei, moest ik ervoor zorgen dat de lokale bestanden met sleutels en omgevingspaden correct waren op de nieuwe server.
Hoewel er zeker hobbels waren, kwam uiteindelijk alles samen.
Ten slotte heb ik de DNS opnieuw toegewezen aan de kern van de URL van de Meeting Planner. Kort daarna was de nieuwe server live:
Je zult misschien merken dat ik mijn recente tutorial over het ongelooflijk gave Let's Encrypt heb gebruikt: ik installeerde https voor Meeting Planner voordat ik de bovenstaande screenshot nam.
Meeting Planner en Let's Encrypt vertrouwen op cron voor het uitvoeren van belangrijke processen op de achtergrond. Dus verplaatste ik mijn crontab-instellingen van de oude server:
$ sudo crontab -e
# mh dom mon dow commando * / 5 * * * * wget -O / dev / null http://meetingplanner.io/daemon/update 30 2 * * 1 / opt / letsencrypt / letsencrypt-auto renew >> / var / log / le-renew.log
Lees dit als je je afvraagt waarom ik cron in kleine letters verwijs.
Meeting Planner heeft de afgelopen paar maanden enorme vooruitgang geboekt. Ik heb zakelijke vergaderingen gepland en een aantal persoonlijke datums hebben ervoor gekozen om met de app tweede datums met mij te plannen. Toch zijn er nog steeds veel tekortkomingen - en feedback van vroege gebruikers is van vitaal belang. Dus, in de volgende tutorial, ga ik een systeem opzetten voor het verzamelen van feedback van gebruikers, hen helpen om antwoorden te krijgen op veelgestelde vragen en zoveel mogelijk leren om de service te verbeteren voordat ik MVP en een alpha-lancering verklaar..
Ik hoop dat je deze aflevering leuk vond. Bekijk de komende tutorials in onze Building Your Startup With PHP-serie - er is ook veel Pools werk en een paar meer grote functies die eraan komen.
Voel je vrij om je vragen en opmerkingen hieronder toe te voegen; Ik neem over het algemeen deel aan de discussies. Je kunt me ook rechtstreeks op Twitter @reifman bereiken.