在腾讯云轻量服务器通过Nginx Unit部署PHP应用

2023-11-12 12:03:50 浏览数 (2)

0x001 简介

本文简单介绍在腾讯轻量服务器Ubuntu上安装Nginx Unit。并通过Nginx Unit部署运行了ThinkPHP框架。并进行简单的可用性测试。NGINX Unit 是Nginx团队的又一开源力作。一个通用的应用服务器。目前已支持Go、JavaScript (Node.js)、Java、Perl、PHP、Python、Ruby语言的应用。以可作为反向代理服务器进行工作。完全通过可以通过配置API已JSON配置文件的方式进行更新。请参考中文官网的配置和英文官网的安装指引。

0x002 前置条件和环境要求

笔者假定读者已掌握基础的Linux使用知识,并且拥有良好的网络。以下操作步骤均在以下环境操作并得到验证。

软件名

版本

备注

Ubuntu Server

20.04 LTS

已通过apt-get 更新到最新,并重启过

Nginx Unit

1.30

截止发文时为最新版本,支持其他系统版本和发行版。可自行参考文档安装

PHP

7.4x

可自行选择其他版本(此版本操作系统nginx unit 只支持7.4x版本PHP)

为明确本文的阅读,特做以下约定

1. 单独一个代码块的为一行命令,特别说明的除外

0x003 安装部署Nginx Unit

1. 登录腾讯云,选购一台轻量服务器。可以在这里选双十一优惠(https://curl.zijiebao.com/8beyH8BM)

2. 选择系统镜像为Ubuntu 20.04 LTS

3. 付款购买

4. 在你购买的实例上点击登录,进入ssh。输入

代码语言:javascript复制
sudo apt-get update
代码语言:javascript复制
sudo apt-get upgrade

重启服务器,并通过腾讯云OrcaTerm 安装增强插件。

5. 添加Nginx Unit密钥,注意以代码是一行

代码语言:javascript复制
sudo curl --output /usr/share/keyrings/nginx-keyring.gpg  
      https://unit.nginx.org/keys/nginx-keyring.gpg

执行完是这样

6. 添加Nginx Unit软件源

代码语言:javascript复制
sudo nano /etc/apt/sources.list.d/unit.list

粘贴以下内容

代码语言:javascript复制
deb [signed-by=/usr/share/keyrings/nginx-keyring.gpg] https://packages.nginx.org/unit/ubuntu/ focal unit
deb-src [signed-by=/usr/share/keyrings/nginx-keyring.gpg] https://packages.nginx.org/unit/ubuntu/ focal unit

执行完是这样

按下Ctrl O,这时nano会让你确认文件名。回车即可。提示写入成功后。按下Ctrl X退出nano

7. 更新软件源并安装Nginx Unit和PHP模块

代码语言:javascript复制
sudo apt-get update
代码语言:javascript复制
sudo apt-get install unit
代码语言:javascript复制
sudo apt-get install unit-dev unit-php 
代码语言:javascript复制
sudo systemctl restart unit

这里需要输入y

安装PHP拓展(可自行选择)

代码语言:javascript复制
sudo apt-get install php-mysql php-curl php-gd php-mbstring php-pdo php-bcmath

到这一步再通过systemctl重启unit服务即可。通过以上步骤即可完成安装。

0x004 编写PHP应用配置文件

在上一步中,我们已经成功安装好了Nginx Unit和PHP模块,下面我们将使用提供的Nginx Unit默认示例,测试一下PHPINFO页面。在我们安装时页面曾经有如下的提示信息。可查看0x003 安装部署Nginx Unit章节中的第七步的截图。这里再次提供一下此截图强调一下应该看到的部分。

这里我们通过这个examples来理解和运行一个最简单的应用。

examples结构如下,unit.config为配置文件。phpinfo-app/index.php为具体应用

代码语言:javascript复制
{
        "applications": {
                "example_php": {
                        "type": "php",
                        "processes": 2,
                        "root": "/usr/share/doc/unit-php/examples/phpinfo-app",
                        "index": "index.php"
                }
        },

        "listeners": {
                "*:8300": {
                        "pass": "applications/example_php"
                }
        }
}

listeners配置为监听的端口,pass配置此端口会转向哪个应用。

运行

代码语言:javascript复制
sudo curl -X PUT --data-binary @unit.config --unix-socket /var/run/control.unit.sock http://localhost/config

当看到如下回显时,即配置成功

代码语言:javascript复制
{
        "success": "Reconfiguration done."
}

通过curl http://localhost:8300 查看是否有获取到数据。如果需要也可以通过公网IP访问(需要放通对应防火墙)

0x005 部署ThinkPHP 6应用

安装composer(这里会可能弹出警告,提示提示composer版本太老,可忽略)

代码语言:javascript复制
apt-get install composer
代码语言:javascript复制
composer create-project topthink/think=v6.1.0 mytpapp

输出以下信息即安装成功

对项目进行调整一下,进入mytpapp目录(这部分代码每一行为一个代码块)

代码语言:javascript复制
cd  mytpapp # 进入目录
chmod -R 777 runtime/ #调整部分目录权限
sudo mv mytpapp/ /var/opt/ # 移动到/var/opt/
cd /var/opt #切换目录
sudo chown -R unit:unit mytpapp/ # 修改权限

创建php.config

代码语言:javascript复制
{
    "listeners":{
        "*:443":{
            "pass":"routes",
            "tls":{
                "certificate":"bundle",
                "conf_commands":{
                    "ciphersuites":"TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256",
                    "minprotocol":"TLSv1.2"
                },
                "session":{
                    "cache_size":1024,
                    "timeout":60,
                    "tickets":[
                        "qpV1KjTOqEisH2nnY76zUciSNlfrdu2 BWCwtgwAr6EB uk2rK3PVXYAlAdz8DKl",
                        "D596nU2DS8i hG3S4Q2bzoMRUjBRkMug1Llrn42lVMaqaa/s9C/6obYOSOGrTpvF"
                    ]
                }
            }
        }
    },
    "routes":[
        {
            "match":{
                "uri":[
                    "!/static/*",
                    "*.php",
                    "*.php/*"
                ]
            },
            "action":{
                "pass":"applications/phpapp/direct"
            }
        },
        {
            "action":{
                "share":"/var/opt/mytpapp/public$uri",
                "fallback":{
                    "pass":"applications/phpapp/index"
                }
            }
        }
    ],
    "applications":{
        "phpapp":{
            "type":"php",
            "processes":2,
            "targets":{
                "direct":{
                    "root":"/var/opt/mytpapp/public"
                },
                "index":{
                    "root":"/var/opt/mytpapp/public",
                    "script":"index.php"
                }
            }
        }
    }
}

如果有不一样的路径,请自行调整/var/opt/mytpapp 部分对应目录,其他位置请参考文档再进行修改。

上面的配置文件中我配置看ssl证书,这里需要将nginx的证书的key和pem合成到一个文件中(就是对key文件的内容复制到pem中合成为一个文件)合成出来的命名为bundle.pem

长这个样子。上面是证书下面是key

操作完以上步骤后确保目录结构如下

现在我们就可以开始部署了

1. 上传SSL证书,需要在上面bundle.pem文件所在目录内执行,

代码语言:javascript复制
sudo curl -X PUT --data-binary @bundle.pem --unix-socket /var/run/control.unit.sock http://localhost/certificates/bundle

如果删除SSL证书,只需要将PUT修改为DELETE即可

2. 开始运行

代码语言:javascript复制
sudo curl -X PUT --data-binary @php.config --unix-socket /var/run/control.unit.sock http://localhost/config

如果提示

代码语言:javascript复制
{
        "success": "Reconfiguration done."
}

恭喜你部署成功

如果需要删除这个部署的应用,只需要将PUT修改为DELETE即可,即

代码语言:javascript复制
sudo curl -X DELETE --data-binary @php.config --unix-socket /var/run/control.unit.sock http://localhost/config

0x006 测试验证

那就已部署成功了,访问你的https。即可看到如下页面

0x007 总结

以上我们按步骤介绍了安装和应用的部署方案,可参考此参考资源中3. 的Gitub仓库,提供了一个最简单的配置模板。

0x008 参考资源

1. Unit中文官网. url: https://www.nginx-cn.net/products/nginx-unit/.

2. Unit英文官网. url: https://unit.nginx.org/installation/.

3. https://github.com/tusdasa/nginx-unit-php-template

0 人点赞