12.1-12.24 笔记

1.LNMP架构介绍

LNMP=Linux+Nginx+Mysqld+PHP

 

Nginx在处理静态文件时比Apache要快很多

 

2.MySQL安装

和之前在LAMP架构时安装的步骤是一样的

 

3-4. PHP安装

和LAMP不同,需要开启php-fpm服务

1)cd /usr/local/src

2)下载解压php源码包

3)cd php-5.6.38

4) ./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

5)make && make install

6)ls /usr/local/php-fpm

 

sbin中有php-fpm用来启动php服务

var下有log和run两个目录,log是存放日志;run是存放PID的

/usr/local/php-fpm/sbin/php-fpm -m/-i, 可以用来查看PHP的详细信息

7)编辑配置文件

  • 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

[global]

pid = /usr/local/php-fpm/var/run/php-fpm.pid

error_log = /usr/local/php-fpm/var/log/php-fpm.log

[www] //模块名字

listen = /tmp/php-fcgi.sock,也可以写成listen = 127.0.0.1:9000,因为PHP和Nginx一般在一台机器上,用内网通信即可

listen.mode = 666 ,用来定义监听的/tmp/php-fcgi.sock权限为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

  • 拷贝源码包中的启动文件

cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

  • chmod 755 /etc/init.d/php-fpm

  • useradd -s /sbin/nologin php-fpm

8)启动服务

chkconfig --add php-fpm

chkconfig php-fpm on

service php-fpm start

 

5.Nginx介绍

 

lua一种开发语言

http://jinnianshilongnian.iteye.com/blog/2280928

 

6.Nginx 安装

1)到官网下载stable version的Nginx

2)cd /usr/local/src

3)解压文件

tar -zvxf nginx-1.14.2.tar.gz

4)cd nginx-1.14.2

./configure --prefix=/usr/local/nginx

5)make && make install

conf-配置文件目录

html-样例文件

sbin-核心文件

logs-日志

 

6)vim /etc/init.d/nginx, 启动的配置文件,chmond 755 /etc/init.d/nginx

写入以下内容

#!/bin/bash

# chkconfig: - 30 21

# description: http service.

# Source Function Library

. /etc/init.d/functions

# Nginx Settings

 

NGINX_SBIN="/usr/local/nginx/sbin/nginx"

NGINX_CONF="/usr/local/nginx/conf/nginx.conf"

NGINX_PID="/usr/local/nginx/logs/nginx.pid"

RETVAL=0

prog="Nginx"

 

start()

{

    echo -n $"Starting $prog: "

    mkdir -p /dev/shm/nginx_temp

    daemon $NGINX_SBIN -c $NGINX_CONF

    RETVAL=$?

    echo

    return $RETVAL

}

 

stop()

{

    echo -n $"Stopping $prog: "

    killproc -p $NGINX_PID $NGINX_SBIN -TERM

    rm -rf /dev/shm/nginx_temp

    RETVAL=$?

    echo

    return $RETVAL

}

 

reload()

{

    echo -n $"Reloading $prog: "

    killproc -p $NGINX_PID $NGINX_SBIN -HUP

    RETVAL=$?

    echo

    return $RETVAL

}

 

restart()

{

    stop

    start

}

 

configtest()

{

    $NGINX_SBIN -c $NGINX_CONF -t

    return 0

}

 

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  reload)

        reload

        ;;

  restart)

        restart

        ;;

  configtest)

        configtest

        ;;

  *)

        echo $"Usage: $0 {start|stop|reload|restart|configtest}"

        RETVAL=1

esac

 

exit $RETVAL

7)chmod 755 /etc/init.d/nginx

8)chkconfig --add nginx

chkconfig nginx on

 

9)编辑nginx的配置文件

  • 找到/usr/local/nginx/conf/nginx.conf文件

  • cp /usr/local/ngnix/conf/nginx.conf nginx.conf.bak

  • mv nginx.conf nginx.conf.bak

  • vim nginx.conf

写入下面的内容

 

user nobody nobody; 

worker_processes 2;

error_log /usr/local/nginx/logs/nginx_error.log crit;

pid /usr/local/nginx/logs/nginx.pid;

worker_rlimit_nofile 51200; 用来定义最多打开多少文件

 

events

{

    use epoll;

    worker_connections 6000;

}

 

http

{

    include mime.types;

    default_type application/octet-stream;

    server_names_hash_bucket_size 3526;

    server_names_hash_max_size 4096;

    log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'

    ' $host "$request_uri" $status'

    ' "$http_referer" "$http_user_agent"';

    sendfile on;

    tcp_nopush on;

    keepalive_timeout 30;

    client_header_timeout 3m;

    client_body_timeout 3m;

    send_timeout 3m;

    connection_pool_size 256;

    client_header_buffer_size 1k;

    large_client_header_buffers 8 4k;

    request_pool_size 4k;

    output_buffers 4 32k;

    postpone_output 1460;

    client_max_body_size 10m;

    client_body_buffer_size 256k;

    client_body_temp_path /usr/local/nginx/client_body_temp;

    proxy_temp_path /usr/local/nginx/proxy_temp;

    fastcgi_temp_path /usr/local/nginx/fastcgi_temp;

    fastcgi_intercept_errors on;

    tcp_nodelay on;

    gzip on;

    gzip_min_length 1k;

    gzip_buffers 4 8k;

    gzip_comp_level 5;

    gzip_http_version 1.1;

    gzip_types text/plain application/x-javascript text/css text/htm

    application/xml;

 

    server

    {

        listen 80;

        server_name localhost;

        index index.html index.htm index.php;

        root /usr/local/nginx/html;

 

        location ~ \.php$

        {

            include fastcgi_params;

            fastcgi_pass unix:/tmp/php-fcgi.sock;

            fastcgi_index index.php;

            fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;

        }    

    }

}

 

10)/etc/init.d/nginx start来启动服务

 

在服务启动之后我们用命令curl localhost 来测试nginx, 如果没有问题可以看到下面的页面

之所以有这个页面是因为我们在配置nginx.conf的时候配置了虚拟主机,并且配置了 root /usr/local/nginx/html

 

peizhi 

我们再来做PHP解析的测试

vim /usr/local/nginx/html/1.php

<?php

echo "this is a nginx test.";

?>

然后curl localhost/1.php, 如果出现下图内容则没有问题

 

7.Nginx默认虚拟主机

我们除了在nginx.conf里面可以配置虚拟主机,也可以在/conf/vhost文件中配置

1)首先我们把/usr/local/nginx/conf/nginx.conf关于虚拟主机的配置内容删掉,同时加上 include vhost/*.conf

2)cd /usr/local/nginx/conf

mkdir vhost

cd vhost

vim aaa.com.conf

输入以下内容

 

server

{

    listen 80 default_server;  // 有这个标记的就是默认虚拟主机

    server_name aaa.com;

    index index.html index.htm index.php;

    root /data/wwwroot/default;

}

3)mkdir /data/wwwroot/default

4)cd /data/wwwroot/default

vim index.html, 写入This is the default site.

5)/usr/local/nginx/sbin/nginx -t, 检查语法

如果没有问题,reload配置文件/usr/local/nginx/sbin/nginx -s reload; 也可以用/etc/init.d/nginx restart来重启服务

reload比restart有优势在于,如果配置文件有问题那么reload的话配置文件是不会生效的,但是restart的话可能会导致服务停止

 

重启之后再用curl localhost,做测试就可以发现index.html的内容变为我们之前编辑的“This is the default site.”

 

 

无论什么域名只要解析过来指向服务器都可以访问到虚拟主机,如下

 

注:有两种方式可以定义虚拟主机

  • 在/usr/local/nginx/conf/vhost中使默认主机的配置文件排在第一位,例如000.com.conf

  • 在配置文件中加入default_server作为默认主机标志

 

8.Nginx用户认证

1)cd /usr/local/nginx/conf/vhost

vim 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;

}

}

2)生成密码文件 yum install -y httpd

htpasswd -c /usr/local/nginx/conf/htpasswd 用户名,-c为创建密码文件/usr/local/nginx/conf/htpasswd,如果密码文件已经创建之后想要再加入用户及密码则不用在加-c参数

3)/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload

重新加载后仍然用curl -x127.0.0.1:80 test.com做测试,发现如下图提示401,以为这验证设置成功

 

如果我们想要指定目录来做用户认证,例如我们不想整站做用户认证,只想在test.com/admin/页面访问的时候做认证,那么我们就可以在/vhost/test.com.conf的配置下面做如下改动

server

{

    listen 80;

    server_name test.com;

    index index.html index.htm index.php;

    root /data/wwwroot/test.com;

   

location  /admin/ , 在这个地方可以做匹配,例如如果想要针对admin.php URL做用户认证时则可以 写成 location ~ admin.php

    {

        auth_basic              "Auth"; 定义用户认证的名字

        auth_basic_user_file   /usr/local/nginx/conf/htpasswd;

}

}

然后mkdir /data/wwwroot/test.com/admin

/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload

 

如下图我们再访问test.com时就无需认证而在访问test.com/admin时就需要认证

 

[root@emma_linux vhost]# curl -x127.0.0.1:80 test.com

test.com

[root@emma_linux vhost]# curl -x127.0.0.1:80 test.com/admin/

<html>

<head><title>401 Authorization Required</title></head>

<body bgcolor="white">

<center><h1>401 Authorization Required</h1></center>

<hr><center>nginx/1.14.2</center>

</body>

</html>

 

9.Nginx域名重定向

1)编辑配置文件/test.com.conf

server

{

    listen 80;

    server_name test.com test2.com test3.com; 此处与Apache不同可以跟多个域名

    index index.html index.htm index.php;

    root /data/wwwroot/test.com;

 

    location  /admin/

    {

        auth_basic              "Auth";

        auth_basic_user_file   /usr/local/nginx/conf/htpasswd;

}

}

2)因为我们再server_name处加了test.com test2.com 和test3.com,我们需要定义我们的主域名,例如我们想要把test.com定义为主域名,就在配置文件中写入

 if ($host != 'test.com' ) {

        rewrite  ^/(.*)$ http://test.com/$1  permanent (permanent-301,redirect-302);       

3)/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload

 

然后我们再用curl做实验,发现test2.com已经被301跳转到了test.com

 

 

10.Nginx 访问日志

1)访问日志的格式

我们可以在/usr/local/nginx/conf/nginx.conf中搜索log_format查看到log的格式如下

 

    log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'

    ' $host "$request_uri" $status'

    ' "$http_referer" "$http_user_agent"';

  • remote_addr 

远程的ip地址,也就是客户端的ip

这里的ip指的是公网地址,详见https://blog.csdn.net/xinghuanmeiying/article/details/78056335

注:可以用百度来查看公网ip

 

  • httpx_x_forwarded_for

代理服务器ip

 

  • time_local

服务器本地时间

 

  • host

域名

 

  • request_uri

访问的url地址,例如test2.com/admin/weiojrgoergut, test2.com为host,后面的/admin/weiojrgoergut为uri

 

状态码,例如301,404,403,401等等

200 - 请求成功

301 - 资源(网页等)被永久转移到其它URL

404 - 请求的资源(网页等)不存在

500 - 内部服务器错误

502 - gateway not found

302   (临时移动)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

401   (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。

403   (禁止) 服务器拒绝请求。

 

  • http_refer

 

  • http_usr_agent

 

2)除了在主配置文件nginx.conf中配置log的格式,还需要在虚拟主机的配置文件中配置log的路径

编辑vim /usr/local/nginx/conf/vhost/test.com.conf,添加如下

access_log /tmp/test.com.log combined_realip

 

 

配置完成后我们

/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload

注:在进行reload的时候,出现error message “nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"”

解决这个问题使用 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf,使用nginx -c的参数指定nginx.conf文件的位置

然后在-s reload就正常了

 

再用curl命令做实验,再用cat查看日志文件是否正常写入

 

 

11.Nginx日期切割

Nginx没有自带的日志切割的工具,需要借助于系统日志切割的工具或者自己写脚本

vim /usr/local/sbin/nginx_log_rotate.sh,写入如下内容

注:我们以后可以把shell脚本放入/usr/local/sbin这个目录下

#! /bin/bash

d=`date -d "-1 day" +%Y%m%d` ,日期为当前日期前一天的日期,且格式为年月日

logdir="/tmp/" 日志的存放路径

nginx_pid="/usr/local/nginx/logs/nginx.pid" ,这是为了可以执行最后/bin/kill -HUP `cat$nignx_pid`,这条命令相当于重新加载-s reload的命令

cd $logdir 跳转到日志目录下

for log in `ls *.log`

do

    mv $log $log-$d

done 

这里是一个for循环,for log in `ls *.log`, log为for循环中的变量,指找到ls *.log下log文件

do mv $log $log-$d 是指把log改名字为log-date (为上面定义的d=`date -d "-1 day" +%Y%m%d` )

最后done

/bin/kill -HUP `cat $nginx_pid` 重新加载生成新的日志文件,/bin/kill -HUP pid可以重启服务,重新加载了配置文件,所以可以重新生成在/usr/local/nginx/conf/vhost/test.com.conf下定义的日志文件

 

我们来执行以下这个脚本用# sh -x(-x选项可以看到脚本的执行情况),我们在cat日志文件所在的目录就发现,已经生成了两个日志文件了

 

这样就可以每天生成一个带日期的日志,我们可以做定期清理,列如只保留一个月以内的日志,find /tmp/ -type f -name *.log-* -mtime +30 |xargs rm,这样就可以了

在写好脚本之后,也可以做一个任务计划从每天的零点开始做日志切割

crontab -e

写入 - 0 0 * * * /bin/bash /usr/local/sbin/nginx_log_rotate.sh

 

 

12.静态文件不记录日志和过期时间

就是在访问nginx时的js/css时不记录日志和过期时间

编辑 /usr/local/nginx/conf/vhost/test.com.conf, 写入下面的内容

 

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ 匹配url里面的请求,小括号里的竖线表示或者的意思,\表示脱议,如果不脱议 . 就可以匹配任意的字符了

    {

          expires      7d; 配置图片/js/css在浏览器里的过期时间(也就是在浏览器里保存的时间,以免短时间之内再想服务器请求)

          access_log off; 配置的目的为不去记录访问日志

    }

location ~ .*\.(js|css)$

    {

          expires      12h;

          access_log off;

    }

 

/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload

 

我们再来做实验,到/data/wwwroot/test.com下面随便编辑两个文件1.gif和2.js, 然后用curl访问 curl -x127.0.0.1:80 test.com/1.gif 和test.com/2.js 和test.com

再来cat /tmp/test.com.log发现只有一条test.com的访问记录

但是如果我们访问test.com/2.jsoalsgalsht, 则在日志文件中有访问记录,因为2.jsoalsgalsht不匹配之前在vhost/test.com.conf中的定义,如下图

 

 

我们再来看设置的expire时间,用curl -I 来查看具体信息,如下图

 

 

13.Nginx防盗链

编辑/usr/local/nginx/conf/vhost/test.com.conf, 写入下面内容

 

location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ 

~*表示后面的正则表达不区分大小写,^.+表示以任意字符开头的字符串,\脱议,.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$以点括号内容为结尾location ~* ^.+\.

{

    expires 7d;

    valid_referers none blocked server_names  *.test.com ; 先定义白名单的refer(域名)是什么

    if ($invalid_referer) {

        return 403; 如果不是白名单的域名就返回403

    }

    access_log off;

}

检查语法在重新加载配置

我们用curl -e "refer" -x -I来测试防盗链,发现如下图从baidu.com/1.txt这个refer访问就返回403,但是用test.com就是200

 

 

14.Nginx访问控制

1)需求网站有些重要的内容不想让别人访问,那就可以做一个白名单,只允许一些ip访问

依然编辑/usr/local/nginx/conf/vhost/test.com.conf, 假设限制访问的目录为/admin/,可以写入如下内容

 

location /admin/

{

    allow 192.168.224.128;

    allow 127.0.0.1;

    deny all;

}

注这里的allow和deny是不分顺序的,与apache不同,只要匹配到了一条就不会继续向下匹配其他的条件了,所以上面的限制就是只允许192.168.224.128和127.0.0.1访问test.com/admin,其他ip全部禁止访问

 

2)访问控制不仅可以针对目录,可以匹配正则

 

需求:禁止可以上传图片的目录解析php

location ~ .*(upload|image)/.*\.php$

{

        deny all;

}

 

 

3)根据user_agent限制

需求:不想被搜索到,做一个隐藏的网站,禁掉user_agent的蜘蛛软件

if ($http_user_agent ~* 'Spider/3.0|YoudaoBot|Tomato')

{

      return 403;

}

 

用curl -A (-A/--user-agent <string> 设置用户代理发送给服务器,即告诉服务器浏览器为什么)做实验,可以发现返回的都是403

 

注:deny all 和 return 403作用是一样的

 

15.Nginx解析php相关配置

到目前为止我们test.com还不能解析php

编辑/usr/local/nginx/conf/vhost/test.com.conf,写入如下内容

location ~ \.php$

    {

        include fastcgi_params;

        fastcgi_pass unix:/tmp/php-fcgi.sock; 

如果这个地方的sock文件地址写错,就会出现502 status, 这里的sock是在/usr/local/php-fpm/etc/php-fpm.conf下配置的socket文件,如下图

 

注:如果我们在php-fpm中配置的不是监听socket,而是监听127.0.0.1:9000端口

那么我们在配置nginx php解析时,就应该把fastcgi_pass unix:/tmp/php-fcgi.sock; 改成fastcgi_pass 127.0.0.1:9000;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name; script后面跟的路径应该为test.com.conf中定义的root的文件路径

    }

 

做实验,先编辑一个php文件,vim /data/wwwroot/test.com, 写入

<?php

phpinfo();

?>

然后curl -x127.0.0.1:80 test.com/3.php,如果没有问题就可以显示出解析的php信息的页面而不是<?php phpinfo(); ?>

 

在解析php的时候,除了上面所说的由于socket文件写错或者监听端口写错会出现502,还有一种情况是我们在配置php-fpm时使用socket文件但是没有把listen.mode权限写为666

在我们查看/tmp/php-fcgi.sock时,可以发现属主和属组都为root, 普通用户没用读取权限

但是我们在/usr/local/nginx/conf/nginx.conf中配置的user为nobody nobody,所以如果我们不把socket文件监听权限设置为666,就nobody就没有办法解析php

出现502,也有可能是因为php-fpm资源耗尽了,这时我们需要进行优化

总之,如果在解析的过程中出现问题,我们就应该查看错误日志(在nginx.conf中定义的路径/usr/local/nginx/logs/nginx_error.log),来分析问题,想出解决办法

 

 

16.Nginx代理

 

在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!

上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。转自https://blog.csdn.net/tsummerb/article/details/79248015

 

 

vim /usr/local/nginx/conf/vhost/proxy.conf, 写入下面内容

 

server

{

    listen 80;

    server_name ask.apelearn.com; 

    location /

    {

        proxy_pass     http://47.104.7.242/; 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 -x127.0.0.1 ask.apelearn.com/robots.txt

 

 

17.Nginx负载均衡

 

客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量

请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则

所以~将服务器接收到的请求按照规则分发的过程,称为负载均衡。

负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制

 

nginx借助模块upstream来配置负载均衡

 

安装yum install -y bind-utils来使用dig命令,去查看域名的服务器ip

例如我们查看到qq.com的ip地址有三个如下

 58.60.9.21;59.37.96.63;180.163.26.39

 

还是编辑配置文件vim /usr/local/nginx/conf/vhost/load.conf, 写入下面内容

 

upstream qq_com 这里的名字可以随便写

{

    ip_hash; 目的同一个用户始终保持在一个服务器上

    server  58.60.9.2:80;

    server 59.37.96.63:80;

    server 180.163.26.39;

}

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;

    }

}

 

注:nginx不支持代理443端口也就是https

 

 

18.ssl原理-https

https和http之间的区别

https对通信加密,即使通信过程中数据包被中途拦截也无法解密,数据包被加密

 

工作流程如下图

 

 

 

19.生产ssl密钥对

我们把公钥私钥(数字证书)放在/usr/local/nginx/conf下面

1 ) openssl genrsa -des3 -out tmp.key 2048 生成私钥

genras-是指要生成rsa格式的私钥

私钥文件名为 tmp.key

长度为2048

 

2)在生成私钥的过程中我们发现需要设置密码,在以后每次向服务器请求都需要密码很麻烦,所以我们需要转换key去掉密码,用下面的命令

openssl rsa -in tmp.key -out emma.key

 

3)因为在第二步已经又生成了emma.key内容和tmp.key一样,所以我们可以删掉tmp.key

rm -f tmp.key

 

4)生成请求文件,公钥的生成需要请求文件和私钥

openssl req -new -key emma.key -out emma.csr, 回车之后填写信息,输入密码

 

5)生成公钥文件

 

openssl x509 -req -days 365 -in emma.csr -signkey emma.key -out emma.crt

-days 365 证书日期为一年

emma.crt为公钥,emma.key为私钥

 

 

20.Nginx配置ssl

1)生成新的配置文件,并且编辑

vim /usr/local/nginx/conf/vhost/ssl.conf

 

写入下面内容

 

server

{

    listen 443; 监听端口为443

    server_name emma.com;

    index index.html index.php;

    root /data/wwwroot/emma.com;

    ssl on; 开启ssl,支持https

    ssl_certificate emma.crt; 指定公钥

    ssl_certificate_key emma.key; 指定私钥

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 指定协议,三种最好都配置上

}

 

2)/usr/local/nginx/sbin/nginx -t发现有语法错误,无法识别ssl

 

这时因为在编译nginx的时候没有去指定ssl模块

所以我们需要重新编译,那么去指定那个模块就需要cd /usr/local/src/nginx-1.14.2, ./configure --help |grep -i ssl, 找到我们应该编译

--with-http_ssl_module

./configure --prefix=/usr/local/nginx --with-http_ssl_module

make && make install

 

然后我们在进行语法检测,reload配置文件,但是发现error message -nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid",解决办法/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

 

我们需要重启服务/etc/init.d/nginx restart, 这时可能会出现errormessage - Restarting nginx (via systemctl):  Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details. 我们用kill pid杀掉nginx进程再用/etc/init.d/nginx restart就没有问题了

用netstat -nltp来查看监听端口,发现443端口已经被监听了

 

3)测试ssl是否配置成功

mkdir /data/wwwroot/emma.com

vim /data/wwwroot/emma.com/index.html, 创建测试文件,写入“this is ssl.”

这时就不需要用curl -x的方式来测试,直接编辑host文件,vi /etc/hosts文件写入127.0.0.1 emma.com

curl https://emma.com

因为我们的数字证书不是官方认证的所以会有不信任的error message

 

我们也可以在Windows的host上配置,右键单击开始,选择Windows powershell, 运行notepad c:\windows\system32\drivers\etc\hosts,编辑192.168.224.128 emma.com

然后再到浏览器上https://emma.com

可以看到如下,虽然数字证书不安全(因为不是官方颁发),但是能跳转出来我们之前设置的index.html的内容就表示成功了

 

如果想要正式的证书,可以到沃通买

12306.cn用的就是自己颁发的证书,所以https://www.12306.cn的时候也是显示证书错误

 

 

21.php-fpm的pool

pool对应一个nginx的站点,这样可以提高安全,如同站点切割

php-fpm.conf可以设置多个pool,如果只有一个pool,当PHP资源耗尽,会导致其他站点无法访问资源,报502错误。所以有必要设置多个pool把站点进行分离,分别使用单独的pool。

 

1)编辑php-fpm.conf

vim /usr/local/php-fpm/etc/php-fpm.conf

 

红色框里的为一个pool

如果想要增加pool,就可以再写入下面内容

 

[www2]这个名字可以随便写,但是不要和其他的pool重复就好

listen = /tmp/www2.sock 也是不要和其他pool重复

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-fpm/sbin/php-fpm -t, 在重新加载/etc/init.d/php-fpm reload

 

2)如何应用php-fpm pool

在前面的笔记中我们把test.com配置文件中的php解析配置成了/tmp/php-fcgi.sock (也就是第一个pool)

我们还可以把其他的虚拟主机设置一下,例如默认虚拟主机aaa.com

编辑 vim /usr/local/nginx/conf/vhost/aaa.com, 添加下面的内容

location ~ \.php$

    {

        include fastcgi_params;

        fastcgi_pass unix:/tmp/www2.sock;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;

    }

 

3)跟nginx的配置文件里有include vhost/*.conf类似,php-fpm的配置文件中也可以把pool的配置拆分出来

vim /usr/local/php-fpm/etc/php-fpm.conf, 添加include = /etc/php-fpm.d/*.conf, 再把之前写入的pool内容删掉

mkdir /etc/php-fpm.d

vim www.conf, 写入之前对应的www pool的内容

vim www2.conf,写入之前对应的www2 pool的内容

检查语法,重新加载服务

 

 

22.php-fpm慢执行日志

php-fpm可以分析慢执行日志可以查找出网站访问速度慢的原因

我们用www.conf来做实验

1)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

检查语法,重新加载文件

 

2)我们再来做测试来看慢执行日志是否可以正常写入记录

因为www.conf中的socket文件为/tmp/php-fcgi.sock,被test.com使用,所以我们在/data/wwwroot/test.com下面写入一个php脚本,内容如下

 

<?php 

echo "test slow log";

sleep(2); 这一条表示休眠两秒钟

echo "done";

?>

 

然后我们执行curl -x127.0.0.1:80 test.com/sleep.php

我们再查看/usr/local/php-fpm/var/log/www-slow.log,就发现如下图,提示sleep.php的第三行是php慢的原因

注:很多php执行时间介于1到2秒之间,所以我们可以把time_out的时间设置为2

 

23.open_basedir

在php-fpm中,我们可以根据不同的池子来定义open_basedir

1)vim /usr/local/php-fpm/etc/php-fpm.d/www.conf

写入下面内容

php_admin_value[open_basedir]=/data/wwwroot/aming.com:/tmp/

 

注:如何定义php-fpm的错误日志

vim /usr/local/php-fpm/etc/php.ini

编辑error_log和reporting

error_log = /usr/local/php-fpm/var/log/php_error.log

error_reporting = E_ALL

touch /usr/local/php-fpm/var/log/php_error.log && chmod 777 /usr/local/php-fpm/var/log/php_error.log

 

24.php-fpm进程管理

在php-fpm的配置中有下面的内容

 

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

 

 

 

 

 

 

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值