Ce tutoriel fait partie de la série Construire votre démarrage avec PHP sur Envato Tuts +. Dans cette série, je vous guide dans le lancement d'une startup du concept à la réalité, en utilisant mon application Meeting Planner comme exemple concret. À chaque étape du processus, je publierai le code de Meeting Planner sous forme d’exemples open source à partir desquels vous pourrez apprendre. Je traiterai également les problèmes liés au démarrage au fur et à mesure qu'ils surviennent.
Dans ce tutoriel, je vais explorer le choix d'une plate-forme d'hébergement idéale pour Meeting Planner et la configuration initiale de notre serveur. Je vous guiderai tout au long du processus lors de la migration du site Web de pré-lancement vers un meilleur environnement de production pour notre prochain lancement alpha..
Si vous n'avez pas encore essayé Meeting Planner, planifiez votre première réunion. Je participe aux commentaires ci-dessous, alors dites-moi ce que vous en pensez! Je suis particulièrement intéressé si vous souhaitez suggérer des fonctionnalités ou des sujets pour de futurs tutoriels..
Pour rappel, tout le code pour Meeting Planner est écrit dans le framework Yii2 pour PHP. Si vous souhaitez en savoir plus sur Yii2, consultez notre série parallèle Programmer avec Yii2.
Pour de nombreuses entreprises, AWS d’Amazon est la solution de référence émergente. Lorsque AWS tombe en panne, nombre des services les plus connus du Web disparaissent également. Mais AWS est également coûteux, souvent trop complexe, et dirigé par une entreprise qui a toujours été hostile envers ses employés, en particulier ses ouvrières et ses ouvriers d'entrepôt. De plus, Amazon a à lui seul insisté sur le développement excessif rapide de ma ville natale, Seattle, de telle manière qu'il ait fondamentalement changé la ville pour toujours, mais pas nécessairement pour de bon..
Récemment, j'ai écrit un guide sur les alternatives à Amazon pour les services de cloud computing. Il y a beaucoup de concurrents, aucun aussi vaste, mais beaucoup de meilleurs, plus abordables et plus faciles à utiliser. Au fur et à mesure que Meeting Planner grandit, je pourrai à nouveau envisager AWS, mais pour l'instant je souhaite regarder ailleurs..
À court terme tout au plus, j'aurai besoin d'un serveur ou de deux services Web et de base de données en cours d'exécution. Pour cela, des sociétés d’hébergement gérées telles que Rackspace, Linode et mon Digital Ocean préféré fonctionnent parfaitement..
Pour l'instant, Meeting Planner peut s'exécuter sur un seul serveur, mais à mesure qu'il se développe, il est possible que j'aie besoin de plusieurs serveurs Web et de bases de données. D'après mon expérience, AWS facilite cette implémentation, mais les administrateurs système expérimentés peuvent le faire facilement avec les fournisseurs de cloud mentionnés ci-dessus..
Ce didacticiel vous guidera lors du lancement d’un serveur Web et d’un serveur de base de données dans les nuages Digital Ocean..
J'ai écrit quelques tutoriels sur Digital Ocean sur Envato Tuts +, notamment sur l'utilisation de leur API pour la configuration du serveur. J'ai aussi récemment écrit sur mon expérience positive avec le programme d'affiliation Digital Ocean. Divulgation complète: à la demande, Digital Ocean a fourni un crédit pour compte courant afin de couvrir les coûts des gouttelettes pour cette série de startups jusqu'à six mois..
Au cours des deux dernières années, j'ai constamment amélioré leur qualité de service, leur expérience utilisateur, leur support et leurs fonctionnalités. Pendant un certain temps, il était extrêmement rare de connaître un ralentissement ou une panne, courant sur le marché de l'hébergement cloud au début..
Commençons par configurer le serveur de production initial pour Meeting Planner.
Les instances Digital Ocean sont appelées gouttelettes. Je suis sûr qu'ils ont pensé à les appeler des têtards ou des poissons, mais nous, les développeurs, les détruisons souvent, de sorte que les non-conscients gouttelette est un meilleur terme.
Du Gouttelettes menu, nous allons Créer une gouttelette. Tout d'abord, nous choisissons Ubuntu 14.04 pour notre image et l'option serveur à 10 $ par mois:
Ensuite, j'ai choisi le San Francisco région parce qu'elle est la plus proche de moi:
J'ai également demandé à Digital Ocean de réutiliser ma clé publique pour établir la connexion. La connexion par clé est plus sécurisée que la connexion par mot de passe. Ensuite, j'ai choisi le nom d'hôte apps.meetingplanner.io pour le serveur:
Quand vous cliquez Créer, vous verrez la gouttelette se former:
Une fois prêt, vous recevrez une adresse IP à laquelle j'ai mappé les enregistrements de domaine meetingplanner.io pour la configuration initiale:
J'attendrai plus tard pour mapper le domaine racine meetingplanner.io sur le nouveau serveur..
Voici ce que vous verrez lorsque vous vous connectez au serveur pour la première fois:
$ ssh -i ~ / .ssh / id_lookahead [email protected] Vous devez changer votre mot de passe immédiatement (root appliqué) Bienvenue dans Ubuntu 14.04.4 LTS (GNU / Linux 3.13.0-85-generic x86_64) * Documentation: https://help.ubuntu.com/ Informations système à partir du mer. Mai 18 15:59:01 EDT 2016 Chargement du système: 0.0 Utilisation de la mémoire: 5% Processus: 54 Utilisation de /: 4.2% de 29.40GB Utilisation de l'échange: 0% Utilisateurs connectés: 0 Représentez graphiquement ces données et gérez ce système à l'adresse suivante: https://landscape.canonical.com/. 0 packages pouvant être mis à jour. 0 mises à jour sont des mises à jour de sécurité. Les programmes fournis avec le système Ubuntu sont des logiciels libres. Les conditions exactes de distribution de chaque programme sont décrites dans les fichiers individuels dans / usr / share / doc / * / copyright. Ubuntu est fourni avec ABSOLUMENT AUCUNE GARANTIE, dans les limites permises par la loi en vigueur. Changer le mot de passe pour root. Mot de passe UNIX (actuel): Entrez le nouveau mot de passe UNIX: Retapez le nouveau mot de passe UNIX:
Digital Ocean propose une grande variété de guides utiles. J'ai créé un nouvel utilisateur pour mon compte principal non root et mes comptes de déploiement à l'aide de cet explicatif..
J'ai également modifié la configuration de SSH pour éliminer la connexion à la racine et personnaliser le port SSH par défaut à partir de 22.
Ensuite, j'ai installé le serveur typique UAMP (Ubuntu, Apache, PHP et MySQL) sur le serveur.. Il est possible que je vienne de créer un nouvel acronyme pour enfant, LAMP..
$ sudo apt-get install mysql-server php5-mysql php5 php5-memcached memcached php5-mcrypt Lire les listes de paquets… Terminé Arbre de dépendance du bâtiment Lire les informations d'état… Terminé Les paquets supplémentaires suivants seront installés: apache2 apache2-bin apache2-data libaio1 libapache2 -mod-php5 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libdbd-mysql-perl libdbi-perl libhtem-template-perl libmemcached10 libmysqlclient18 libterm-readkey-perl-client -server-5.5 mysql-server-core-5.5 php-pear php5-cli php5-common php5-json php5-readline ssl-cert Paquets suggérés: apache2-doc apache2-suexec-vierge 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 opensl-blacklist apache2-bin apache2-data libaio1 libapache2-mod -php5 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libdbd-mysql-perl libdbi-perl libhtml-template-perl libmemcache10 libmysqlclient18 libterm-readkey-perl meml-mysql-client serveur mysql-server-5.5 mysql-server-core-5.5 php-pear php5 php5-cli php5-common php5-json php5-memcached php5-mysql php5-readi ssl-cert 0 mis à jour, 31 nouvellement installé, 0 à supprimer et 0 pas mis à niveau. Besoin d'obtenir 15,7 Mo d'archives. Après cette opération, 126 Mo d’espace disque supplémentaire seront utilisés. Voulez-vous continuer? [O / n] y Obtenez: 1 http://mirrors.digitalocean.com/ubuntu/ trusty / main libaio1 amd64 0.3.109-4 [6 364 B] Obtenez: 2 http://mirrors.digitalocean.com/ubuntu/ trusty / main libapr1 amd64 1.5.0-1 [85.1 ko]… Activation du module mpm_prefork. apache2_switch_mpm Basculer vers prefork * Redémarrage du serveur Web apache2 [OK] apache2_invoke: Activer le module php5 * Redémarrage du serveur Web apache2 [OK] Configuration de php5 (5.5.9 + dfsg-1ubuntu4.16)… Traitement des déclencheurs de libc-bin (2.19-0ubunt6) .7)…
Ensuite, j'ai configuré mon fuseau horaire par défaut. Meeting Planner s'exécute en interne à l'heure normale du Pacifique (PST). J'ai édité php.ini:
sudo nano /etc/php5/apache2/php.ini
Et j'ai ajouté ceci:
date.timezone = 'America / Los_Angeles'
Maintenant c'est temps pour obtenir notre base de code sur le serveur.
Tout d'abord, j'ai installé git:
sudo apt-get install git
Ensuite, en tant qu'utilisateur de déploiement de code, j'ai créé une nouvelle clé SSH pour établir une connexion sécurisée avec GitHub:
ssh-keygen -t rsa -C "[email protected]" Génération d'une paire de clés rsa publique / privée. Entrez le fichier dans lequel enregistrer la clé (/home/deploy/.ssh/id_rsa): Répertoire créé '/home/deploy/.ssh'. Entrez mot de passe (vide pour aucun mot de passe): entrez à nouveau le même mot de passe: votre identification a été enregistrée dans /home/deploy/.ssh/id_rsa. Votre clé publique a été enregistrée dans /home/deploy/.ssh/id_rsa.pub. L'empreinte de la clé est la suivante: f7: 84: 37: b3: e4: 7b: d3: 9c: 0c: 60: b4: b7: 4c: 86: 53: cb [email protected] L'image de la clé au hasard est: + - [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 Identité ajoutée: /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.
Vous devez également coller la clé dans les paramètres de votre compte Git..
Ensuite, j'ai installé Composer:
$ curl -sS https://getcomposer.org/installer | sudo php - --install-dir = / usr / local / bin --filename = composer compositeur
J'adore les compositeurs, car ils font gagner beaucoup de temps, mais il y a des jours où cela m'agace, où ils cessent de fonctionner de nulle part, comme le fait que le framework Yii vous oblige à installer le fxp / composer-asset-plugin pour une utilisation correcte:
$ composer global nécessite "fxp / composer-asset-plugin: ^ 1.0" mise à jour $ composer
Certes, j'ai utilisé GitHub pour synchroniser le dernier code jusqu'à ce que je me souvienne que Yii2 configure en fait un grand nombre de fichiers que GitHub ignore, y compris index.php. Il existe également des fichiers de clé locaux et des images de profil utilisateur téléchargées. J'ai donc utilisé tar pour compresser le codebase actif:
tar czf mp_may2016.tar.gz mp
Ensuite, j'ai utilisé SCP pour déplacer les fichiers sur le nouveau serveur, puis je l'ai extrait:
scp -i ~ / .ssh / id_lookahead -P 3327 ~ / mpmigrate / mp_may2016.tar.gz [email protected]: ~ tar -xzf mp_may2016.tar.gz
En fin de compte, certains travaux ont également consisté à examiner les clés de la base de données locale (que j'ai mises à jour sur le nouveau serveur) et à vérifier les autorisations de mon fichier..
Passons maintenant à la base de données.
D'abord, j'ai vidé la base de données existante dans un fichier:
$ mysqldump -uroot -p --opt mp> mp_may2016.sql
Ensuite, je l'ai déplacé sur le nouveau serveur avec scp:
$ scp -i ~ / .ssh / id_lookahead -P 22533 [email protected]: ~ / mp_may2016.sql .
Sur le nouveau serveur, j'ai créé une nouvelle base de données avec de nouveaux détails et configuré certaines autorisations pour Apache:
$ mysql -u root -p Entrez le mot de passe: Bienvenue sur le moniteur MySQL. Les commandes se terminent par; ou \ g. Votre identifiant de connexion MySQL est 43 Version du serveur: 5.5.49-0ubuntu0.14.04.1 (Ubuntu) Copyright (c) 2000, 2016, Oracle et / ou ses filiales. Tous les droits sont réservés. Oracle est une marque déposée d'Oracle Corporation et / ou de ses filiales. Les autres noms peuvent être des marques de commerce de leurs propriétaires respectifs. Tapez 'aide'; ou '\ h' pour obtenir de l'aide. Tapez '\ c' pour effacer l'instruction d'entrée actuelle. mysql> create database mp_database; Requête OK, 1 ligne affectée (0.00 sec) mysql> accorde tous les privilèges sur mp_database. * TO "mp_master" @ "localhost" identifié par "xYxYZxZx1a"; Requête OK, 0 lignes affectées (0,00 s) mysql> privilèges de vidage; Requête OK, 0 lignes affectées (0,00 s) mysql> exit;
Enfin, j'ai importé le fichier SQL dans la nouvelle base de données:
$ mysql -u root -p mp_database < ~/mp_may2016.sql
Ensuite, il était temps de configurer Apache.
J'ai créé un fichier .conf sur le nouveau serveur:
$ cd / etc / apache2 / sites-available $ sudo nano 000-mp.conf
J'ai pu en tirer une grande partie du fichier .conf existant:
VirtualHost *: 80> ServerName meetingplanner.io ServerAlias www.meetingplanner.io ServerAlias alpha.meetingplanner.io DocumentRoot "/ var / www / mp / frontend / web"# utilisez mod_rewrite pour la jolie prise en charge des URL RewriteEngine on # Si un répertoire ou un fichier existe, utilisez directement la demande RewriteCond% REQUEST_FILENAME! -f RewriteCond% REQUEST_FILENAME! -d # Sinon, transférez la demande à index.php RewriteRule. index.php
Ensuite, j'ai activé le site et rechargé Apache:
sudo a2ensite 000-mp.conf sudo service apache2 reload
Comme je l'ai mentionné précédemment, je devais m'assurer que les fichiers locaux avec les clés et les chemins d'environnement étaient corrects sur le nouveau serveur..
Bien qu'il y ait eu des bosses, finalement, tout est arrivé.
Enfin, j'ai remappé le DNS pour l'URL de base du planificateur de réunions. Peu après, le nouveau serveur était en ligne:
Vous remarquerez peut-être que j'ai utilisé mon récent tutoriel sur l'incroyable génial Let's Encrypt: j'ai installé https pour Meeting Planner avant de prendre la capture d'écran ci-dessus..
Meeting Planner et Let's Encrypt s'appuient sur cron pour l'exécution de processus clés en arrière-plan. J'ai donc transféré mes paramètres crontab de l'ancien serveur:
$ sudo crontab -e
# mh dom commande mon dow * / 5 * * * * wget -O / dev / null http://meetingplanner.io/daemon/update 30 2 * * 1 / opt / letsencrypt / letsencrypt-auto renew >> / var / log / le-renew.log
Lisez ceci si vous vous demandez pourquoi je parle de cron en minuscule..
Meeting Planner a réalisé des progrès considérables au cours des derniers mois. J'ai planifié des réunions de travail et quelques rendez-vous personnels ont choisi de planifier des rendez-vous avec moi à l'aide de l'application. Cependant, il y a encore beaucoup de lacunes et les retours des utilisateurs débutants sont essentiels. Donc, dans le prochain tutoriel, je vais mettre en place un système de collecte des commentaires des utilisateurs, les aidant à obtenir des réponses aux questions courantes et à apprendre autant que possible afin d'améliorer le service avant de déclarer MVP et un lancement alpha.
J'espère que vous avez apprécié cet épisode. Surveillez les prochains tutoriels dans notre rubrique Construire votre démarrage avec la série PHP. Il y a également beaucoup de travail de finition et quelques autres fonctionnalités importantes à venir..
N'hésitez pas à ajouter vos questions et commentaires ci-dessous; Je participe généralement aux discussions. Vous pouvez également me joindre directement sur Twitter @reifman.