MySQL安装
卸载原来的mysql步骤
先查看mysql服务有没有启动:ps aux |grep mysql 如果启动把它关掉
先进入到src下删除mysql:
cd /usr/local/src/
删除目录:rm -rf /usr/local/mysql
删除启动脚本:rm -rf /etc/init.d/mysqld
安装mysql
cd /usr/local/src
1.下载wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
2.解压tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
3.挪动目录并改名:mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql (前提是之前没有创建过mysql目录,不然他不会改名为mysql,他会移动到这个目录下,所以要查看一下)
4. 进入到目录下:cd /usr/local/mysql
创建一个mysql用户:useradd mysql
创建一个data目录:mkdir /data/ (要是以前安装过musql的话他会有这个目录,需要把删掉)
5.初始化:出现两个OK才对
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
6.拷贝配置文件并改名
下面这一步,如果之前装过mysql并且拷贝编辑配置文件过就不用做了
cp support-files/my-default.cnf /etc/my.cnf
vim /etc/my.cnf 把下边这两个地方的路径定义对
7.拷贝一个启动脚本改名为mysqld
cp support-files/mysql.server /etc/init.d/mysqld
编辑一下:vim /etc/init.d/mysqld 定义basedir和datadir
8.启动mysql
/etc/init.d/mysqld start
9.查看mysql服务有没有启动:ps aux |grep mysql
10.把mysqld服务加入到服务列表里:
chkconfig --add mysqld
11.设置开机启动:
chkconfig mysqld on
12.这时候就可以用service命令来开启关闭它了
service mysqld stop 关闭
service mysqld start 开启
PHP安装
它在lnmp架构里不需要依赖nginx,它是一个独立的服务
而在apache里边它是apache的一个服务模块必须依赖apache
和LAMP安装PHP方法有差别,需要开启php-fpm服务
cd /usr/local/src/
假如说你已经安装过php了可以进行以下操作
进入到:cd php-5.6.30 (make clean可以吧以前的配置信息全部删掉,让他回到刚解压完的状态)
如果第一次安装则进行以下操作
下载:wget http://cn2.php.net/distributions/php-5.6.30.tar.gz
解压:tar zxf php-5.6.30.tar.gz
添加php-fpm用户:useradd -s /sbin/nologin php-fpm
因为已经有php目录了,我们给它叫php-fpm
编译:./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
make && make install
拷贝配置文件:cp php.ini-production /usr/local/php-fpm/etc/php.ini 可以查看下etc下边是没有php.ni的
进入到cd /usr/local/php-fpm/etc/ 目录下
编辑配置文件:vi /usr/local/php-fpm/etc/php-fpm.conf //写入如下内容(参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/php-fpm.conf复制到下边)
再回到php目录里:cd /usr/local/src/php-5.6.30
拷贝启动脚本:cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
更改权限:chmod 755 /etc/init.d/php-fpm
加入到服务列表:chkconfig --add php-fpm
开机自启:chkconfig php-fpm on
启动php服务:service php-fpm start
可以检测一下配置文件有没有错误错误 -t
/usr/local/php-fpm/sbin/php-fpm -t
查看进程:ps aux |grep php-fpm
nginx介绍
Nginx官网 nginx.org,最新版1.15.0,最新稳定版1.14.0
Nginx应用场景:web服务、反向代理、负载均衡
Nginx著名分支,淘宝基于Nginx开发的Tengine,使用上和Nginx一致,服务名,配置文件名都一样,和Nginx的最大区别在于Tenging增加了一些定制化模块,在安全限速方面表现突出,另外它支持对js,css合并
Nginx核心+lua相关的组件和模块组成了一个支持lua的高性能web容器openresty,参考http://jinnianshilongnian.iteye.com/blog/2280928
Nginx安装
cd /usr/local/src
wget http://nginx.org/download/nginx-1.14.0.tar.gz
tar zxf nginx-1.14.0.tar.gz
进到解压包内:cd /usr/local/src/nginx-1.14.0/
编译:./configure --prefix=/usr/local/nginx
make && make install
编辑启动脚本:vim /etc/init.d/nginx //复制如下内容(参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/etc_init.d_nginx复制到里边)
chmod 755 /etc/init.d/nginx
加入服务:chkconfig --add nginx
开机自启:chkconfig nginx on
配置它的配置文件:先进去,cd /usr/local/nginx/conf/
我们发现它里边已经有一个nginx.conf了,但是我们不用它我们用自己的
> /usr/local/nginx/conf/nginx.conf 重定向等于先清空
vim nginx.conf //写入如下内容(参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/nginx.conf)
检查一下有没有出错:/usr/local/nginx/sbin/nginx -t
启动:/etc/init.d/nginx start
service nginx start
ps aux |grep nginx
netstat -lntp |grep 80
测试一下curl localhost
测试php解析
创建一个测试文件:vi /usr/local/nginx/html/1.php //加入如下内容
curl localhost/1.php 解析成功
Nginx默认虚拟主机
进到:/usr/local/nginx/conf
编辑vim /usr/local/nginx/conf/nginx.conf //把最后一段server删除
增加:include vhost/*.conf; 而vhost目录我们需要创建,看下边操作
创建conf子目录:mkdir /usr/local/nginx/conf/vhost
进到vhost下:cd vhost/
在创建一个比如aaa.com.conf,编辑
vim aaa.com.conf //加入如下内容
server { listen 80 default_server; // 有这个标记的就是默认虚拟主机 server_name aaa.com; index index.html index.htm index.php; root /data/wwwroot/default; }
创建目录(因为我们增加的配置文件内容里有这个目录):
mkdir /data/wwwroot/default
然后进到这个目录下:cd /data/wwwroot/default/
定义一个东西:vim index.html 在里边随便写一句:this is the default site.
或者用这种定向的方式写入:echo “This is a default site.”>/data/wwwroot/default/index.html
写完检查一下有没有错误/usr/local/nginx/sbin/nginx -t
重新加载(加上选项-s reload):/usr/local/nginx/sbin/nginx -s reload
测试一下看看是否显示刚才定义的那句话:curl localhost
测试一下指定域名,例如bbb.com:curl -x127.0.0.1:80 bbb.com
Nginx用户认证
针对整个站点来设置
在这个目录下做操作:cd /usr/local/nginx/conf/vhost
编辑配置文件:创建一个虚拟主机,比如说叫test.com.conf
vim /usr/local/nginx/conf/vhost/test.com.conf//写入如下内容
server { listen 80; server_name test.com; index index.html index.htm index.php; root /data/wwwroot/test.com; location / { auth_basic "Auth";自定义用户认证的名字 auth_basic_user_file /usr/local/nginx/conf/htpasswd;用户名密码文件 } }
下面是生成密码文件:
如果你上边安装过Apache可以直接用这个命令
没有就安装一个yum install -y httpd 再用上边的命令
-c是生成的意思,你要创建第二用户个就不用加了,要不他就会重置前边设置的密码
后边这个awei是指定用户名字,可以随便定义
/usr/local/apache2.4/bin/htpasswd -c /usr/local/nginx/conf/htpasswd awei
创建第二个用户的话直接加用户名字就可以,不用-c指定了,假如在创建一个user1用户
查看一下密码文件:cat /usr/local/nginx/conf/htpasswd
检查语法错误:/usr/local/nginx/sbin/nginx -t
重新加载:/usr/local/nginx/sbin/nginx -s reload
测试
curl -x127.0.0.1:80 test.com 状态码为401说明需要用户认证
我们需要创建index.html目录(不然输入密码会显示404):
mkdir /data/wwwroot/test.com
在创建一个index.html测试文件,并写入内容:echo “test.com”>/data/wwwroot/test.com/index.html
测试指定密码用户,用-u用户加密码:假如用户为awei,密码为123456789
curl -uawei:123456789 -x127.0.0.1:80 test.com -I 访问状态码变为200
编辑windows的hosts文件,然后在浏览器中访问test.com会有输入用户、密码的弹窗
针对指定目录的用户认证
条件:比如我们只在访问admin的时候认证
编辑配置文件:vim /usr/local/nginx/conf/vhost/test.com.conf
在后边加admin目录名字就行,这样的话只有访问他的时候才需要验证
检查语法错误:/usr/local/nginx/sbin/nginx -t
重新加载:/usr/local/nginx/sbin/nginx -s reload
创建一个测试环境
我们需要创建index.html目录
mkdir /data/wwwroot/test.com/admin
在创建一个index.html测试文件,并写入内容:echo “test.com admin dir”>/data/wwwroot/test.com/admin/index.html
假设用户名为awei,密码为123456789测试结果如下
curl -uawei:123456789 -x127.0.0.1:80 test.com/admin/
针对访问的一个URL
条件:假如说访问admin.php
编辑配置文件:vim /usr/local/nginx/conf/vhost/test.com.conf //给它匹配就行了
检查语法错误:/usr/local/nginx/sbin/nginx -t
重新加载:/usr/local/nginx/sbin/nginx -s reload
我们需要创建index.html目录
mkdir /data/wwwroot/test.com/admin.php
在创建一个index.html测试文件,并写入内容:echo “test.com admin dir”>/data/wwwroot/test.com/admin.php/index.html
curl -x127.0.0.1:80 test.com/admin.php
Nginx域名重定向
条件:假如说test.com是主域名,而我们还有其他域名,例如test2.com;test3.com,等用户访问它们时让它自动跳转到test.com主域名上来
更改test.com.conf
在这个路径下:cd /usr/local/nginx/conf/vhost
server
{
listen 80;
server_name test.com test1.com test2.com; test3.com; 在后边在加上多个域名
index index.html index.htm index.php;
root /data/wwwroot/test.com;
if ($host != 'test.com' ) {域名跳转,如果不是test.com
rewrite ^/(.*)$ http://test.com/$1 permanent;就让他它调转过来(permanent是301的意思)
}
}
测试配置文件:/usr/local/nginx/sbin/nginx -t
重新加载:/usr/local/nginx/sbin/nginx -s reload
测试
假如说我用test2.com去访问index.html。他会显示301并且下边显示他跳转到了test.com域名上边来
curl -x127.0.0.1:80 test2.com/index.html -I
server_name后面支持写多个域名,这里要和httpd的做一个对比
permanent为永久重定向,状态码为301,如果写redirect则为302
Nginx访问日志
日志格式
打开主配置文件:vim /usr/local/nginx/conf/nginx.conf //搜索log_format 这一段就是用来定义日志格式的
combined_realip:这是日志个是的名字,可以随便定义,这里写成什么,后边引用他时就写成什么
nginx配置有个特点,他会认为什么时候有分号;,才会结束
日志格式解释:
除了在主配置文件nginx.conf里定义日志格式外,还需要在虚拟主机配置文件中:
vi /usr/local/nginx/conf/vhost/test.com.conf
增加:access_log /tmp/test.com.log combined_reali;意思是把日志放到一个目录下
这里的combined_realip就是在nginx.conf中定义的日志格式名字,我们没改就用的原来的名字
测试配置文件:/usr/local/nginx/sbin/nginx -t
重新加载:/usr/local/nginx/sbin/nginx -s reload
访问一下:curl -x127.0.0.1:80 test2.com/index.html -I
查看一下日志:cat /tmp/test.com.log
Nginx日志切割
自定义shell 脚本(比如说叫nginx_logrotate.sh)
vim /usr/local/sbin/nginx_logrotate.sh//写入如下内容
#! /bin/bash
d=`date -d "-1 day" +%Y%m%d` #生成昨天的日期,格式为年月日
logdir="/data/logs"#日志的存放路径,假设nginx的日志存放路径为/data/logs/
nginx_pid="/usr/local/nginx/logs/nginx.pid"
cd $logdir#进入到logdir目录下
for log in `ls *.log`#进行一个for循环
do
mv $log $log-$d
done
/bin/kill -HUP `cat $nginx_pid`生成新的日志文件
执行脚本内容:sh -x /usr/local/sbin/nginx_logrotate.sh
他现在已经生成了
写完脚本需要制定一个任务计划:每天凌晨零点执行这个脚本
crontab -e 把下边内容写进去
0 0 * * * /bin/bash /usr/local/sbin/nginx_log_rotate.sh
静态日志不记录日志和过期时间
配置如下
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 7d;
access_log off;
}
location ~ .*\.(js|css)$
{
expires 12h;#过期时间
access_log off;
}
模拟一下
先到这个目录下:cd /data/wwwroot/test.com/
编辑:vi 1.gif 随便写点东西
编辑:vi 2.js 随便写点东西
测试一下:
curl -x127.0.0.1:80 test.com/1.gif
curl -x127.0.0.1:80 test.com/2.js
curl -x127.0.0.1:80 test.com/index.html
访问完查看一下日志:
cat /tmp/test.com.log 你会发现他只记录了最后一条
Nginx防盗链
配置如下,可以和上面的配置结合起来
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$
{
expires 7d;
valid_referers none blocked server_names *.test.com ; 定义白名单,我这里假设白名单是test.com,如果不匹配直接403
if ($invalid_referer) {
return 403;
}
access_log off;
}
测试:
curl -e "http://baidu.com/1.txt" -x127.0.0.1:80 -I test.com/1.gif 403
curl -e "http://test.com/1.txt" -x127.0.0.1:80 -I test.com/1.gif 200
Nginx访问控制
针对目录
需求:访问/admin/目录的请求,只允许某几个IP访问,例如:192.168.232.132和127.0.0.1,其他的不允许,配置如下:
location /admin/ { allow 192.168.232.132; allow 127.0.0.1; deny all; }
测试
mkdir /data/wwwroot/test.com/admin/
echo “test,test”>/data/wwwroot/test.com/admin/1.html
-t && -s reload
curl -x127.0.0.1:80 test.com/admin/1.html -I
curl -x192.168.133.130:80 test.com/admin/1.html -I
针对正则
可以匹配正则,禁止解析php
location ~ .*(upload|image)/.*\.php$ upload是自己定义的,只要是匹配upload的以.php结尾的 { deny all; }
测试 php的文件被拒绝了 txt的文件可以访问
根据user_agent限制,不让任何人任何网站知道访问到你的IP
if ($http_user_agent ~* 'Spider/3.0|YoudaoBot|Tomato')#假如说限制这三家Spider/3.0|YoudaoBot|Tomato 这三家是访问不到你的 加了*匹配时就不分大小写了 { return 403; }
deny all和return 403效果一样
Nginx解析PHP相关配置
配置如下:
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
}
fastcgi_pass 用来指定php-fpm监听的地址或者socket
编辑完配置文件先不要重新加载,等测试中在加载,直接测试
测试:
vi /data/wwwroot/test.com/3.php 把下面内容写进去:
phpinfo();
然后curl一下:curl -x127.0.0.1:80 test.com/3.php 这时他是解析不了的,直接把源码输出
然后重新加载一下配置文件:
/usr/local/nginx/sbin/nginx -s reload
在解析:
curl -x127.0.0.1:80 test.com/3.php
Nginx代理服务器
写一个新的配置文件:
cd /usr/local/nginx/conf/vhost
vim proxy.conf //加入如下内容
server
{
listen 80;
server_name ask.apelearn.com;定义域名,要访问的域名
location /
{
proxy_pass http://121.201.9.155/;远程服务端web服务器的ip。
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
配置完就可以用linux虚拟机通过这个IPhttp://121.201.9.155来访问ask.apelearn.com论坛了
验证一下:curl ask.apelearn.com/robots.txt
为了测试代理是否成功,可以用虚拟机本机IP访问:curl -x127.0.0.1:80 ask.apelearn.com/robots.txt
Nginx负载均衡
vim /usr/local/nginx/conf/vhost/load.conf // 写入如下内容
upstream qq_com 这个名字代表着下边的两个IP
{
ip_hash;
server 61.135.157.156:80;
server 125.39.240.113:80;
}
server
{
listen 80;
server_name www.qq.com;
location /
{
proxy_pass http://qq_com;写上边upstream的名字
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
yum install -y bind-uitls
dig qq.com域名解析,可以反馈回来IP
upstream来指定多个web server
SSL工作原理
1.浏览器发送一个https的请求给服务器;
2.服务器要有一套数字证书,可以自己制作(后面的操作就是阿铭自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出>提示页面,这套证书其实就是一对公钥和私钥;
3.服务器会把公钥传输给客户端;
4.客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;
5.客户端把加密后的随机字符串传输给服务器;
6.服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串>通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
7.服务器把加密后的数据传输给客户端;
8.客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;
生成SSL密钥对
先进入到这个目录下:cd /usr/local/nginx/conf
安装openssl这个包yum install -y openssl
生成一个私钥:openssl genrsa -des3 -out tmp.key 2048//key文件为私钥,输入密码:
为了方便给它取消密码:openssl rsa -in tmp.key -out aminglinux.key //转换key,取消密码
删掉没用的这个:rm -f tmp.key
openssl req -new -key aminglinux.key -out aminglinux.csr//生成证书请求文件,需要拿这个文件和私钥一起生产公钥文件
生成公钥文件:openssl x509 -req -days 365 -in aminglinux.csr -signkey aminglinux.key -out aminglinux.crt
这里的aminglinux.crt为公钥,aminglinux.key是私钥
Nginx配置SSL
生成一个新的配置文件:vim /usr/local/nginx/conf/vhost/ssl.conf//加入如下内容
server
{
listen 443;
server_name aming.com;自己定义,比如叫aming.com
index index.html index.php;
root /data/wwwroot/aming.com;创建一下
ssl on;
ssl_certificate aminglinux.crt;
ssl_certificate_key aminglinux.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
创建一个路径:mkdir /data/wwwroot/aming.com 因为跑配置文件有这个路径
-t && -s reload //若报错unknown directive “ssl” ,需要重新编译nginx,加上--with-http_ssl_module
方法:
进到这个目录下,cd /usr/local/src/nginx-1.12.1/
./configgure --help |grep -i ssl
添加一条正则表达式:
./configure --prefix=/usr/local/nginx --with-http_ssl_module
make && make install
用命令查看:/usr/local/nginx/sbin/nginx -V 会多一个参数
检查错误:/usr/local/nginx/sbin/nginx -t
重启一下:/etc/init.d/nginx restart
查一下他的监听端口:netstat -lntp 会发现多了一个443端口
创建一个测试文件:
把这句话写入到配置文件去:
echo This is ssl.>/data/wwwroot/aming.com/index.html
要想直接访问IP就编辑hosts:
vi /etc/hosts 增加127.0.0.1 aming.com
curl https://aming.com/
再从你的电脑hosts里添加上你的虚拟机ip:192.168.232.132 aming
用电脑连网输入:https//aming.com 如果不能上查看防火墙
iptables -nvL
iptables -F
php-fpm的pool
vim /usr/local/php/etc/php-fpm.conf//在[global]部分增加
include = etc/php-fpm.d/*.conf
mkdir /usr/local/php/etc/php-fpm.d/
cd /usr/local/php/etc/php-fpm.d/
vim www.conf //内容如下
[www]
listen = /tmp/www.sock
listen.mode=666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
继续编辑配置文件
vim aming.conf //内容如下
[aming]
listen = /tmp/aming.sock
listen.mode=666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
检查:/usr/local/php/sbin/php-fpm –t
重启:/etc/init.d/php-fpm restart
php-fpm慢执行日志
针对刚才上边编辑配置的www.conf进行一个配置
vim /usr/local/php-fpm/etc/php-fpm.d/www.conf//加入如下内容
request_slowlog_timeout = 1
slowlog = /usr/local/php-fpm/var/log/www-slow.log
模拟测试
配置nginx的虚拟主机test.com.conf,把unix:/tmp/php-fcgi.sock改为unix:/tmp/www.sock
重新加载nginx服务
vim /data/wwwroot/test.com/sleep.php//写入如下内容,故意让它休眠两秒钟
curl -x127.0.0.1:80 test.com/sleep.php
cat /usr/local/php-fpm/var/log/www-slow.log
php-fpm定义open_basedir
比如说我要在aming.com这个池子里边定义
vim /usr/local/php-fpm/etc/php-fpm.d/aming.conf//加入如下内容
php_admin_value[open_basedir]=/data/wwwroot/aming.com:/tmp/
创建测试php脚本,进行测试
再次更改aming.conf,修改路径,再次测试
配置错误日志
再次测试
查看错误日志
php-fpm进程管理
pm = dynamic //动态进程管理,也可以是static,如果改成static下边的就不会生效了
pm.max_children = 50 //最大子进程数,ps aux可以查看
pm.start_servers = 20 //启动服务时会启动的进程数
pm.min_spare_servers = 5 //定义在空闲时段,子进程数的最少数量,如果达到这个数值时,php-fpm服务会自动派生新的子进程。
pm.max_spare_servers = 35 //定义在空闲时段,子进程数的最大值,如果高于这个数值就开始清理空闲的子进程。
pm.max_requests = 500 //定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。