文章目录
最近自购了一个阿里云服务器,系统镜像为Ubuntu 22.04
,在编译安装LNMP(nginx+php+mysql
)环境的时候,踩了不少坑,因此决定把自己安装的过程记录下来,以备后用。
本篇文章基本上属于保姆级别的教程,只要你的系统也是Ubuntu,基本上无脑式复制粘贴运行,就能搭建起LNMP的环境。如果在操作过程中遇到了各种奇怪的问题,可以具体问题具体网上搜索结果。
安装MySQL5.7
下载和解压
在MySQL官网下载Linux的指定版本,我这里下载5.7版本:https://downloads.mysql.com/archives/community/
打开链接后,具体选项参考下图所示(你可以改成你自己的系统版本),选择 DEB Bundle
,在后面的Download按钮右键复制链接地址。
然后在服务器的自定义目录下,使用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/
目录后,可以看到下面这些文件:
编译安装
接下来,按照顺序依次执行下面的命令:
#使用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
不出意外,应该就会出现输入密码的界面:
连接试试
输入两次密码后,mysql就安装好了。接下来,连接一下试试:
重启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
端口:
通过以上的设置后,就可以在其他电脑上连接自己服务器的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版本:
备注:PHP7的其它小版本(PHP7.1、PHP7.2、PHP7.4) 的安装方式和上面的操作流程类似。
安装Nginx
下载
可以直接通过 apt install nginx
,但是这样安装后配置PHP的时候各种问题。后来懒得折腾了,就重新安装一个nginx,操作如下:
进入官网下载指定版本,我这里下载当前最新版 nginx-1.27.2:http://nginx.org/en/download.html
安装
打开链接后,还是右键复制链接地址,然后通过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:
配置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;
}
}
}
说明:上面的 fastcgi_pass
部分具体用哪个,取决于刚开始安装PHP的时候,你配置的fpm的监听端口。
去看看 /etc/php/7.3/fpm/pool.d/www.conf
的 listen
部分。
如果用的fpm默认的/run/php/php7.3-fpm.sock
,记得给前面加一个unix:
然后,重启nginx:
nginx -s reload
在自定义的代码根目录分别创建一个html文件和一个php文件,并写入内容,测试一下。我这里的目录是/home/admin/www
cd /home/admin/www
touch test.html
touch phpinfo.php
访问
打开浏览器,分别访问两个文件:
运行PHP问题
可以发现,运行html没问题,但是运行php报错了。具体报的什么错,需要去日志里查看:tail /usr/local/nginx/logs/error.log
可以看出来,问题在于/run/php/php7.3-fpm.sock
的权限问题。我们查看一下这个文件的权限信息:
还记得吗?上面我们配置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
然后,记得重启 php-fpm 进程(很重要!):sudo systemctl restart php7.3-fpm.service
再次尝试打开 phpinfo.php
扩展:修改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加上这里自定义的端口号访问到虚拟主机的网站。需要去阿里云后台配置对外开放的端口:
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
解决方案:
找到php.ini
文件,vim /etc/php/7.3/fpm/php.ini
找到 cgi.fix_pathinfo
将后面的值改为1
然后重启php-fpm (systemctl restart php7.3-fpm.service
),问题解决。