• LAMP环境搭建


    一、PHP源码安装

    一依赖包

    yum -y install wget vim pcre pcre-devel openssl openssl-devel httpd-devel libicu-devel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel krb5-devel libidn libidn-devel openldap openldap-devel nss_ldap cmake boost-devel bison automake libevent libevent-devel gd gd-devel libtool* libxslt libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-devel

    一配置

    ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-pdo --with-iconv-dir  --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir= --enable-xml --enable-session --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --enable-intl --enable-pcntl --enable-ftp --with-gd --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --with-gettext --disable-fileinfo --enable-opcache --enable-maintainer-zts --with-xsl --enable-tokenizer

    --enable-fpm

    如果是apache则加上--with-apxs2=/usr/local/apache2.4/bin/apxs 并去掉--enable-fpm

    编译并安装

    make       make  install

    中途编译失败 make clean

    二、Mysql 安装(rpm安装)

    1.先检查是否安装mysql

           yum list installed | grep mysql

           若有自带安装的则卸载,因为不一定完全

           yum remove –y mysql-libs

    2.从官网下载mysql的rpm包,有4个组件

     https://dev.mysql.com/downloads/repo/yum/

    lib common client  server

    3.依次安装

           rpm 包名 --force –nodeps

    三、安装nginx(源码安装)

    依赖包(gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel)

    下载源码包网址http://nginx.org/en/download.html

    插件模块:nginx_upstream_check_module-0.3.0.tar.gz

                    nginx-goodies-nginx-sticky-module-ng-bd312d586752.tar.gz

           软件配置:./configure --prefix=/usr/local/nginx-1.6 --with-pcre

    --with-http_stub_status_module --with-http_ssl_module

    --with-http_gzip_static_module --with-http_realip_module

    --add-module=../nginx_upstream_check_module-0.3.0

           编译并安装:make && make install

    四、设置

    1.mysql设置

           (1)更改mysql密码

                  1.1 先查看mysql初始密码

                         启动mysql:systemctl start mysqld.service

                         查看初始密码: grep “root@localhost” /var/log/mysqld.log

                  1.2 登录mysql    

                         mysql –uroot –p 回车

                         输入密码

                  1.3 更改密码

                         alter user “root”@”localhost” identified by “root123”;

           (2)设置字符集

                  2.1 查看mysql字符集

                         show variables like “%char%”;

                  2.2 设置字符编码

                         vi  /etc/my.cnf

                         加入如下代码:

                         init-connect=”SET NAMES utf8mb4” 

                         default-storage=INNODB

                         character-set-server=utf8mb4      

                         [mysql]

                         deault-character-set=utf8mb4        

                         [client]

                         deault-character-set=utf8mb4

           (3)设置远程连接:

                   1. 开放远程ip权限:grant all privileges on *.* to “xiaobai”@"%"identified by "root123"with grant option;

                         上面设置:所有ip 都能通过root用户以root123密码访问mysql的所有库和表

                   2. 关闭selinux

                         查看是否开启: getenforce  结果:Enforcing 开启 , Permissive 关闭

                         临时关闭:setenforce  0

                         永久关闭:   vim /etc/sysconfig/selinux

    SELINUX=enforcing 改为 SELINUX=disabled

    reboot    重启linux

           (4)注意问题:

                  在每次linux后,mysql服务启动都会失败,原因:无法创建pid

                  解决办法:每次重启后创建目录 mysqld

                  mkdir /var/run/mysqld

                  chown mysql.mysql /var/run/mysqld

                  原因:run目录下文件创建在内存中

    systemctl daemon-reload //刚刚配置的服务需要让systemctl能识别,就必须刷新配置
    chkconfig mysqld on    //加入随系统启动启动

    2.php设置

           (1)配置文件设置

                  1. 源码包解压后,文件夹中有php.ini-development

                  mv php.ini-development /usr/local/php/etc/php.ini

                  2. /usr/local/php/etc/下

                  cp php-fpm.conf.default  php-fpm.conf

                  vi php-fpm.conf  去掉 :pid = run/php-fpm.pid 前分号

                  3. /usr/local/php/etc/php-fpm.d/

                  cp www.conf.default  www.conf

           (2)服务控制

                  1. 启动

                         /usr/local/php/sbin/php-fpm

                         或者设置环境变量

                         vim /etc/profile

                         export PATH=/usr/local/php/sbin:$PATH

                         使环境变量生效:source /etc/profile

                         查看环境变量:echo $PATH

            (3)时区设置

                         vi /usr/local/php/etc/php.ini

                         date.timezone = PRC  

            (4)与nginx整合

                         nginx遇到.php结尾文件,交给php处理

                         location ~ .*.php$ {

           fastcgi_pass 127.0.0.1:9000;

           fastcgi_index index.php;

           include fastcgi.conf;

    }

            

    3.nginx设置

           (1)要能外部访问nginx服务,要开放80端口或关闭防火墙

                  关闭防火墙

    1.1查看防火墙是否开启

    firewall-cmd –state

    输出:not running则未开启

    1.2关闭防火墙

           systemctl stop firewalld.service //临时关闭

           systemctl disable firewalld.service //永久关闭

    开放80端口

    1.1 永久开放80端口

    firewall-cmd --zone=public --add-port=80/tcp –permanent

                  1.2 重启防火墙

                         systemctl stop firewalld.service 

    systemctl start firewalld.service 

           (2)启动nginx服务

                  2.1: /usr/local/nginx/sbin/nginx 回车

                  或设置环境变量 vi /etc/profile

                  export PATH=/usr/local/nginx/sbin:$PATH

                  之后可以直接使用nginx命令

                  2.2:查看nginx服务是否启动

                  netstat  -tunpl |grep nginx

                  2.3: nginx命令基本使用:

                  nginx –s  stop/start/reload/quit  /停止/启动/重启/请求结束后退出

                  nginx –t  检测配置文件是否正确

                  nginx –v  nginx编译时参数

                  nginx –h  查看nginx命令帮助

                  2.4:nginx信号控制

                  kill  -INT      立即关闭进程

                  kill  -QUICK  请求结束后,关闭进程

                  kill  -HUP     重启nginx服务

                  kill  -USR1  ‘cat /usr/local/nginx/logs/nginx.pid’ 重读日志文件,用于日志备份

           (3)nginx配置文件

                  详细配置参见:https://www.cnblogs.com/xuey/p/7631690.html

                  注意:nginx不像node.js可以直接向浏览器响应输出,若要实现此功能,需要添加第三方模块。

    nginx的配置,只是让请求指向某个目录,并在该目录中查找请求的文件。若请求指向了某个目录,但并没有请求某个文件,则该目录的主页返回给浏览器,请求了某个文件,但该目录中不存在,则报404,存在,则返回给浏览器。

                  3.1 查看配置文件

                  egrep -v “#|^$”  nginx.conf  去掉配置文件中注释和空行

                  3.2 配置文件内容

                  全局配置:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等

                         worker_processes  2; #不超过cpu核心数,允许生成的nginx进程数

                         user administrator administrators;  #配置用户或者组,默认为nobody nobody

                 pid /nginx/pid/nginx.pid;   #指定保存nginx进程id的文件

                         error_log log/error.log debug;  #制定错误日志路径,级别。这个设置可以放入全局块,http块,server块

                  事件配置:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等

                         event{

                     accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on

                     multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off

                     worker_connections  1024;    #每个工作进程的最大连接数,默认为512

    use epoll; #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。

    }

                  虚拟主机配置:

                         虚拟主机:4种形式(基于IP  基于端口  基于域名 混合形式)

                         1.基于ip

    http {

                 server {

            listen 192.168.239.131:80 ;

           server_name node1;

            root /var/www/vhost/131;

           }

                 server {

            listen 192.168.239.132:80 ;

            server_name node1;

            root /var/www/vhost/132;

         }       

    }

                         2.基于端口

    http {

                 server {

           listen 192.168.239.131:80;

            server_name node1;

            root /var/www/vhost/80;

           }

                 server {

            listen 192.168.239.131:808;

           server_name node1;

           root /var/www/vhost/808;

           }

    }

                         3.基于域名

    http {

                 server {

           listen 192.168.239.131:80;

           server_name vhost1;

           root /var/www/vhost/vhost1;

           }

                 server {

           listen 192.168.239.131:80;

           server_name vhost2;

           root /var/www/vhost/vhost2;

           }

    }

                         4.混合形式

    http {
                 server {
           listen 192.168.239.131:80;
           server_name node1;
           root /var/www/vhost/131_80;
           }
                 server {
           listen 192.168.239.132:808;
           server_name node1;
           root /var/www/vhost/132_808;
           }
    }

    http:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等

    server:配置虚拟主机的相关参数,一个http中可以有多个server

    如果server_name有多个,那么通过代码如$_SERVER["SERVER_NAME"]获取的始终将是Nginx server_name配置中的第一个域名,第一个域名就相当于Apache虚拟主机配置中的ServerName,后面的域名就相当于Apache的ServerAlias。

    如果nginx中有多个server块,那么请求匹配server_name的顺序如下:

    首先匹配准确的server_name,如:server_name  test.com www.test.com;

    然后匹配以*通配符开始的server_name,如:server_name  *.test.com;

    然后匹配以*通配符结束的server_name,如:server_name  www.test.*;

    最后匹配正则表达式形式的server_name,如server_name ~^(?<www>.+).test.com$;

                 以上只有有一项匹配到以后就会停止搜索。

    location:配置请求的路由,以及各种页面的处理情况

    语法:location  [ = | ~ | ~* | ^~ ]  uri  { ... } 或location @name {...}

    注:uri: 要匹配的字符串 eg: /index.php /add/  /delete

    = :对URI做精确匹配,请求的URI和patt一模一样

    ^~:最长前缀匹配,不区分字符大小写,不作正则匹配

    ~ :对URI做正则表达式模式匹配,区分字符大小写

    ~*:对URI做正则表达式模式匹配,不区分字符大小写

    !~:   符合正则不匹配,不符合匹配

    !~*: 符合正则不匹配,不符合匹配

    不带符号:普通匹配。

    匹配优先级从高到低:=, ^~, ~/~*, 不带符号

    location命中过程:

    1.先进性精准匹配,如果命中立即返回结果并结束解析的过程;

    2.精准匹配未命中判断普通匹配,如果命中多个会记录下"最长的"命中结果,但不会结束解析;

    3.继续判断正则匹配,按照正则匹配设置的规则正则表达式进行匹配,如果有多个正则匹配由上到下进行匹配,一旦匹配成功一个会立即返回结果并结束解析.

    location = / {

    proxy_pass http://tomcat:8080/index

    }   #网站首页

    location ~* .(gif|jpg|jpeg|png|css|js|ico)$ { //以xx结尾

    root /webroot/res/;

    }   #网站静态资源

    location / {

    proxy_pass http://tomcat:8080/

    }   #动态请求转发

    location ~ .*.php$ {

        fastcgi_pass 127.0.0.1:9000;

        fastcgi_index index.php;

        include fastcgi.conf;

    }   #整合php,php文件给php处理

    location 匹配,就是将不同请求导向到不同目录或服务,或对该请求进行某些操作

    匹配类型详解:

    (1)   普通匹配:就是字符串比较,包括:

    精准匹配(=):请求的地址和location中uri一模一样

    最长前缀匹配(^~):匹配成功后继续匹配,企图得到最长的匹配结果,不会进行正则匹配。

    通用匹配(不带修饰符):匹配成功后继续匹配,保留最长的结果,有正则再正则匹配。匹配效率最低

    (2)   正则匹配:字符串按正则规则比较,一旦匹配成功就结束匹配。~ 区分大小写 ,~* 不区分大小写,有这修饰符,则location中uri是正则表达式。

    (3)   文件及目录匹配:用于if(){…}中,if功能与location类似,作用域server,location。

    -f和!-f用来判断是否存在文件

    -d和!-d用来判断是否存在目录

    -e和!-e用来判断是否存在文件或目录

    -x和!-x用来判断文件是否可执行

     

    例:

    http{

           include  mime.types;   #文件扩展名与文件类型映射表

                      default_type application/octet-stream; #默认文件类型,默认text/plain

    #access_log off; #取消服务日志

    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义日志格式

           access_log log/access.log  myFormat;  #combined为日志格式的默认值

    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块

    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限

    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块

    error_page 404 https://www.baidu.com; #错误页

           server{

                  keepalive_requests 120; #单连接请求上限次数。

             listen       4545;   #监听端口

             server_name  127.0.0.1 www.blog.com;   #监听地址,后面域名是别名

    location  ~*^.+$ {      

    #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写,^~开头不做正则匹配。

                 #root path;  #站点根目录

                 #index index.php index.html;  #设置默认页

                 proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表

                 deny 127.0.0.1;  #拒绝的ip

                 allow 172.18.5.54; #允许的ip

             }

             location 路径2 {}

    }

           server{ …… }  

    }

    (1)      http配置详解:

    error_page 作用域:http server location  将某个错误重定向到某个页面

    语法:error_page  code  [=response]  uri

    code : 错误状态码

    [=response]:要返回给客户端的状态码,防止客户端访问该网页发生错误代码的时候被劫持,若省略,则客户端状态码为code

                              locastion / {

                        root /var/www/vhost/;

                            error_page 404 =200 /404.html

                    }

     

                    location /404.html {

                        root /etc/nginx/error_pages/;

                            index 404.html;

                    }

    index  作用域:http server location  用于指定默认访问资源(请求某个路径时显示的页面)

    语法 :index  filename1 filename2 …

    root  设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http, server,location, if in location。就是将请求的目录或文件指向服务器的某个目录。

    例:location  /test/  {

             root /usr/local/nginx/blog/;

             index index.html;

    }

    若匹配成功,则请求将在服务器/usr/local/nginx/blog/目录下查找test目录。下面都能匹配:

    www.blog.com:666/test/                指向到/usr/local/nginx/blog/test/ 若设有index,则显示主页

    www.blog.com:666/test/xxxx         指向到/usr/local/nginx/blog/test/xxxx 若没有xxxx404

    server_tokens  on | off | build | string  是否在响应报文的首部显示nginx版本,默认是on,建议设置为off,隐藏版本号

    sendfile  on | off;          是否启用sendfile功能,在内核中封装报文直接发送,速度更快,默认Off

    tcp_nodelay  on | off;在keepalived模式下的连接是否启用TCP_NODELAY选项

    当为off时,延迟发送,合并多个请求后再发送,凑齐多个请求后在发送给后台处理,但是这个情况可能会导致客户端等待,会比较慢,所以一般是不延迟发送,默认on时,不延迟发送

    可用于:http,server, location

    default_type  text/html;设置默认文件类型

    include 文件路径;      引入配置文件

    worker_processes 4;      配置ngxin的进程数,一般设为CPU总核数

    worker_connections 1024; 配置nginx允许单个进程并发连接的最大请求数

    listen address[:port] [default_server][ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size];

    注: address 可以访问该端口的ip/域名,不设则所有ip/域名可访问

    default_server设定为默认虚拟主机

    ssl限制仅能够通过ssl连接提供服务

    backlog=number 超过并发连接数后,新请求进入后援队列的长度

    rcvbuf=size接收缓冲区大小

    sndbuf=size 发送缓冲区大小

    alias  作用域:location  不能与root同时存在  定义路径别名

                                          server {
                                listen 80;
                                 server_name node1;
                                 location /admin/ {
                                 alias /alias/;
            
                         }

    /alias/ 是系统根目录下的alias文件夹

    keepalive_timeout  设定保持连接超时时长,0表示禁止长连接,默认为75s,可以调整短点

    keepalive_requests  在一次长连接上所允许请求的资源的最大数量,默认为100

    keepalive_disable   对哪种浏览器禁用长连接

    send_timeout      向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长

    client_header_buffer_size 32k; #上传文件大小限制

    client_body_buffer_size   用于接收每个客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置

    large_client_header_buffers 4 64k; #设定请求缓

    client_body_temp_path  设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量

    语法: client_body_temp_path  path [level1 [level2 [level3]]];

    eg: client_body_temp_path   /var/tmp/client_body  1 2 2

    注: 1  1级目录占1位16进制,即2^4=16个目录0-f

    2  2级目录占2位16进制,即2^8=256个目录00-ff

    2  3级目录占2位16进制,即2^8=256个目录00-ff

    client_max_body_size 10m; 设置客户端上传文件大小,0表示不限制,作用域:http,server,location

    limit_rate   限制响应给客户端的传输速率,单位是bytes/second,默认值0表示无限制

    limit_except  限制客户端使用除了指定的请求方法之外的其它方法,只能在locatoin中使用

    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。

    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞

    keepalive_timeout 120; #长连接超时时间,单位是秒

    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模块设置 作用域:http,server,location,if in location
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k; #最小压缩文件大小
    gzip_buffers 4 16k; #压缩缓冲区,4块,每块16k
    gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2; #压缩等级(1-9)
    gzip_types text/plain application/x-javascript text/css application/xml;
    #压缩类型,默认就已经包含text/html,图片,mp3,视屏不用压缩。
    gzip_vary on;

    limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

    aio   on | off | threads[=pool];  是否启用aio功能,默认是on

    • open_file_cache
    • open_file_cache_errors 
    • open_file_cache_min_uses
    • open_file_cache_valid

    (2)nginx常用指令

                      1.break指令
                          使用环境:server,location,if;
                          该指令的作用是完成当前的规则集,不再匹配后面规则。

    2.if指令
    使用环境:server,location
    该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。If指令不支持嵌套,不支持多个条件&&和||处理。

    3.return指令
      语法:return code ;
      使用环境:server,location,if;
      该指令用于结束规则的执行并返回状态码给客户端。
      示例:如果访问的URL以".sh"或".bash"结尾,则返回403状态码
      location ~ .*.(sh|bash)?$
      {
        return 403;
      }

    4.rewrite 指令
    语法:rewrite regex replacement flag
    使用环境:server,location,if
    该指令根据表达式来重定向URI(可以是一个http地址或文件),或者修改字符串(隐藏入口文件)。指令根据配置文件中的顺序来执行。注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句,示例如下:
      if ( $host ~* www.(.*) )
      {
        set  $host_without_www $1;
        rewrite  ^(.*)$   http://$host_without_www$1 permanent;
      }

          flag:    last            完成当前规则继续匹配后面规则,还在当前域名

                     break         完成当前规则不再匹配,直接跳转

                     redirect      返回302,临时重定向

                      permanent  返回301,永久重定向

    5.Set指令
      语法:set variable value ; 默认值:none; 使用环境:server,location,if;
      该指令用于定义一个变量,并给变量赋值。变量的值可以为文本、变量以及文本变量的联合。
      示例:set $varname "hello world";

    惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能

                         3.3 nginx日志

                         (1)日志类型:access_log(访问日志) error_log(错误日志)rewrite_log

                                访问日志:通过访问日志我们可以得到用户的IP地址、浏览器的信息,请求的处理时间等信息

                                错误日志:记录了访问出错的信息,可以帮助我们定位错误的原因

    重写日志:rewrite_log on; 它将发送所有的 rewrite 相关的日志信息到 error_log 文件中,使用 [notice] 级别。随后就可以在error_log 查看rewrite信息了

                         (2)设置访问日志:

                                access_log指令的作用域分别有http,server,location,limit_except

                                access_log off; #表示关闭访问日志

                      access_log path [格式名 [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

                      注: path    指定日志存放路径

                          格式名  指定日志格式,不写则默认为combined,使用自定义格式则写上格式名引入

                          buffer  指定日志写入时的缓存大小

                          gzip    日志写入前先进行压缩,指定压缩比1-9,默认1,数值越大压缩速度越慢

                          flush   设置缓存有效时间

                          if      条件判断,若为假则该请求不写入日志

                      例:access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m

                      默认的日志格式:combined

                      log_format combined '$remote_addr - $remote_user [$time_local] '

                        '"$request" $status $body_bytes_sent '

                        '"$http_referer" "$http_user_agent"';

                      自定义日志格式:log_format 一般写在http段中

                      log_format name [escape=default|json] string ...;

                      注: name    格式名 

                          escape   设置字符中变量编码方式是json还是default,默认default

                          string   日志格式字符串,参数中可使用nginx变量

                      日志格式相关变量:

                          $bytes_sent  发送给客户端的总字节数

    $body_bytes_sent 发送给客户端的字节数,不包括响应头的大小

    $connection  连接序列号

    $connection_requests 当前通过连接发出的请求数量

    $msec    日志写入时间,单位为秒,精度是毫秒

    $pipe    如果请求是通过http流水线发送,则其值为"p",否则为“."

    $request         完整的原始请求行,如 "GET / HTTP/1.1"

    $request_length  请求长度(包括请求行,请求头和请求体)

    $request_time    请求处理时长,单位为秒,精度为毫秒,从读入客户端的第一个字节开始,直到把最后一个字符发送张客户端进行日志写入为止

    $request_uri     完整的请求地址,如 https://daojia.com/

    $status  响应状态码

    $time_iso8601   标准格式的本地时间,形如“2017-05-24T18:31:27+08:00”

    $time_local  通用日志格式下的本地时间,如"24/May/2017:18:31:27 +0800"

    $remote_addr     客户端IP

    $remote_user     客户端用户名称,针对启用了用户认证的请求

    $http_referer    请求的referer地址。

    $http_user_agent 客户端浏览器信息。

    $http_x_forwarded_for  当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置。即有负载均衡服务器时用此设置获取客户端ip

    其它变量参见nginx官方文档http://nginx.org/en/docs/varindex.html

    注:当格式中某个变量为空时,显示:-

    例: main格式

            log_format main '$remote_addr - $remote_user [$time_local] "$request" '

    '$status $body_bytes_sent "$http_referer" '

    '"$http_user_agent" "$http_x_forwarded_for"'

    '$upstream_addr $upstream_response_time $request_time ';

        json格式:

            log_format logstash_json '{"@timestamp":"$time_iso8601",'

    '"host": "$server_addr",'

    '"client": "$remote_addr",'

    '"size": $body_bytes_sent,'

    '"responsetime": $request_time,'

    '"domain": "$host",'

    '"url":"$request_uri",'

    '"referer": "$http_referer",'

    '"agent": "$http_user_agent",'

    '"status":"$status",'

    '"x_forwarded_for":"$http_x_forwarded_for"}';

                 (3)设置错误日志:

                                作用域: http, server, location, mail, stream, main

                                error_log path [level];

                      注: path  日志存储的路径

                          level  日志级别,默认为error

    日志级别:debug|info|notice|warn|error|crit|alert|emerg 级别从左到右依次变低,越低信息越少

    open_log_file_cache off; 如果日志文件路径中有变量,则使用它设置日志文件描述符缓存,提高性能

                                语法:open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

                      注: max          设置缓存中最多容纳的文件描述符数量,如果被占满,采用LRU算法将描述符关闭

                          inactive     设置缓存存活时间,默认是10s

                          min_uses     在inactive时间段内,日志文件最少使用几次,该日志文件描述符记入缓存,默认是1次

                          valid        设置多久对日志文件名进行检查,看是否发生变化,默认是60s

                 (4)日志分割及备份

                    通过自定义脚本,完成日志的分割和备份,使用定时任务,实现自动备份。

                    runlog.sh:

                    #!/bin/bash

                    LOGPATH=/usr/local/nginx/logs/blog.com.access.log #日志文件位置

                    bak=/date/nginx_log/$(date -d yesterday +%Y%m%d%H%m).blog.com.access.log #备份的位置

                    mv $LOGPATH $bak  #移动日志文件,并重命名

                    touch $LOGPATH  #新建日志文件

    kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid) #使新建的日志文件被nginx加载,nginx运行后以inode号加载日志文件,只新建日志文件不能被使用

    定时任务:cron服务是Linux的内置服务,但它不会开机自动启动

                      systemctl /start/stop/restart/reload  crond

                      设置开机启动:在 /etc/rc.d/rc.local 脚本中加入 /sbin/service crond start

                查看当前用户的定时任务:crontab –l

                查看日志 tail /var/log/cron

                编辑定时任务:crontab –e

                删除定时任务(全部):crontab –r

                编辑定时任务格式:

    *   *   *  *    *  命令  #注意*间有空格

    分钟   小时   日    月     星期

    (0-59)(0-23)(1-31)(1-12)(0-6)

    例:

    0,30 18-23 * * *  18:00-23:00每间隔30分钟执行

    0 23 * * 6          星期6,23:00执行

    * */1 * * *         每小时执行

    * 23-7/1 * * *     23:00-7:00间每小时执行

    0 4 1 jan *         一月一号4:00

    0 0 10-20 * *     10号~20号,每天00:00执行

    注意事项:   1.日志备份目录有可写权限

                      2.脚本其他用户有可执行权限,755

                 3.4 部署TP框架

                                (1)先将tp源代码下载到nginx目录下

                                       tp放到/usr/local/nginx/目录下,root为相对路径,如:

                                       tp在/usr/local/nginx/wwwroot/ 则 root wwwroot/public;

                                       tp不再nginx目录,则使用alias 绝对路径指定,不需要root。

                                       注意:存放tp的目录要有可执行权限,否则无法进入目录,访问报403

                                (2)servr配置:

    server {
    listen 80;
    server_name tp5.com;
    access_log /data/wwwlogs/mit.520m.com.cn_nginx.log combined;
    index index.html index.htm index.php;
    root wwwroot/tp5; 

    location  /  { # /网站根目录,所有请求都能匹配到这个路由

    if (!-e $request_filename) { #如果请求的内容在nignx中不是一个文件或目录
    rewrite ^/(.*)$  /index.php/$1  last;
    break;
    }

    }      #隐藏入口文件
    location ~ .*.php {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    set $real_script_name $fastcgi_script_name;
    if ($fastcgi_script_name ~ "^(.+?.php)(/.+)$") {
    set $real_script_name $1;
    set $path_info $2;
    }
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    fastcgi_param SCRIPT_NAME $real_script_name;
    fastcgi_param PATH_INFO $path_info;
    }
    }

                         3.5 负载均衡配置

    1.什么是负载均衡:

    将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务

    2.实现的方式

           (1)软件:在一台或多台服务器相应的操作系统上安装一个或多个附加软件来实现负载均衡

                                      1、基于DNS的负载均衡

    由于在DNS服务器中,可以为多个不同的地址配置相同的名字,最终查询这个名字的客户机将在解析这个名字时得到其中一个地址,所以这种代理方式是通过DNS服务中的随机名字解析域名和IP来实现负载均衡。

    2、反向代理负载均衡(如Apache+JK2+Tomcat这种组合)

    该种代理方式与普通的代理方式不同,标准代理方式是客户使用代理访问多个外部Web服务器,之所以被称为反向代理模式是因为这种代理方式是多个客户使用它访问内部Web服务器,而非访问外部服务器。

    3、基于NAT(Network Address Translation)的负载均衡技术

    该技术通过一个地址转换网关将每个外部连接均匀转换为不同的内部服务器地址,因此外部网络中的计算机就各自与自己转换得到的地址上的服务器进行通信,从而达到负载均衡的目的。其中网络地址转换网关位于外部地址和内部地址之间,不仅可以实现当外部客户机访问转换网关的某一外部地址时可以转发到某一映射的内部的地址上,还可使内部地址的计算机能访问外部网络。

           (2)硬件:安装负载均衡器

    由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。

    3.负载均衡算法:静态/动态算法

                               1、轮询法

    轮询法,就是将用户的请求轮流分配给服务器,就像是挨个数数,轮流分配。这种算法比较简单,他具有绝对均衡的优点,但是也正是因为绝对均衡它必须付出很大的代价,例如它无法保证分配任务的合理性,无法根据服务器承受能力来分配任务。

    2、随机法

    随机法,是随机选择一台服务器来分配任务。它保证了请求的分散性达到了均衡的目的。同时它是没有状态的不需要维持上次的选择状态和均衡因子[5]。但是随着任务量的增大,它的效果趋向轮询后也会具有轮询算法的部分缺点。

    3、最小连接法

    最小连接法,将任务分配给此时具有最小连接数的节点,因此它是动态负载均衡算法。一个节点收到一个任务后连接数就会加1,当节点故障时就将节点权值设置为0,不再给节点分配任务。

    4.nginx负载均衡配置

           (1)建立连接池(负载均衡服务器)

           upstream 连接池名 {

                  #ip_hash;

            #fair; 服务器响应时间越短,优先分发

        server 后端服务器名 [参数];

        server 后端服务器名 [参数];

    }

    upstream 支持 轮询,权重,ip哈希算法( 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个应用服务器,可以解决session共享的问题),作用域http

    后端服务器名:ip 域名 端口号

    参数:

    weight=1 权重,权重和访问比率成正比,用于应用服务器性能不均的情况

    down    永久离线,标记坏掉的服务器

    max_fails=1    允许请求失败的次数,默认1

    fail_timeout    max_fails次请求失败后,暂停的时间

    backup          该台服务器备份用,其它服务器宕机后请求它

    (2)在虚拟主机中使用连接池

    server {

           listen 80;

           server_name www.blog.com;

           location / {

           proxy_pass http://连接池名;

           proxy_ser_header Host $host;

           proxy_ser_header X-Real-IP $remote_addr;

           proxy_ser_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

    }

  • 相关阅读:
    开发servlet三种方式
    puppet 启动失败
    linux 内核 中链表list
    software level
    ubuntu 使用 root “sudo /bin/bash”
    linux 内存管理
    linux kernel "current" macro
    hello.hs haskell
    ubuntu samba
    微信小程序中使用 npm包管理 (保姆式教程)
  • 原文地址:https://www.cnblogs.com/fanshehu/p/11832976.html
Copyright © 2020-2023  润新知