Ubuntu搭建PHP开发环境操作步骤(保姆级教程)

最近自购了一个阿里云服务器,系统镜像为Ubuntu 22.04 ,在编译安装LNMP(nginx+php+mysql)环境的时候,踩了不少坑,因此决定把自己安装的过程记录下来,以备后用。

本篇文章基本上属于保姆级别的教程,只要你的系统也是Ubuntu,基本上无脑式复制粘贴运行,就能搭建起LNMP的环境。如果在操作过程中遇到了各种奇怪的问题,可以具体问题具体网上搜索结果。

安装MySQL5.7

下载和解压

在MySQL官网下载Linux的指定版本,我这里下载5.7版本:https://downloads.mysql.com/archives/community/

打开链接后,具体选项参考下图所示(你可以改成你自己的系统版本),选择 DEB Bundle,在后面的Download按钮右键复制链接地址。

image-20241112141311499

然后在服务器的自定义目录下,使用wget命令下载安装包,并且解压:

#下载安装包
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.42-1ubuntu18.04_amd64.deb-bundle.tar

#解压
mkdir /opt/mysql
tar -xvf mysql-server_5.7.42-1ubuntu18.04_amd64.deb-bundle.tar -C /opt/mysql/
cd /opt/mysql/
ls

进入到 /opt/mysql/目录后,可以看到下面这些文件:

image-20241119141435525

编译安装

接下来,按照顺序依次执行下面的命令:

#使用dpkg -i命令顺序安装 
dpkg -i mysql-common_5.7.42-1ubuntu18.04_amd64.deb 
dpkg -i libmysqlclient20_5.7.42-1ubuntu18.04_amd64.deb 
dpkg -i libmysqlclient-dev_5.7.42-1ubuntu18.04_amd64.deb 
dpkg -i libmysqld-dev_5.7.42-1ubuntu18.04_amd64.deb 
dpkg -i mysql-community-server_5.7.42-1ubuntu18.04_amd64.deb
 
#如果报错缺少依赖,如下
dpkg -i mysql-community-client_5.7.42-1ubuntu18.04_amd64.deb 
dpkg -i mysql-client_5.7.42-1ubuntu18.04_amd64.deb 
 
#自动解决当前所出现的依赖
apt --fix-broken install

不出意外,应该就会出现输入密码的界面:

img

连接试试

输入两次密码后,mysql就安装好了。接下来,连接一下试试:

image-20241119141536464

重启mysql服务:systemctl restart mysql

如果需要卸载重装,参考下面的命令:

#查看mysql依赖项
dpkg --list | grep mysql
 
#卸载mysql-common
sudo apt remove mysql-common
 
#卸载并清除mysql5.7
sudo apt autoremove --purge mysql-server-5.7
 
#清除残留数据
dpkg -l | grep ^rc| awk '{print$2}'| sudo xargs dpkg -P
 
#检查依赖项
dpkg --list | grep mysql
 
#如果输出为空,那么表示mysql已经彻底卸载干净了,如果不为空那么我们还要继续进行删除卸载
sudo apt autoremove --purge mysql-apt-config

修改配置项

mysql5.7的配置文件my.cnf位于/etc/mysql/my.cnf,打开后看到内容如下:

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

然后,我们分别进入上面的两个目录,在 /etc/mysql/mysql.conf.d 这个目录下面会发现一个mysqld.cnf 的文件。没错,这个就是我们可以自定义的配置项的文件。

备注:不同版本的mysql的配置文件可能存在不同,本案例是在ubuntu系统下的mysql5.7来演示的,其它系统或其他版本可能存在差异。

允许远程连接

现在需要修改mysql的配置项,允许可以远程连接,修改/etc/mysql/mysql.conf.d/mysqld.conf的如下部分:

bind-address = 0.0.0.0 #所有IP都可以远程连接
# bind-address = 192.168.1.1 #指定IP可以远程连接
# skip-networking # 取消注释或删除 skip-networking 以启用网络连接

使用 systemctl restart mysql 重启mysql服务。

接下来,需要授权一个可以远程登录mysql的账号,通过mysql -u root -p 登录到mysql控制台,然后运行下面的命令:

-- 查看当前已授权的用户
use mysql;
select host,user from user;

-- 创建用户(如果已存在,则跳过)
-- 把下面的your_username改为你想要登录的用户名,或者仍然使用root;your_password改为需要登录的密码。
CREATE USER 'your_username'@'%' IDENTIFIED BY 'your_password';

-- 如果需要删除已存在的用户
DROP USER 'your_username'@'%';

-- 授权用户从任何主机连接(或者使用具体的外部IP地址替换'%')
-- 如果只允许访问部分数据库,把 *.* 改为 dbname.*
GRANT ALL PRIVILEGES ON *.* TO 'your_username'@'%';
 
-- 刷新权限
FLUSH PRIVILEGES;

然后,在阿里云的管理页面,“防火墙”部分,开放3306端口:

image-20241119164119284

通过以上的设置后,就可以在其他电脑上连接自己服务器的mysql了。

特别注意:如果允许所有IP都可以远程连接,会增加安全隐患,所以一定要保证连接密码足够的复杂,避免被攻击。

安装PHP7.3

编译

如果使用 apt install php 默认应该安装的php8,由于我的项目一直运行在php7.3的环境下,为了兼容项目,因此还是在这个服务器上安装php7.3 的版本,暂不安装最新版。

按顺序执行下面的命令:

#添加软件源 安装软件源拓展工具:
sudo apt -y install software-properties-common apt-transport-https lsb-release ca-certificates
 
#添加 PHP PPA 源,需要按一次回车(Enter):
sudo add-apt-repository ppa:ondrej/php  
 
#更新软件源缓存:
sudo apt update
 
#安装PHP 安装PHP和对应拓展(redis,memcache等,也可以再追加更多扩展)
sudo apt install php7.3-fpm php7.3-mysql php7.3-curl php7.3-gd php7.3-mbstring php7.3-xml php7.3-xmlrpc php7.3-zip php7.3-opcache php7.3-redis php7.3-memcache -y
 
# 【可选】如果需要修改fpm的监听端口,操作如下:
# vi /etc/php/7.3/fpm/pool.d/www.conf,将listen修改为 listen = 127.0.0.1:9000
 
#启动、关闭、重启(可以写到shell脚本或者快捷命令)
sudo systemctl start php7.3-fpm.service #启动
sudo systemctl stop php7.3-fpm.service #关闭
sudo systemctl restart php7.3-fpm.service #重启
sudo systemctl status php7.3-fpm.service #检查状态

# 安装更多扩展
sudo apt install php7.3-bcmath #安装bcmath扩展,其它类似

安装完成

安装完成后,查看PHP版本:

image-20241119141327312

备注:PHP7的其它小版本(PHP7.1、PHP7.2、PHP7.4) 的安装方式和上面的操作流程类似。

安装Nginx

下载

可以直接通过 apt install nginx ,但是这样安装后配置PHP的时候各种问题。后来懒得折腾了,就重新安装一个nginx,操作如下:

进入官网下载指定版本,我这里下载当前最新版 nginx-1.27.2:http://nginx.org/en/download.html

image-20241112142158969

安装

打开链接后,还是右键复制链接地址,然后通过wget下载到指定目录。然后按顺序执行下面的命令:

#下载安装包
wget https://nginx.org/download/nginx-1.27.2.tar.gz

#安装nginx之前,安装一下工具
sudo apt update
sudo apt-get install libpcre3-dev
sudo apt-get install ruby
sudo apt-get install zlib1g-dev
sudo apt-get install libssl-dev
 
#解压
tar -zxvf nginx-1.27.2.tar.gz
cd nginx-1.27.2/
 
#编译
./configure  --with-http_ssl_module
 
#安装
make && make install
 
#启动和重启
sudo /usr/local/nginx/sbin/nginx #启动
sudo /usr/local/nginx/sbin/nginx -s stop #停止
sudo /usr/local/nginx/sbin/nginx -s reload #重启

写入环境变量

如果给所有用户永久添加环境变量: vim /etc/profile ,或者只给当前用户永久添加环境变量:vim ~/.bashrc

文件末尾添加:export PATH="/usr/local/nginx/sbin/:$PATH"

然后执行:source ~/.bashrc

安装完成后查看版本:nginx -v

然后,通过浏览器打开你的服务器的公网IP:

image-20241112143735020

配置Nginx支持PHP

修改nginx.conf

修改nginx的配置文件:vim /usr/local/nginx/conf/nginx.conf

如果怕改错,记得提前先备份一下 nginx.conf

#修改为当前的用户和用户组,我这里是admin admin
#切记:这里需要先写用户,再写用户组,如果只写一个会出问题!!!
user admin admin;
#...
 
http {
    #可选,是否显示目录(既然是云服务器了,为了安全起见,那就不建议显示了)
    #autoindex on; #自动显示目录
    #autoindex_exact_size off; #人性化方式显示文件大小否则以byte显示
    #autoindex_localtime on; #按服务器时间显示,否则以gmt时间显示
    
    #...
 
    server {
        location / {
            root   /home/admin/www; #代码根目录
            index  index.html index.htm index.php;
        }
 
        #配置nginx支持PHP,一般默认就有下面这些内容,去掉注释即可:
        location ~ \.php$ {
            root           /home/admin/www;
            #fastcgi_pass   127.0.0.1:9000; 
            fastcgi_pass   unix:/run/php/php7.3-fpm.sock;
            fastcgi_index  index.php;
            #注意下面这行,默认是/scripts,需要改为$document_root
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; 
            include        fastcgi_params;
        }
 
    }
 
}

image-20241112152500394

说明:上面的 fastcgi_pass 部分具体用哪个,取决于刚开始安装PHP的时候,你配置的fpm的监听端口。

去看看 /etc/php/7.3/fpm/pool.d/www.conflisten 部分。

如果用的fpm默认的/run/php/php7.3-fpm.sock ,记得给前面加一个unix:

image-20241112144651184

然后,重启nginx:

nginx -s reload

在自定义的代码根目录分别创建一个html文件和一个php文件,并写入内容,测试一下。我这里的目录是/home/admin/www

cd /home/admin/www
touch test.html
touch phpinfo.php

访问

打开浏览器,分别访问两个文件:

image-20241119135850305

运行PHP问题

可以发现,运行html没问题,但是运行php报错了。具体报的什么错,需要去日志里查看:tail /usr/local/nginx/logs/error.log

image-20241112151200150

可以看出来,问题在于/run/php/php7.3-fpm.sock 的权限问题。我们查看一下这个文件的权限信息:

image-20241119141810568

还记得吗?上面我们配置nginx.conf的时候,配置的用户信息是 user admin admin

因此,需要把这个/run/php/php7.3-fpm.sock 的权限也改为admin

chown admin:admin /run/php/php7.3-fpm.sock

同时,需要修改 /etc/php/7.3/fpm/pool.d/www.conf 的用户和用户组,也改为admin

#sudo vim /etc/php/7.3/fpm/pool.d/www.conf
 
#用户和用户组
user = admin
group = admin
 
#监听,需要和nginx的 fastcgi_pass相对应
#如果这里是listen = 9000,那么nginx的 fastcgi_pass就是:fastcgi_pass 127.0.0.1:9000;
listen = /run/php/php7.3-fpm.sock
 
listen.owner = admin
listen.group = admin

image-20241112152240468

然后,记得重启 php-fpm 进程(很重要!):sudo systemctl restart php7.3-fpm.service

再次尝试打开 phpinfo.php

image-20241119141843662

扩展:修改Ubuntu的命令行的主机名称:

vim /etc/hostname 改为新的名称,然后重启系统:reboot 即可。

配置Nginx虚拟主机

配置文件

修改 /usr/local/nginx/conf/nginx.conf 最后一个结尾花括号前面添加:

include vhost/*.conf;

然后在 /usr/local/nginx/conf 目录下创建vhost目录,并且继续在vhost目录中新增test1.com.conf

# vim /usr/local/nginx/conf/vhost/test1.com.conf

server {
        listen          9001; # 自定义端口
        server_name     test1.com www.test1.com;
        index           index.php index.html index.htm;
        root            /home/admin/www/test1_com;
        access_log      /home/admin/logs/nginx_logs/test1com-access.log;
        error_log       /home/admin/logs/nginx_logs/test1com-error.log;

        location ~ \.php(.*)$ {
            fastcgi_pass   unix:/run/php/php7.3-fpm.sock;
            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;
        }

        location / {
            if (!-e $request_filename) {
                rewrite  ^(.*)$  /index.php?s=/$1  last;
                break;
            }
        }

        if (!-e $request_filename) {
            rewrite ^(/index\.php)?/(.*)$  /index.php/$2 break;
        }
}

配置好之后,重启Nginx:nginx -s reload

特别说明:

上面的配置内容,我是按照 thinkphp6 项目来配置的,可以支持PATHINFO模式访问。

可以自定义端口,如果没有域名的情况下,可以通过公网IP加上这里自定义的端口号访问到虚拟主机的网站。需要去阿里云后台配置对外开放的端口:

image-20241112175447070

Access denied问题

然后在浏览器访问 9001 端口,发现页面报错:Access denied.

查看错误日志:

FastCGI sent in stderr: "Access to the script '/home/admin/www/test1_com' has been denied (see security.limit_extensions)" while reading response header from upstream

image-20241112175336352

解决方案:

找到php.ini 文件,vim /etc/php/7.3/fpm/php.ini

找到 cgi.fix_pathinfo 将后面的值改为1

然后重启php-fpm (systemctl restart php7.3-fpm.service),问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农兴哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值