MySQL安装
卸载原来的mysql步骤
第一步,先进入到src下:
cd /usr/local/src/
第二步,删除
rm -rf /usr/local/mysql
rm -rf /etc/init.d/mysqld
cd /usr/local/src
wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
cd /usr/local/mysql
useradd mysql
mkdir /data/
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
cp support-files/my-default.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
vi /etc/init.d/mysqld
定义basedir和datadir
/etc/init.d/mysqld start
PHP安装
和LAMP安装PHP方法有差别,需要开启php-fpm服务
cd /usr/local/src/
wget http://cn2.php.net/distributions/php-5.6.30.tar.gz
tar zxf php-5.6.30.tar.gz
useradd -s /sbin/nologin php-fpm
cd php-5.6.30 (make clean可以吧以前的配置信息全部删掉,让他回到刚解压完的状态)
./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
vi /usr/local/php/etc/php-fpm.conf //写入如下内容(参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/php-fpm.conf)
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
service php-fpm start
ps aux |grep php-fpm
nginx介绍
Nginx官网 nginx.org,最新版1.13,最新稳定版1.12
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.12.1.tar.gz
tar zxf nginx-1.12.1.tar.gz
./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/; 再拷贝,mv nginx.conf nginx.conf.bak
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
netstat -lntp |grep 80
测试php解析
vi /usr/local/nginx/html/1.php //加入如下内容
<?php
echo "test php scripts.";
?>
curl localhost/1.php
Nginx默认虚拟主机
进到:/usr/local/nginx/conf
编辑vim /usr/local/nginx/conf/nginx.conf //把最后一段server删除,增加
include vhost/*.conf;
创建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
测试一下指定域名:curl -x127.0.0.1:80 123.com
Nginx用户认证
在这个目录下做操作:
cd /usr/local/nginx/conf/vhost
编辑配置文件:创建一个虚拟主机
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可以直接用这个命令:
-c是生成的意思,你要设置第二个就不用加了,要不他就会重置
/usr/local/apache2.4/bin/htpasswd -c /usr/local/nginx/conf/htpasswd awei
没有就安装一个yum install -y httpd 再用上边的命令
测试一下/usr/local/nginx/sbin/nginx -t
重新加载:/usr/local/nginx/sbin/nginx -s reload
curl -x127.0.0.1:80 test.com 状态码为401说明需要认证
我们需要创建index.html目录:
mkdir /data/wwwroot/test.com
echo “test.com”>/data/wwwroot/test.com/index.html
指定用户,用-u用户加密码:
curl -uawei:123456789 -x127.0.0.1:80 test.com -I 访问状态码变为200
编辑windows的hosts文件,然后在浏览器中访问test.com会有输入用户、密码的弹窗
针对指定目录的用户认证
location /admin/ 在后边加目录名字就行,这样的话只有访问他的时候才需要验证
{
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
可以测试一下:创建一个测试页面,用户跟密码根据自己的改
\
Nginx域名重定向
更改test.com.conf
在这个路径下:cd /usr/local/nginx/conf/vhost
server
{
listen 80;
server_name test.com test1.com test2.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;(301)
}
}
测试配置文件:/usr/local/nginx/sbin/nginx -t
重新加载:/usr/local/nginx/sbin/nginx -s reload
测试一下是否为301: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中定义的日志格式名字
-t && -s reload
访问一下:curl -x127.0.0.1:80 test2.com/index.html -I
查看一下日志:cat /tmp/test.com.log
Nginx日志切割
自定义shell 脚本
vim /usr/local/sbin/nginx_log_rotate.sh//写入如下内容
#! /bin/bash
## 假设nginx的日志存放路径为/data/logs/
d=`date -d "-1 day" +%Y%m%d`
logdir="/data/logs"
nginx_pid="/usr/local/nginx/logs/nginx.pid"
cd $logdir
for log in `ls *.log`
do
mv $log $log-$d
done
/bin/kill -HUP `cat $nginx_pid`
任务计划
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 ; 定义白名单如果不匹配直接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访问,配置如下:
location /admin/
{
allow 192.168.133.1;
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
可以匹配正则
location ~ .*(abc|image)/.*\.php$
{
deny all;
}
根据user_agent限制
if ($http_user_agent ~ ‘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 把下面内容写进去:
<?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;
}
}
验证一下:curl ask.apelearn.com/robots.txt
本机也能访问: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;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
upstream来指定多个web server
SSL工作原理
1.浏览器发送一个https的请求给服务器;
2.服务器要有一套数字证书,可以自己制作(后面的操作就是阿铭自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出>提示页面,这套证书其实就是一对公钥和私钥;
3.服务器会把公钥传输给客户端;
4.客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;
5.客户端把加密后的随机字符串传输给服务器;
6.服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串>通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
7.服务器把加密后的数据传输给客户端;
8.客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;
生成SSL密钥对
先进入到这个目录下:cd /usr/local/nginx/conf
生成一个私钥: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为公钥
Nginx配置SSL
vim /usr/local/nginx/conf/vhost/ssl.conf//加入如下内容
server
{
listen 443;
server_name 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.65.135 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慢执行日志
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//写入如下内容
<?php echo “test slow log”;sleep(2);echo “done”;?>
curl -x127.0.0.1:80 test.com/sleep.php
cat /usr/local/php-fpm/var/log/www-slow.log
php-fpm定义open_basedir
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的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。