LNMP架构环境部署(yum安装方式)

1、使用官方仓库安装 Nginx
#可能优先使用epel里的源,怎么确保我们配置的 官方优先。
[root@web01 ~]$yum -y install yum-plugin-priorities
[root@web01 ~]$ rpm -qa yum-plugin-priorities 
yum-plugin-priorities-1.1.31-54.el7_8.noarch

[root@web01 ~]$ cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo 
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
priority=1    #增加优先参数,使得官方源优先epel源。

#安装Nginx
[root@web01 ~]$ yum install nginx -y
2、配置Nginx进程运行的用户
[root@web01 ~]$ useradd -u1111 www -s /sbin/nologin -M 
[root@web01 ~]$ sed -i '/^user/c user www;' /etc/nginx/nginx.conf
[root@web01 ~]$ grep "^user" /etc/nginx/nginx.conf
3、启动Nginx,并将Nginx加入开机自启
[root@web01 ~]$ systemctl start nginx 
[root@web01 ~]$ systemctl enable nginx
[root@web01 ~]$ lsof -i:80 #查看端口对应的服务
[root@web01 ~]$ nginx -v #查看版本
nginx version: nginx/1.22.1
[root@web01 ~]$curl 10.0.0.7 # Welcome to nginx!表示正常
4、使用第三方扩展源安装php7.1
#(1)配置PHP安装源
wget https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
#如果下载失败加下面参数
wget https://mirror.webtatic.com/yum/el7/webtatic-release.rpm --no-check-certificate
yum -y install epel-release    #安装epel源 /etc/yum.repos.d/epel.repo
rpm -Uvh webtatic-release.rpm #安装PHP第三方源
rpm -ql webtatic-release-7-3
rpm -ql epel-release

#如果上述安装源有问题可以使用下面的配置看看 
#PHP下载地址:
https://us-east.repo.webtatic.com/yum/el7/x86_64/ 
https://uk.repo.webtatic.com/yum/el7/x86_64/

#卸载旧版本的php
[root@web01 tools]$ rpm -e $(rpm -qa|grep php) 
[root@web01 tools]$ rpm -qa|grep php
[root@web01 tools]$ rm -f /etc/php.ini.rpmsave

#安装PHP及相关插件
yum install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd -y
yum install php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd -y
yum install php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb -y

###企业场景中由开发人员给你编译的参数(他开发的软件)。可以比他多,不能少。
########## 本地安装,不用 ##########
安装php7版本的软件【本地】
[root@web01 ~]# unzip php.zip #提前去官方下载好,然后执行 下面的安装
[root@web01 ~]# yum localinstall php/*.rpm -y
###################################

配置php-fpm用户与Nginx的运行用户保持一致
[root@web01 tools]$egrep "^user|^group" /etc/php-fpm.d/www.conf 
user = apache
group = apache
#替换用户
[root@web01 code]$ sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf 
[root@web01 code]$ sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf

#检查
[root@web01 tools]$egrep "^user|^group" /etc/php-fpm.d/www.conf 
user = www
group = www

启动php-fpm,并将其加入开机自启
[root@web01 ~]$ systemctl start php-fpm
[root@web01 ~]$ systemctl enable php-fpm
#检查
[root@web01 tools]$lsof -i :9000
[root@web01 tools]$ps -ef|grep php
5、安装mariadb数据库
[root@web01 ~]$ yum install mariadb-server mariadb -y
启动Mariadb数据库, 并加入开机启动
[root@web01 ~]$ systemctl start mariadb
[root@web01 ~]$ systemctl enable mariadb
#检查
[root@web01 ~]$lsof -i :3306
[root@web01 ~]$ps -ef|grep mariadb

[root@web01 blog]$ mysql #直接进去
给Mariadb配置登陆密码,并设置新密码进行登录数据库
[root@web01 ~]$ mysqladmin -uroot password oldboy123
[root@web01 ~]$ mysql -uroot -poldboy123
[root@web01 ~]$ mysqladmin -uroot -poldboy123 password oldboy #有密码更改密码
#php测试,配置hosts文件
#Nginx连接Fastcgi服务器配置如下
[root@web01 blog]$cat /etc/nginx/conf.d/blog.conf 
server {
    listen 80;
    server_name blog.shnne.org; 
    root /data/blog;
    index index.php index.html;

    location ~ \.php$ {
        fastcgi_pass    127.0.0.1:9000; 
        fastcgi_index    index.php; 
        fastcgi_param    SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include    fastcgi_params;
    }
}
在/data目录下创建test_php.php文件
[root@web01 ~]$ mkdir /data/blog -p
[root@web01 ~]$ chown -R www.www /data/blog
[root@web01 ~]$ cat /data/blog/test_php.php
<?php
phpinfo();
?>
#浏览器测试
http://blog.shnne.com//test_php.php

#mariadb测试
[root@web01 ~]$ cat /data/blog/test_mysql.php
<?php 
    $servername = "localhost"; 
    $username = "root"; 
    $password = "oldboy123"; 
    // 创建连接 
    $conn = mysqli_connect($servername, $username, $password); 
    // 检测连接 
    if (!$conn) { 
    die("Connection failed: " . mysqli_connect_error()); 
    } 
    echo "php连接MySQL数据库成功。"; 
?>
#浏览器测试
http://blog.shnne.org/test_mysql.php
6、扩展:企业级应用实战案例:科学授权站点目录权限和属组方法
#(1)生产授权方案(新手可不用):
[root@web01 blog]# chown -R root.root /data/blog 
[root@web01 blog]# mkdir -p /data/blog/uploads
[root@web01 blog]# chown -R www.www /data/blog/uploads #此目录可能没有。
[root@web01 blog]# ll wp-content/ 
plugins ##blog增加功能 root.root 
themes ##blog主题皮肤 root.root 
uploads   ##上传目录www.www
#(2)LNMP企业级核心安全优化思想:
chown -R www.www /data/blog/uploads/    #安全隐患很大。
#黑客会放Webshell.php木马到/data/blog/upload/来遍历文件插入广告 或者提权root。
#执行放的webshell,http://xx/upload/webshell.php ##轮询站点, 改所有站点文件,嵌入它的广告
#网站安全防护露点: 对外:http,https(控制这里),没办法白名单。 对内:ssh(禁止对外访问),可以白名单。

# (3)#针对80端口安全防护限制: 
1.php程序控制,上传的程序扩展名不能是.php,.sh等等 
2.访问/data/blog/upload/(*.php    return 403) 
location /upload/ \.php$ {
return 403
} 
3.挂载NFS
mount,noexec,nosuid 
4.通过架构,限制动态请求方法
location /upload/ 禁止GET,不能浏览。 解决方法:动静分离 动态:location /upload/ 禁止GET,不能浏览。 静态:没有PHP环境
location /upload/

5.配置waf防火墙或者开发第三方安全模块(比如还可以控制sql语句执行等)
6.永远确保站点权限最优
#工作启动Nginx脚本:start_nginx.sh 
chown -R root.root /data/blog
chown -R www.www /data/blog/uploads
#启动前做站点目录,权限和用户做检查。
#检测:权限、用户和组不对,自测、报警。。省略检测脚本100行。提供思路 
systemctl reload nginx
# (4) 因blog需要使用数据库, 所以需要建立blog数据库,并授予指定权限
[root@web01 ~]# mysql -uroot -poldboy123 
mysql> create database blog;
mysql> exit;
7、扩展:企业级应用实战案例:采用异地db01.etiantian.org方式访问数据库,而不是本机localhost
######
MariaDB [(none)]> create database blog; #创建blog数据库 
MariaDB [(none)]> show databases; #查看
MariaDB [(none)]> grant all privileges on blog.* to blog@'172.16.1.%' identified by 'oldboy123';#创建用户密码并 授权。
MariaDB [(none)]> flush privileges; 
Query OK, 0 rows affected (0.00 sec)

#####
all privileges为所有权限: 本次科学权限:select,delete,insert,update,create,alter 
工作中生产线应该:select,delete,insert,update 针对数据内容 
create,alter 表结构,库结构。
#一定一定由DBA或运维控制。 企业故障案例:
表结构被开发修改了,导致运维背锅。 最终比对备份的表结构和上线数据库表结构,发现开发改了表结构。 
解决办法:收回select,delete,insert,update以外的权限由DBA控制。
因为创建好blog用户并授权密码,但是登录提示失败
上述配置网页链接数据库出现故障,解决办法如下: 
[root@web01 blog]# mysql -uroot -poldboy123 
MariaDB [(none)]> #删除无用的用户
MariaDB [(none)]> drop user ''@'localhost'; 
MariaDB [(none)]> drop user ''@'web01'; 
MariaDB [(none)]> drop user 'root'@'web01';
MariaDB [(none)]> drop user 'root'@'::1';
MariaDB [(none)]> select user,host from mysql.user;
+------+--------------------------+
| user | host    |
+------+--------------------------+
| root | 127.0.0.1    |
| root | localhost    |
+------+--------------------------+
4 rows in set (0.00 sec)
#重新授权
MariaDB [(none)]> grant all privileges on blog.* to 'blog'@'172.16.1.%' identified by 'oldboy123'; 
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> quit

#退出测试,如果能登录表示OK。
[root@web01 blog]# mysql -ublog -poldboy123 -h172.16.1.7 
MariaDB [(none)]>
#修改/etc/hosts为如下
[root@web01 blog]# grep db01 /etc/hosts
172.16.1.7 db01 db01.etiantian.org #db01.etiantian.org为连 接数据库的域名。
5) 通过浏览器访问blog, 并部署该产品
数据库名blog
账户名blog
密码oldboy123
数据库主机 不用localhost
表前缀 oldboy_