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;

}

可以测试一下:创建一个测试页面,用户跟密码根据自己的改

笔记11(LNMP)_Linux\


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 这一段就是用来定义日志格式的

笔记11(LNMP)_LNMP_02

combined_realip:这是日志个是的名字,可以随便定义,这里写成什么,后边引用他时就写成啥

nginx配置有个特点,他会认为什么时候有分号;,才会结束

 笔记11(LNMP)_Linux_03

除了在主配置文件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|p_w_picpath)/.*\.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代理

笔记11(LNMP)_LNMP_04

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工作原理

         笔记11(LNMP)_LNMP_05

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的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。