Maison >développement back-end >tutoriel php >Comment réaliser l'équilibrage de charge en php ? Exemple d'équilibrage de charge PHP (code)

Comment réaliser l'équilibrage de charge en php ? Exemple d'équilibrage de charge PHP (code)

不言
不言original
2018-07-25 15:56:1713605parcourir

Il existe de nombreuses façons d'implémenter l'équilibrage de charge en PHP. Ici, je vais vous présenter l'équilibrage de charge PHP. Sans plus tarder, jetons un coup d'œil directement à l'implémentation de l'équilibrage de charge PHP.

1. Fichier PHP

La première question est, si vous avez un grand nombre de petits serveurs, comment télécharger votre fichier php sur tous les Sur le serveur ? Il existe les méthodes suivantes pour votre référence :

1. Téléchargez tous les fichiers sur chaque serveur séparément. Le problème avec cette méthode est le suivant : imaginez que vous avez 20 serveurs, le processus de téléchargement sera alors très long. il est facile de provoquer des erreurs, et il est très probable que lors de la mise à jour, il y aura différentes versions de fichiers sur différents serveurs.
2. Utilisez « rsync » (ou un logiciel similaire). Un tel outil peut synchroniser des fichiers sur un répertoire local et plusieurs répertoires d'hôtes distants.
3. Utilisez un logiciel de contrôle de version (tel que Subversion). Cela me permet de très bien maintenir mon code, et lorsque je publie mon application, je peux exécuter la commande svnupdate sur chaque serveur pour la synchroniser. Cette approche facilite également le basculement des serveurs vers une version précédente du code.
4. Utilisez un serveur de fichiers (vous constaterez peut-être que NFS est très approprié pour cela). Cette méthode consiste à utiliser un serveur de fichiers pour stocker votre application Web. Bien sûr, si votre serveur de fichiers tombe en panne, cela affectera votre site. sera indisponible. À ce stade, vous devrez dépenser plus d’argent pour le restaurer.

La méthode que vous choisissez dépend de vos besoins et de vos compétences. Si vous utilisez un système de contrôle de version, vous souhaiterez peut-être planifier un moyen de mettre à jour le code sur tous les serveurs en exécutant une commande de mise à jour en même temps. Cependant, si vous utilisez un serveur de fichiers, vous devrez mettre en œuvre un mécanisme de récupération après échec pour éviter les échecs de requête en cas de panne du serveur.

2. Téléchargement de fichiers

Lorsqu'il n'y a qu'un seul serveur, le téléchargement de fichiers ne pose pas de problème. Mais lorsque nous avons plusieurs serveurs, comment doivent être stockés les fichiers téléchargés ? Le problème du téléchargement de fichiers est similaire à celui du stockage de fichiers PHP entre serveurs. Voici plusieurs solutions possibles :
1. Stockez le fichier dans la base de données.

La plupart des données permettent de stocker des données binaires. Lorsque vous demandez un téléchargement de fichier, Access Data envoie les données binaires ainsi que le nom et le type de fichier correspondants à l'utilisateur. Vous devez réfléchir à la manière dont la base de données stockera vos fichiers avant d'utiliser cette solution. Le problème avec cette approche est que si le serveur de base de données tombe en panne, les fichiers seront indisponibles.

2. Stockez les fichiers téléchargés sur un serveur de fichiers

Comme dans l'introduction précédente, vous devez installer un serveur de fichiers qui sera partagé par tous les serveurs Web et télécharger tous les fichiers téléchargés ici. les serveurs Web peuvent l'utiliser après le téléchargement. Cependant, si le serveur de fichiers est en panne, des interruptions du téléchargement des fichiers image peuvent survenir.

3. Concevez votre propre mécanisme de téléchargement pour transférer des fichiers vers chaque serveur

Cette méthode n'a pas les inconvénients d'un serveur de fichiers unique ou d'une solution de base de données, mais augmentera la complexité de votre code. . Par exemple, si le serveur tombe en panne lors du téléchargement sur plusieurs serveurs, que devez-vous faire ?

Utiliser une base de données pour stocker les fichiers téléchargés, mais concevoir un mécanisme de mise en cache des fichiers est une bonne solution. Lorsque le serveur reçoit une demande de téléchargement de fichier, il vérifie d'abord si le fichier existe dans le système de cache, s'il le trouve, il le télécharge depuis le système de cache. Sinon, il le lit dans la base de données et le met en cache dans le système de fichiers.

3. Sessions

Si vous êtes familier avec le traitement des sessions PHP, vous saurez probablement que par défaut, il s'agit d'une session Store. données dans des fichiers temporaires sur le serveur. De plus, ce fichier se trouve uniquement sur le serveur sur lequel vous l'avez demandé, mais les requêtes ultérieures pourront être traitées par un autre serveur, ce qui générera une nouvelle session sur l'autre serveur. Cela fait que les sessions ne sont souvent pas reconnues, par exemple, les utilisateurs connectés sont toujours invités à se reconnecter.

Ma solution recommandée consiste soit à rétablir le mécanisme de traitement de session intégré à PHP pour stocker les données de session dans la base de données, soit à implémenter votre propre mécanisme pour garantir que la requête d'un utilisateur est envoyée au même serveur.

4. Configuration

Bien que ce sujet ne soit pas particulièrement lié à PHP, il me semble quand même nécessaire de le mentionner. Lors de l'exécution de serveurs en cluster, il est judicieux de disposer d'un moyen de synchroniser les fichiers de configuration entre les serveurs. Si les fichiers de configuration sont incohérents, cela peut entraîner un comportement intermittent très étrange qui peut être difficile à dépanner.

Je recommande d'utiliser un système de contrôle de version pour les gérer individuellement. De cette façon, vous pouvez stocker différents fichiers de configuration PHP pour différentes installations de projet et également synchroniser tous les fichiers de configuration du serveur.

5. Journalisation

Comme les problèmes de configuration, la journalisation n'est pas uniquement liée à PHP. Mais il est toujours très important de maintenir le bon fonctionnement de votre serveur. Sans un système de journalisation approprié, comment savoir si votre code PHP commence à générer des erreurs (vous désactivez toujours le paramètre display_errors lorsque le système est officiellement en cours d'exécution, n'est-ce pas ?)

Il existe plusieurs façons de peut implémenter la journalisation :

1. Enregistrez les journaux sur chaque serveur. C'est la manière la plus simple. Chaque machine n'enregistre qu'un seul fichier. L'avantage est qu'il est simple et peut nécessiter très peu de configuration. Cependant, à mesure que le nombre de serveurs augmente, la surveillance des fichiers journaux sur chaque serveur devient très difficile.
2. Connectez-vous à un partage Dans cette méthode, chaque serveur dispose toujours des fichiers journaux, mais ils sont stockés sur un serveur de fichiers central via le mécanisme de partage, ce qui facilitera la surveillance des journaux. Le problème avec cette solution est que si le serveur de fichiers n'est pas disponible, un simple problème d'écriture de journal finira par provoquer le crash de l'ensemble de l'application.
3. Enregistrez les journaux sur un serveur de journalisation. Vous pouvez utiliser un logiciel de journalisation, tel que syslog, pour écrire tous les journaux sur un serveur central. Bien que cette méthode nécessite davantage de configuration, elle constitue également la solution la plus robuste.

Instance d'équilibrage de charge php

Si vous souhaitez utiliser l'équilibrage de charge, vous pouvez modifier la configuration du nœud http comme suit :

#设定http服务器,利用它的反向代理功能提供负载均衡支持
            http {
            #设定mime类型,类型由mime.type文件定义
            include       /etc/nginx/mime.types;
            default_type  application/octet-stream;
            #设定日志格式
            access_log    /var/log/nginx/access.log;
#省略上文有的一些配置节点
#。。。。。。。。。。
#设定负载均衡的服务器列表
            upstream mysvr {
            #weigth参数表示权值,权值越高被分配到的几率越大
            server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口
            server 192.168.8.2x:80  weight=1;
            server 192.168.8.3x:80  weight=6;
            }
upstream mysvr2 {
            #weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.8.x:80  weight=1;
            server 192.168.8.x:80  weight=6;
            }
#第一个虚拟服务器
            server {
            #侦听192.168.8.x的80端口
            listen       80;
            server_name  192.168.8.x;
#对aspx后缀的进行负载均衡请求
            location ~ .*\.aspx$ {
root   /root;      #定义服务器的默认网站根目录位置
            index index.php index.html index.htm;   #定义首页索引文件的名称
proxy_pass  http://mysvr ;#请求转向mysvr 定义的服务器列表
#以下是一些反向代理的配置可删除.
proxy_redirect off;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size 10m;    #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;  #缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90;  #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;        #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;         #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;             #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;  #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
}

Recommandations associées :

Explication détaillée des cas de partage de session sous équilibrage de charge en PHP (avec code)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn