# Linux 基础网络服务环境搭建和配置

> 既然有台云服务器，干嘛要让他吃灰呢？除了让他“剧烈运动”外，还可以让他适当的发挥其他作用。

[TOC]

## LNMP 环境

> **啥是 LNMP ?**
>
> LNMP 指的是 Linux Nginx Mysql PHP，这四大天王。

以下操作是在 CentOS 7.6 系统环境以及非 root 用户下进行的。

### Nginx 安装

为 CentOS 包管理 yum 配置 EPEL 源

```bash
sudo yum install -y epel-release
sudo yum -y update
```

开始安装 Nginx 包

```bash
sudo yum install nginx
```

使用 yum 包管理安装的 Nginx 的默认各常用文件目录路径如下：

默认网站目录：`/usr/share/nginx/html`

配置文件：`/etc/nginx/nginx.conf`

网站配置文件目录：`/etc/nginx/conf.d`

### Nginx 操作

启动、停止和重启 Nginx 服务

```bash
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
```

启用和禁用开机自启动

```bash
sudo systemctl enable nginx
sudo systemctl disable nginx
```

配置文件测试错误和重载配置文件

```bash
sudo nginx -t
sudo nginx -s reload
```

### MySQL 和 SQLite3 安装

这里我用 MariaDB 替换了 MySQL 数据库。

直接通过 yum 包管理安装 MariaDB

```bash
sudo yum install mariadb-server
```

安装完后进行初始化配置

```bash
sudo mysql_secure_installation
```

一般来说，系统都会自带 SQLite3 数据库的，输入 `sqlite3` 测试是否已安装，如未安装也可直接通过 yum 包管理进行安装

```bash
sudo yum install sqlite-devel
```

### MariaDB 操作

启动、停止和重启 MySQL 服务

```bash
sudo systemctl start mariadb
sudo systemctl stop mariadb
sudo systemctl restart mariadb
```

启用和禁用开机自启动

```bash
sudo systemctl enable mariadb
sudo systemctl disable maridb
```

### PHP 7.4 安装

通过 yum 包管理安装

```bash
sudo yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
sudo yum -y install yum-utils
sudo yum-config-manager --enable remi-php74
sudo yum install php php-cli php-fpm php-mysqlnd php-zip php-devel php-gd php-mcrypt \
 php-mbstring php-curl php-xml php-pear php-bcmath php-json  \
 php-xmlrpc php-pdo  php-pecl-zip php-intl php-common php-imap php-odbc
```

### PHP 操作

启动、停止和重启 Nginx 服务

```bash
sudo systemctl start php-fpm
sudo systemctl stop php-fpm
sudo systemctl restart php-fpm
```

启用和禁用开机自启动

```bash
sudo systemctl enable php-fpm
sudo systemctl disable php-fpm
```

## LNMP 环境配置

### Nginx 与 PHP 配置

修改 php.ini 配置文件的  cgi.fix_pathinfo 配置项为 0

```bash
sudo vim /etc/php.ini
```

```ini
 cgi.fix_pathinfo = 0
```

修改 www.conf 配置文件的运行用户和用户组，确保和 Nginx 的运行用户一致

```bash
sudo vim /etc/php-fpm.d/www.conf
```

```ini
user = nginx
group = nginx
```

重启 php-fpm 服务

```bash
sudo systemctl restart php-fpm
```

创建一个 HTTPS 协议，并配置 PHP CGI 以运行 PHP 文件的站点配置

```bash
sudo vim /etc/nginx/conf.d/newsite.conf
```

```
server {
    listen      80;
    server_name 127.0.0.1;
    rewrite ^(.*) https://$server_name$1 permanent;
}
server {
    listen      443 ssl;
    server_name 127.0.0.1;

	# HTTPS_SSL_config
    ssl_certificate     /etc/nginx/cert/****.pem;
    ssl_certificate_key  /etc/nginx/cert/****.key;
    ssl_session_timeout  5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

	# Website root dir config
    location / {
        root    /www/newsite;
        index   index.html;
        try_files $uri $uri/ $uri.php$is_args$args;
    }

	# PHP run config
    location ~ \.php$ {
        root           /www/random;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        include        fastcgi_params;
    }
}
```

测试和重载配置文件

```bash
sudo nignx -t
sudo nginx -s reload
```

### PHP 配置 SQLite3 拓展

如果你的 PHP 安装目录下没有 ext 这个拓展文件夹，那么先通过命令寻找目录

``` bash
sudo find / -name 'sqlite*'
```

通过上面的命令查找所有关于 sqlite 的文件路径

`/opt/remi/php74/root/usr/lib64/php/modules/sqlite3.so`

上面是我服务器的路径，路径地址因环境而异

打开 php.ini 配置文件，并修改下面五项配置，如果没有该配置项就追加进去

```bash
sudo vim /etc/php.ini
```

```ini
extension_dir = "/opt/remi/php74/root/usr/lib64/php/modules/"

extension=pdo.so
extension=sqlite.so
extension=pdo_sqlite.so

sqlite3.extension_dir = "/opt/remi/php74/root/usr/lib64/php/modules/"
```

重启 php-fpm 服务

```bash
sudo systemctl restart php-fpm
```

### MySQL 开启远程登陆

在服务器进入数据库

```bash
mysql -uroot -p
```

更新用户表里面的 root 用户的 Host 字段

```mysql
use mysql;
UPDATE user SET Host=@'%' where user='root' AND Host='localhost' LIMIT 1;
FLUSH PRIVILEGES;
```

查看更新后的数据

```mysql
SELECT User, Password, Host FROM user;
```

在服务器运营商的网站管理页面的防火墙里，增加 3306 数据远程访问端口规则