详解基于Laravel8下的LaravelS实现高性能HTTP服务器

作者: 温新

分类: 【高性能PHP】

阅读: 4428

时间: 2020-11-01 15:20:52

准备工作

虚拟生命:vm16

环境:LNMP

系统版本:CentoOS8.2

框架:Laravel8

我使用的测试环境大多数是基于最新版本,目的是用于测试学习。既然推出了最新的版本,不管你接不接受或愿不愿意使用,它都是一个趋势。因此,基于学习的目的,使用新版本。

关于环境的搭建不再重复了,博客里面写了源码安装搭建PHP环境。

什么是LaravelS

LaravelS 是一个胶水项目,用于快速集成 Swoole 到 Laravel 或 Lumen,然后赋予它们更好的性能、更多可能性。

创建Laravel8项目

第一步:安装Laravel8

composer create-project --prefer-dist laravel/laravel laravel_swoole

第二步:配置Laravel8虚拟主机

cd /usr/local/nginx/conf/vhosts/

# 注意:这个虚拟主机机配置Laravel8项目
vim laswoole.conf

注意:我这里是vhosts目录下。在nginx.conf文件中通过 include 引入vhosts 目录下所有配置文件

server {
    listen        80;
    server_name laravelswoole.com;
    root   "/www/laravel_swoole/public";
    location / {
        index index.php index.html;
        autoindex  off;
    }
    location ~ \.php(.*)$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO  $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
        include        fastcgi_params;
    }
}

第三步:重启nginx

systemctl restart nginx.service 

第四步:windows10本机配置hosts文件

192.168.157.129	laravelswoole.com

安装Laravel-s

第一步:安装Laravels

cd laravel_swoole/

# 安装
composer require hhxsv5/laravel-s

第二步:生成配置

php artisan laravels publish

Laravel5.5以上版本不再需要手动配置app.php了。此命令完成之后即可使用。

第三步:运行Laravel-S

php bin/laravels start
 _                               _  _____ 
| |                             | |/ ____|
| |     __ _ _ __ __ ___   _____| | (___  
| |    / _` | '__/ _` \ \ / / _ \ |\___ \ 
| |___| (_| | | | (_| |\ V /  __/ |____) |
|______\__,_|_|  \__,_| \_/ \___|_|_____/ 
                                           
Speed up your Laravel/Lumen
>>> Components
+---------------------------+---------+
| Component                 | Version |
+---------------------------+---------+
| PHP                       | 7.4.11  |
| Swoole                    | 4.5.5   |
| LaravelS                  | 3.7.8   |
| Laravel Framework [local] | 8.11.2  |
+---------------------------+---------+
>>> Protocols
+-----------+--------+-------------------+----------------+
| Protocol  | Status | Handler           | Listen At      |
+-----------+--------+-------------------+----------------+
| Main HTTP | On     | Laravel Framework | 127.0.0.1:5200 |
+-----------+--------+-------------------+----------------+

运行之后通过 ip+端口即可访问,如192.168.157.129:5200

第四步:配置nginx

注意了,这里是为Laravel-S单独配置一个服务器。传统的配置是nginx接收到一个php请求后转发给php-fmp处理;实现高性能Swoole HTTP服务器,这里是将请求转发给LaravelS处理。

cd /usr/local/nginx/conf/vhosts

vim laravel_s.conf
upstream laravels {
    server 127.0.0.1:5200 weight=5 max_fails=3 fail_timeout=30s;
    keepalive 16;
}
server {
    listen 80;

    server_name laravel-s.com;
    root /www/laravel_swoole/public;
    index index.php index.html index.htm;

    location / {
        try_files $uri @laravels;
    }

    location @laravels {
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-PORT $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header Scheme $scheme;
        proxy_set_header Server-Protocol $server_protocol;
        proxy_set_header Server-Name $server_name;
        proxy_set_header Server-Addr $server_addr;
        proxy_set_header Server-Port $server_port;
        proxy_pass http://laravels;
    }
}

第五步:重启nginx

systemctl restart nginx.service 

第六步:windows10配置hosts文件

192.168.157.129	laravel-s.com

到这里就已经配置完成。配置基于域名之后,端口访问失败了。

说明:laravelswoole.com 是基础传统的HTTP服务器;laravel-s是基于Swoole。

性能测试对比

使用ab压力测试工具进行对比测试。

基于php-fpm的压力测试

ab -n 500 -c 100 http://laravelswoole.com
Server Software:        nginx/1.18.0
Server Hostname:        laravelswoole.com
Server Port:            80

...#省略

Concurrency Level:      10
Time taken for tests:   5.806 seconds
Complete requests:      100
Failed requests:        0
Non-2xx responses:      100
Total transferred:      52046500 bytes
HTML transferred:       52024900 bytes
Requests per second:    17.22 [#/sec] (mean)
Time per request:       580.583 [ms] (mean)
Time per request:       58.058 [ms] (mean, across all concurrent requests)
Transfer rate:          8754.41 [Kbytes/sec] received

...#省略

Percentage of the requests served within a certain time (ms)
  50%    574
  66%    587
  75%    596
  80%    607
  90%    642
  95%    668
  98%    677
  99%    686
 100%    686 (longest request)

可以看到每秒处理请求是 17.22个。

基于swoole的压力测试

ab -n 500 -c 100 http://laravel-s.com/
Server Software:        nginx/1.18.0
Server Hostname:        laravel-s.com
Server Port:            80

...#省略

Concurrency Level:      100
Time taken for tests:   0.803 seconds
Complete requests:      500
Failed requests:        0
Total transferred:      9254500 bytes
HTML transferred:       8729000 bytes
Requests per second:    622.59 [#/sec] (mean)
Time per request:       160.620 [ms] (mean)
Time per request:       1.606 [ms] (mean, across all concurrent requests)
Transfer rate:          11253.38 [Kbytes/sec] received
...#省略

Percentage of the requests served within a certain time (ms)
  50%    138
  66%    144
  75%    161
  80%    167
  90%    204
  95%    229
  98%    240
  99%    244
 100%    273 (longest request)

可以看到基于swoole服务器之后的处理请求数是622.59。

总结

从中可以看到基于swoole之后很明显的优化,处理请求数大大提高。php-fmp是17.22,swoole是622.59。差距非常大。

配置的过程中遇到了一些错误,主要是配置虚拟主机的错误,好在都解决了。如果你也遇到相似的问题,欢迎一起讨论学习。

2020-11-01

请登录后再评论