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属性要一致

推荐您阅读更多有关于“PHPNginxMySQLUbuntu,”的文章

[一个Java程序猿的转型之路,读研深造,专注机器学习推荐算法]
本站所有文章如无特别注明均为原创。作者:吉米酱 ,复制或转载请以超链接形式注明转自 Jimmy小站
原文地址《Ubuntu+Nginx+MySQL+PHP配置+MySQL远程无法连接问题
额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright © Jimmy小站 Allrights Reserved.备案号:桂ICP备 15005996