LNMP1910
< 返回列表时间: 2019-10-14来源:OSCHINA
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
LNMP环境
Linux + Nginx + MySQL/Mariadb + PHP
Nginx: 是一个WEB服务器,提供HTTP服务的。
MySQL/MariaDB: 是一个关系型数据,用来存数据的(用户名、密码、文章内容)
PHP:是一个编程语言,常用来做网站
Nginx是一个WEB服务器,所以用户首先访问到的就是Nginx(静态的请求,会处理图片、js、css,
接收php的请求,但是不处理)把php的请求转给后面的php-fpm
php-fpm 会处理php相关的请求(叫做动态的请求)
动态、静态
所谓静态,指的是Nginx可以直接处理的图片、js、css、视频、音频、flash等等
所谓动态,指的是这些请求需要和数据库打交道。比如,用户登录过程,比如查看一篇文章,或者写一篇文章
MariaDB的安装:
MariaDB是MySQL的一个分支。 MySQL --> SUN --> Oracle
维基百科: https://zh.wikipedia.org/wiki/MariaDB#cite_note-103_release-21
官网 https://mariadb.org/
下载:
cd /usr/local/src/
wget http://mirrors.neusoft.edu.cn/mariadb/mariadb-10.3.17/bintar-linux-x86_64/mariadb-10.3.17-linux-x86_64.tar.gz
tar zxf mariadb-10.3.17-linux-x86_64.tar.gz
mv mariadb-10.3.17-linux-x86_64 /usr/local/mysql
mkdir -p /data/mysql
useradd -M -s /sbin/nologin mysql
chown -R mysql:mysql /data/mysql
cd /usr/local/mysql
./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
cp support-files/mysql.server /etc/init.d/mysqld

vi /etc/init.d/mysqld
定义:basedir=/usr/local/mysql
datadir=/data/mysql
vi /etc/my.cnf
定义:datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mariadb.log
pid-file=/data/mysql/mariadb.pid
查看服务: ps aux |grep mysql
查看监听端口:netstat -lnp //看是否有3306




解压:
解压 .tar.gz: tar zxvf xxxx.tar.gz z 相对于针对gz压缩 gzip 1.txt ; gzip -d 1.txt.gz
解压 .tar.bz2: tar jxvf xxxx.tar.bz2 j 相对于针对bz2压缩 bzip2 1.txt ; bzip2 -d 1.txt.bz2
解压 .tar.xz tar Jxvf xxxx.tar.xz J 相对于针对xz压缩 xz 1.txt ; xz -d 1.txt.xz
压缩并打包: tar zcvf 123.tar.gz 123/
tar jcvf 123.tar.bz2 123/
如何验证一条命令是否正常?
敲完这条命令之后,马上运行 echo $? ,看其输出是否是0,如果是非0说明你这个命令有错误。
错误:
error while loading shared libraries: libaio.so.1: cannot open shared object file:
No such file or directory
解决: yum install -y libaio libaio-devel
服务管理:
CentOS6: chkconfig --list //列出系统所有的服务
CentOS7: systemctl list-unit-files
6: chkconfig --add mysqld //增加服务到列表,前提是mysqld文件需要在/etc/init.d/下,并且权限755
6:chkconfig mysqld on //让其开机启动
6:/etc/init.d/mysqld start == service mysqld start


MySQL/MariDB连接:
/usr/local/mysql/bin/mysql -uroot
直接敲mysql命令:ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
系统环境变量PATH: echo $PATH
PATH的作用:可以直接用PATH这些路径里面的文件,不用敲绝对路径了。
PATH=$PATH:/usr/local/mysql/bin
echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
退出终端重新进,或者 source /etc/profile
设定密码:mysqladmin -uroot password "aminglinux"
再次登录: mysql -uroot -paminglinux
mysql -uroot -paminglinux -S/tmp/mysql.sock
mysql -uroot -paminglinux -h192.168.190.128 -P3306
Alias别名:
一条命令的另外一个名字,你可以理解为外号。
举例:
网卡配置文件路径很长,每次敲这个命令都要花很长时间,可以做一个别名:
alias viens33='vi /etc/sysconfig/network-scripts/ifcfg-ens33'
vi ~/.bashrc //针对当前用户的,换一个用户就不好使了
vi /etc/bashrc //针对所有用户,不仅仅是当前用户。
在这个文件最后面增加:alias viens33='vi /etc/sysconfig/network-scripts/ifcfg-ens33'
PHP的安装:
下载PHP
cd /usr/local/src
wget http://cn2.php.net/distributions/php-7.3.9.tar.bz2
解压
tar jxvf php-7.3.9.tar.bz2
编译
cd php-7.3.0
编译参数:
./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl --with-openssl
错误1:
checking for cc... no
checking for gcc... no
解决: yum install -y gcc
错误2:

error: libxml2 not found
解决:yum install -y libxml2-devel
错误3:

error: Cannot find OpenSSL's
解决:yum install -y openssl-devel
错误4:
error: cURL version 7.15.5 or later is required
解决:yum install -y libcurl-devel
错误5:
configure: error: jpeglib.h not found
解决:yum install -y libjpeg-turbo-devel
错误6:
configure: error: png.h not found
解决:yum install -y libpng-devel
错误7:
configure: error: freetype-config not found.
解决: yum install -y freetype-devel
错误8:
configure: error: wrong mysql library version or lib not found
解决:下载一个低版本的MySQL/Mariadb
wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz
tar jxvf mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.6.39-linux-glibc2.12-x86_64 /usr/local/mysql5.6
改编译参数
./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql5.6 --with-mysqli=/usr/local/mysql5.6/bin/mysql_config --with-pdo-mysql=/usr/local/mysql5.6 --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl --with-openssl
错误9:

ERROR: [pool www] cannot get uid for user 'php-fpm'
解决:useradd php-fpm
make
make install
配置文件:
cd /usr/local/php-fpm/
cp php-fpm.conf.default php-fpm.conf
cd /usr/local/src/php-7.3.0
cp php.ini-development /usr/local/php-fpm/etc/php.ini
cd /usr/local/php-fpm/etc/php-fpm.d/
cp www.conf.default www.conf

启动脚本:
cd /usr/local/src/php-7.3.0
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on
chmod 755 /etc/init.d/php-fpm
补充:
vi 里面在一般模式下,按dd可以删除行(剪切),5dd(剪切5行),光标挪到要粘贴的位置,按p。
操作错误之后,想要撤销,可以按u,反着撤销按 ctrl r;
一般模式下按gg可以把光标定位到首行,按G可以定位到末行;
按yy复制,5yy复制5行;
显示行号,在一般模式里输入:set nu;
定位到指定的行:一般模式下直接按数字G,如10G

编译安装一个软件包的步骤:
./configure ; make; make install
grep -i 忽略大小写
补充:
diff 查看两个文件的差异的,如 diff 1.txt 2.txt
Nginx的安装:
官网:http://nginx.org/
官方文档:http://nginx.org/en/docs/install.html
下载:
wget http://nginx.org/download/nginx-1.16.2.tar.gz
解压:
tar zxvf nginx-1.16.2.tar.gz
cd nginx-1.16.2
编译:
./configure --prefix=/usr/local/nginx --with-http_ssl_module
make && make install
启动:
/usr/local/nginx/sbin/nginx
Nginx的默认虚拟主机:
虚拟主机:
HTTP1.1 --> host (域名) 一个WEB服务可以有多个站点
定义虚拟主机配置文件,以域名为命名。
iptables -nvL 查看防火墙规则
CentOS7 firewalld
自带firewalld服务,开启状态。
关闭firewalld服务: systemctl stop firewalld
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
Nginx配置:
nginx -t //查看配置文件是否有错误
nginx -s reload //重载配置文件
systemctl restart nginx //重启
/etc/hosts:
vi /etc/hosts //增加
192.168.222.128 www.aaa.com
默认虚拟主机:
就是Nginx的第一个虚拟主机。
泛解析
禁掉默认虚拟主机,加一行 deny all;




补充:
快捷键 Ctrl z可以暂停一个进程。 比如,vi的时候,可以先退出vi,然后释放命令行出来。
按fg 就可以回到vi窗口里。
安装worrdpress
下载: https://cn.wordpress.org/download/
wget https://cn.wordpress.org/wordpress-5.0.2-zh_CN.tar.gz
安装worrdpress
下载: https://cn.wordpress.org/download/
wget https://cn.wordpress.org/wordpress-5.0.2-zh_CN.tar.gz
tar zxvf xxx
mv wordpress/* /data/wwwroot/blog.aminglinux.cc/
访问http://blog.aminglinux.cc/
设置数据库
创建库:create database blog;
创建用户:grant all on blog.* to 'blog'@'127.0.0.1' identified by 'pbxfuej3LR4r';
切换某个库: use blog;
查询库里面有什么表: show tables;
问题处理:
在安装wordpress过程中,需要设定网站程序目录的权限,属主设定为php-fpm服务的那个用户
chown -R php-fpm /data/wwwroot/blog.aminglinux.cc
补充:
yum install -y expect //为了安装mkpasswd命令,这个命令用来生产随机密码的
如, mkpasswd -s 0 -l 12






discuz官网:http://www.discuz.net/forum.php
yum install -y git
git clone https://gitee.com/ComsenzDiscuz/DiscuzX.git
cp -r DiscuzX/upload /data/wwwroot/bbs.aminglinux.cc
定义虚拟主机配置文件:
1)cd /etc/nginx/conf.d
2)cp blog.aminglinux.cc.conf bbs.aminglinux.cc.conf
3)修改里面的目录
4)nginx -t && nginx -s reload
开始安装:
1)改权限 cd /data/wwwroot/bbs.aminglinux.cc && chown -R php-fpm config data uc_server/data uc_client/data
2)数据库相关操作:
create database bbs;
grant all on bbs.* to 'bbs' @127.0.0.1 identified by 'li60rtvvHAfh';
3)定义数据库相关的信息
4)完成安装
补充:
1) cp :cp -r 复制目录
2)vi 批量查找替换,一般模式下输入 :1,$s/要被替换的字符/替换成的字符/g
如果字符串中含有/,则需要脱义, 1,$s/home\/123/home\/abc/g
还有一种方法:1,$s#home/123#home/abc#g


域名跳转:
vi /usr/local/nginx/conf/vhost/ruichao.cc.conf
在 server_name 那一行的域名后面再加一个域名,空格作为分隔。
nginx -t
nginx -s reload
域名重定向:
从a域名跳转到b域名
vi /usr/local/nginx/conf/vhost/blog.ruichao.cc.conf //增加:
if ( $host = blog.ruichao.cc )
{
rewrite /(.*) http://www.aming.com/$1 permanent;
}
nginx -t
nginx -s reload
测试:
curl -x127.0.0.1:80 -I blog.ruichao.cc/1.txt
补充:
状态码:200(OK) 404(不存在) 304(缓存) 301(永久重定向) 302 (临时重定向)
如果是域名跳转,用301; 如果不涉及域名跳转用302
rewrite /1.txt /2.txt redirect;



用户认证的目的:
实现二次认证,针对一些重要的目录(后台地址)
配置用户认证:
vi 配置文件 //添加:

location ~ admin.php
{
auth_basic "Auth";
auth_basic_user_file /etc/nginx/user_passwd;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/bbs.aminglinux.cc$fastcgi_script_name;
include fastcgi_params;
}
补充:
nginx location优先级:
location / 优先级比 location ~ 要低,也就是说,如果一个请求(如,aming.php)同时满足两个location
location /amin.php
location ~ *.php$
会选择下面的
nginx location 文档: https://github.com/aminglinux/nginx/tree/master/location



Nginx访问日志:
就是用户访问网站的记录。
配置访问日志:
主配置文件:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
虚拟主机配置文件:
access_log /log/to/path main;
nginx内置变量: https://github.com/aminglinux/nginx/blob/master/rewrite/variable.md


日志里面不记录静态文件:
在访问日志里,过滤掉一些图片、js、css类的请求日志。因为这样的请求日志没有多大用,而且会占用很大的磁盘空间
如何配置?
在虚拟主机配置文件里增加配置:
location ~* \.(png|jpeg|gif|js|css|bmp|flv)$
{
access_log off;
}
补充:
tail -f /data/logs/bbs.access.log //-f选型可以动态查看一个文件的内容
> 可以清空一个文件内容
~* 表示不区分大小写的匹配 后面跟正则表达式 .表示任意一个字符


为什么要做日志切割?
/data/logs/ 里面有很多访问日志。 如果日志越来越大,可能有一天会把整个磁盘写满。你可以想象一下一个日志有100G
你如何查看这个日志? cat less tail vi
系统里有一个日志切割的服务
logrotate 工具
配置文件: /etc/logrotate.conf
子配置文件:/etc/logrotate.d/*
Nginx的日志切割配置文件:
/etc/logrotate.d/nginx
内容:
/var/log/nginx/*.log /data/logs/*.log {
daily
dateext
missingok
rotate 7
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
测试执行:
logrotate -vf /etc/logrotate.d/nginx

什么是静态文件的过期时间
让图片之类的静态文件,缓存在客户端的浏览器中,在没有过期之前,浏览器不需要请求该图片。
就是为了让这些图片有一个时效性。
如果服务器上图片已经做了更新,但是客户端访问到的还是旧的。
如何配置:
vi 虚拟主机配置文件,增加或更改
location ~* \.(png|jpeg|gif|js|css|bmp|flv)$
{
expires 1d; //1d表示1天 1h表示1小时等
access_log off;
}
补充:
curl -x 用来指定目标服务器的IP和端口,例:curl -x127.0.0.1:80 -I www.aminglinux.cc
bc 是一个linux系统下面的计算器,yum install -y bc



什么叫防盗链?
两个网站 A 和 B, A网站引用了B网站上的图片,这种行为就叫做盗链。 防盗链,就是要防止A引用B的图片。
配置:
location ~ \.(png|gif|jpeg|bmp|mp3|mp4|flv)$
{
valid_referers none blocked server_names *.aming.com;
if ($invalid_referer) {
return 403;
}
}
补充:
rz 上传文件,yum install lrzsz
sz filename 这样去把这个文件推送到windows上
测试防盗链: curl -I -e "http://www.aaa.com/1.txt" http://www.aming.com/1.png
curl的-e指定自定义的referer






访问控制:

限制IP访问:
1)白名单
allow 127.0.0.1;
dney all;
``
2)黑名单
```
deny 127.0.0.1;
deny 1.1.1.1;


限制某个目录
location /admin/ //在admin目录下操作
{
allow 127.0.0.1;
allow 192.168.190.128;
deny all;
}
限制某个目录下的某类文件
```
location ~ .*(upload|image)/.*\.php$
{
deny all;
}
```
限制user-agent
```
if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato')
{
return 403;
}
```
限制uri
```
if ($request_uri ~ (abc|123))
{
return 404;
}
```
补充:
curl命令用法:
curl -v -A 'aaaaaspider/3.0' -e "1111" -x127.0.0.1:80 bbs.ruichao.cc -I
-A 指定user-agent -e 指定referer -x指定访问目标服务器的ip和port -I只显示 header信息,不显示具体的网页内容
-v 显示详细的通信过程
php-fpm的配置:
/usr/local/php-fpm/etc/php-fpm.conf
包含了一个目录 php-fpm.d/*.conf
www.conf 就是其中子配置文件
www.conf配置讲解
pool 名字: [www] 可以自定义,启动后,ps aux |grep php-fpm 看最右侧,就是pool的名字
listen 指定监听的IP:port或者socket地址
这个地址需要和nginx配置文件里面的那个fastcgi_pass所制定的地址一致,否则就会502
如果监听的是socket文件,那么要保证nginx服务用户(nginx)对该socket文件有读写权限,否则502
listen.mode 指定socket文件的权限
pm = dynamic 动态模式
pm.max_children = 5 最大进程数
pm.start_servers = 2 启动几个子进程
pm.min_spare_servers = 1 空闲时,最少不能少于几个子进程
pm.max_spare_servers = 3 空闲时,最多不能多于几个子进程
php_flag[display_errors] = off //关闭错误信息的显示
php_admin_value[error_log] = /var/log/fpm-php.www.log //配置错误日志
php_admin_flag[log_errors] = on
php_admin_value[error_reporting] = E_ALL
在nginx里面配置对应的文件:


配置slow 日志
slowlog = /tmp/php.slow
request_slowlog_timeout = 1
配置open_basedir
php_admin_value[open_basedir] = /data/wwwroot/bbs.ruichao.cc:/tmp
配置多个pool
定义多个配置文件,在配置文件中指定不同的listen地址 不同的 [pool_name]
vim /usr/local/php-fpm/etc/php-fpm.d/bbs.conf内容如下:
[bbs]
user = php-fpm
group = php-fpm
listen = /tmp/bbs.socket
listen.mode = 0666
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 3
pm.max_spare_servers = 5
slowlog = /tmp/php.slow
request_slowlog_timeout = 1
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[error_reporting] = E_ALL
php_admin_value[open_basedir] = /data/wwwroot/bbs.ruichao.cc:/tmp
查看php.ini路径:
1) /usr/local/php-fpm/bin/php -i |head
2)用phpinfo

补充:

curl -k -H "host:bbs.ruichao.cc" http://127.0.0.1/phpinfo.php
或curl -k -H "host:bbs.ruichao.cc" https://127.0.0.1/phpinfo.php


MariaDB的密码重置:
如果记得root的密码:
mysqladmin -uroot -paminglinux password "aming-linux"
如果不记得root密码:
1)编辑/etc/my.cnf
增加:skip-grant
重启mysql服务/etc/init.d/mysqld restart
2)登录进MariaDB,执行
use mysql 切换到mysql库
desc user 查看user表的所有字段
update user set authentication_string=password("aming-linux") where user='root';
3)退出MariaDB,删除/etc/my.cnf里面的skip-grant, 重启服务
4)用新密码登录即可
常识: mysql在5.7.36版本之后把密码字段存到了authentication_string字段里,在之前版本存在password字段里。
update user set password=password("aming-linux") where user='root';

然后重启mysql



为什么要配置慢查询日志?
目的是为了帮助我们分析MariaDB的瓶颈点。
如何配置?
1)进入MariaDB里面执行:
show variables like 'slow%';
show variables like 'datadir';
show variables like 'long%';
2)打开配置文件/etc/my.cnf,编辑,增加:
slow_query_log = ON
slow_query_log_file = /data/mysql/aming01-slow.log
long_query_time = 2
3)重启服务
4)模拟慢查询
select sleep(5);
5)查看慢查询日志:
cat /data/mysql/aming01-slow.log
扩展:
show processlist;
show full processlist;
mysql -uroot -pxxxx -e "show processlist"








































































































































热门排行