Jimmy小站
小明也有大梦想 — 蒋明/铭Ubuntu+Nginx+MySQL+PHP配置+MySQL远程无法连接问题
2018-09-08 / 开发环境配置 / 4292 次围观 / 0 次吐槽前言
首先我想说明一下,本文是基于阿里云配置php运行环境的的教程,目的是为了搭建本博客网站。本博客原本于14年底就已经搭建好并且正常运行了,怎奈前几天遭到黑客的攻击,系统崩溃数据丢失,只好从头再来。好在通过之前的数据备份恢复了部分博文。于是想,刚好手头重温了一遍搭建运行环境的整个过程,就想着把它记录下来。
总体步骤
- 安装MySQL(MariaDB),Nginx,PHP
- 解决MySQL无法远程连接问题
- 修改Nginx与PHP配置文件,使得Nginx接收到的PHP请求转发至php-fpm 进行处理
搭建过程
在Ubuntu中安装这些组件都是非常方便的,我们一般只要使用apt安装
//安装数据库
apt install -y mariadb
//安装Nginx
apt install -y nginx
//首先我解释一下,本实验是安装的PHP7.0,因此相对应的组件也都是与版本一致的。php7.0-mysql是连接MySQL数据口必要的依赖包,php7.0-fpm是Nginx和PHP之间的桥梁,它能够把PHP写的应用程序运行起来并且提供一个接口给Nginx
apt install -y php7.0 php7.0-mysql php7.0-curl php7.0-json php7.0-cgi php7.0-fpm php7.0-xml
接下来的步骤就是将MySQL数据库配置好,设置用户账号密码等,因为在安装MariaDB的时候,并没有提醒我们设置密码,因此默认是root用户并且密码为空。所以我们现在需要进入到数据库中修改
//在shell输入,因为暂时没有密码,所以直接就能进入数据库
sudo mysql -uroot -p
//选择mysql数据库(这个数据库里面存放着MySQL的各种属性配置等)
use mysql
MariaDB [mysql]> select user, host, authentication_string, plugin from user;
+------+------+-----------------------+-----------------------+
| user | host | authentication_string | plugin |
+------+------+-----------------------+-----------------------+
| root | % | | mysql_native_password |
+------+------+-----------------------+-----------------------+
1 row in set (0.01 sec)
在早期MySQL版本中密码是password一栏,现在已经变成authentication_string一栏。我们可以update一下这个
//更新密码字段
update user set authentication_string = PASSWORD('your_password') where user = 'root';
//刷新权限
flush privileges;
配置数据库远程连接
密码已经修改好了,本地应用访问数据库已经没有问题。但是如果我们要能够远程访问数据库,还需要注意更多细节(本人被远程各种无法访问折磨,最终将几乎所有的坑都踩了一遍,遂一一记之)。
首先我们要确认MySQL用户的一个plugin字段(请往上面一个查询结果看)。这个字段说明这个用户的连接时要申请调用哪个方法响应,当时我数据库中默认是“unix_socket”,这样的话,这个用户是不会去监听远程客户端的请求的,因为它只会调用接收本地socket通信的进程请求的方法。查阅MySQL用户手册之后发现要修改成“mysql_native_password”,当然这还没完,同步的,我们还要修改host属性,这个属性也会限制响应哪些请求,改成“%”表示任意IP都能使用这个用户登录。遂修改之
//修改root用户的host、plugin属性
update user set host = '%', plugin = 'mysql_native_password' where user = 'root';
到这里呢,数据库表的设置就告一段落了,你以为成功了吗?事实证明我还是太天真了,有些事情总比我们想象的要复杂太多。当然了,我还是有百折不挠的不屈精神的,一个小小的配置问题都搞不定?不可能!
接下来各种找原因,首先看看端口能不能被远程访问。我再自己windows电脑上使用telnet访问3306端口(telnet不清楚的自行百度,本文不做解释)发现端!口!都!访!问!不!了!明显有问题,我开始检查ufw的配置,是不是防火墙阻拦了。检查之后发现没有问题,后来我甚至把防火墙都给关了,也还是不行。然后我尝试在MySQL的本机检查
root@iZuf6fc5w5h9ntb71xpn10Z:~# netstat -nap |grep mysql
tcp 0 0 127.0.0.1:3306 :::* LISTEN 6949/mysqld
tcp 0 0 172.19.26.206:3306 202.120.121.47:54274 ESTABLISHED 6949/mysqld
tcp 0 0 172.19.26.206:3306 202.120.121.47:54271 ESTABLISHED 6949/mysqld
unix 2 [ ACC ] STREAM LISTENING 86747 6949/mysqld /var/run/mysqld/mysqld.sock
现问题出在这里,看tcp的listen那条记录,整个MySQL竟然只监听本地进程的请求。因该是MySQL的配置文件不对。再次查阅MySQL文档发现my.cnf配置文件中有一个属性”bind-address = 127.0.0.1”(MariaDB配置在“/path/to/mysql/mariadb.conf.d/50-server.cnf”)。这里又有一道强行限制只能本地连接的配置,而且默认只能本地连接。简直不要太恶心。想要能够被外部访问,需要注释这一行.完成之后 再查看MySQL端口情况
root@iZuf6fc5w5h9ntb71xpn10Z:/etc/mysql/mariadb.conf.d# netstat -nap |grep mysql
tcp 0 0 :::3306 :::* LISTEN 6949/mysqld
tcp 0 0 172.19.26.206:3306 202.120.121.47:65156 ESTABLISHED 6949/mysqld
现在已经可以监听所有端口了,然后远程尝试用这个用户登录,成功。
如果是阿里云的用户还要检查一下,在云服务器的控制面板中添加安全规则开放3306以及其他需要的端口
接下来就是就是如何配置Nginx
配置文件一般位于/ path/to/nginx/sites-available/default
# Default server configuration
#
server {
# 监听端口,如果是https 就是443
listen 80 default_server;
listen [::]:80 default_server;
#项目根目录
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
# 域名,即如果是通过访问jimmyme.net域名到达的本服务器,就用这个server响应。这对同一台服务器配置多个虚拟主机很有用。
server_name jimmyme.net;
# 访问 https://jimmyme.net/时
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# 所有的PHP请求转到这里
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php7.0-cgi alone:
#fastcgi_pass 127.0.0.1:9000;
# With php7.0-fpm:
# 通过socket与php7.0-fpm 通信,优点是性能可能更好,不占用端口,但是相对IP通信,可能偶尔请求失败.这里的配置一定要与php-fpm的配置一致,否则会报错。这个/run/php/php7.0-fpm.sock是php-fpm进行socket通信的程序所在路径
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
然后是php-fpm的配置
通常配置文件在(/path/to/php/fpm/pool.d/www.conf) 里面有一个listen参数
//配置内容有删减,直接找到对应的属性名修改值即可
user = www-data
group = www-data
//Note: This value is mandatory.
//此处要与Nginx配置文件中的fastcgi_pass一致
listen = /run/php/php7.0-fpm.sock
如果没有特殊要求,其他保持不变
需要注意的一点是,user, group需要跟/path/to/nginx/nginx.conf 配置文件第一行的 user属性要一致
额 本文暂时没人评论 来添加一个吧
发表评论