作者归档:kite

debris

1.apache xSendFile支持

在我们提供文件下载、图片展示功能时,可能需要让php进行条件判断后(比如权限判断、扣除下载点数等),再循环读文件进行传输。这样做小文件还好,当遇到大文件时就会占用较多的内存资源,同时减慢了文件的传输速度。这个时候就需要xsendfile特性了,通过header发送xsendfile标记,可以直接把需要传输的文件直接交给web服务处理,大大减少了后台语言的资源占用,也加快了传输速度。

Ubuntu 安装xSendFile   sudo apt-get install libapache2-mod-xsendfile

xsendfile默认是关闭状态的,需要在virtual host(配置虚拟机的地方)添加两条指令

XSendFile on
XSendFilePath d:/xampp/file_path

xsendfilepath是必须配置的,因为如果不配置的话,php脚本只能调用当前及子目录的文件

脚本添加 header(‘X-Sendfile: filename.jpg’);

2.使用fsockopen实现异步调用方法

function post_socket()
{
    $fp = fsockopen("www.wenjunting.com", 80, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $arr = array('key'=>1,'name'=>'test');
        $encodeData = http_build_query($arr);

        $out = "POST /test.php HTTP/1.1\r\n";
        $out .= "Host: www.wenjunting.com \r\n";
        $out .= "Content-type: application/x-www-form-urlencoded\r\n";
        $out .= "Content-Length: ".strlen(trim($encodeData ))."\r\n";
        $out .= "Connection: Close\r\n\r\n";
        $out .= trim($data);
        fwrite($fp, $out);
       //忽略执行结果
      /* while (!feof($fp)) {
          echo fgets($fp, 128).'<br/>';
      }*/
      fclose($fp);
   }
}
更多异步方法

3.批量关闭Linux进程
 ps -ef|grep php|grep -v grep|awk '{print $2}'|xargs kill -INT  //xargs 将标准输出作为kill命令的参数


PHP7.0.19 连接SQL Server2005

  1. php.ini 需要开启扩展,但php自带扩展库中没有该数据库的扩展,就需要在微软下载,

下载地址: https://www.microsoft.com/en-us/download/details.aspx?id=20098 下载SQLSRV40.EXE

2. 解压得到php7各版本的dll动态扩展库,选择适合自己版本的放在php安装目录下的ext目录下

3. 修改php.ini 文件我这里是php7非线程安全的 :

extension=php_sqlsrv_7_nts_x64.dll

extension=php_pdo_sqlsrv_7_nts_x64.dll

4 .安装ODBC Driver 11 For SQL (msodbcsql.msi),安装时选中 ODBC Driver for SQL Server SDK安装,

下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=36434

5. 重启服务器或fastcgi

6. 打印phpinfo页面,查看pdo/pdo_sqlsrv/扩展是否开启

7. 如果开启了,使用pdo连接下数据库,如果还显示驱动不存在,再去配置数据库

数据库连接实例请参照php官网

8. SQL Server配置:在开始菜单或我的电脑管理中查找SQL Server 配置管理工具—

网络配置中启动Named Pipes协议和TCP/IP协议,重启数据库服务即可。

windows下编译php7 memcache.dll扩展

最近在配置windows云服务器,安装了最新的php7.0.20,想装个memcache发现官网的memcahce.dll扩展没有支持到php7,

查看了相关的文档决定自己在windows下编译memcache.dll扩展。

由于php_memcache.dll的官方编译出来的版本支持到PHP 5.6就断了,幸运的是,虽然放出的已编译版本停了,但是源码还在更新,

并且支持了7.1。所以,我就只好操起不熟练的VS 2015命令行进行编译适合自己的php_memcache.dll。

1. 下载安装VS 2015,安装是选择全部安装,但占用空间比较大,如果是固态硬盘建议安装可以选择vc++功能。剩下的就等待安装完成了。

2. 编译环境有了,还需要有PHP的sdk,不然还是编译不了,下载地址如下: http://windows.php.net/downloads/php-sdk/

下载划线的两个压缩文件到本地

3.下载memcache源码包,下载地址:https://github.com/websupport-sk/pecl-memcache

4.下载php7.0.20源码 下载地址: http://windows.php.net/downloads/releases/ 下载对应的php源码,我这里是 php-7.0.20-Win32-VC14-x64.zip

5. 编译前的准备,创建一个编译目录 E:\compile,解压php-sdk-binary-tools-20110915.zip里面的文件到compile目录下,

编辑 E:\compile\bin\phpsdk_buildtree.bat,在 GOTO EXIT 前增加代码:
           MD %_%\vc14\x86\deps\bin
           MD %_%\vc14\x86\deps\lib 
           MD %_%\vc14\x86\deps\include
           MD %_%\vc14\x64\deps\bin 
           MD %_%\vc14\x64\deps\lib 
           MD %_%\vc14\x64\deps\include
 注:这是因为phpsdk_buildtree.bat比较旧(毕竟2011年的古董),还不支持VC14,因此需要添加代码让其支持 VC14
6.在开始菜单找到并打开 VS2015 x64 本机工具命令提示符(注:如果要编译32位的,则需进入VS2015 x86 本机工具命令提示符),
 用cd 命令进入 E:\compile,执行如下两条命令: 
bin\phpsdk_setvars.bat 
bin\phpsdk_buildtree.bat phpdev 

7.执行无误后,目录下会生成phpdev文件夹,cd 到 phpdev/vc14/x64目录下,
把deps-7.0-vc14-x64.7z解压到该目录下,覆盖deps文件夹,并把php源代码也解压到x64目录下,将解压后的目录名改为PHP7
   8.在x64目录下创建pecl文件夹,,将下载的memcache代码全部解压到这个目录下改名为memcache,目录结构如下,  再在x64目录下创建obj文件,用来存放编译后的文件
  
















 9. 准备编译;
在刚才的 VS2015 x64 本机工具命令提示符依次执行以下命令,用于创建php编译配置:
cd phpdev\vc14\x64\php7
buildconf 
configure --help >..\configure_help.txt 
configure --disable-all --enable-cli --enable-zlib --enable-hash --enable-session --without-gd 
--with-bz2 --enable-memcache=shared --enable-object-out-dir=..\obj
注:以上参数为编译线程安全版本的php_memcache.dll,如果需要编译非线程安全版本的,需要加入参数 --disable-zts
/确认下安装的php是线程安全还是非线程安全,确认完根据需要选择参数,不然也用不了。
10.如果不出意外,此时就可以使用如下命令来进行编译工作了: nmake 注:这里经常会出问题,具体问题需要大家根据错误原因自行百度解决方法, 
当问题都解决了之后, 就可以在E:\PHPCompile\phpdev\vc14\x64\obj\Release_TS\下找到php_memcache.dll了。 

11.安装,将编译的php_memcache.dll复制到ext目录下,修改php.ini扩展: extension=php_memcache.dll  

12.打印phpinfo,如果存在memcache则表示安装成功,反之检查php_error_log文件. 

13.其他配置按需。在此不在赘述。需要文件可以联系我的邮箱:461488042@qq.com

 

window 安装 nginx-1.8.3+php7.0+mysql5.7

1.下载nginx1.8 + php7.0 + mysql5.7.16

nginx 下载地址: http://nginx.org/en/download.html

php7.0 下载地址:http://windows.php.net/download#php-7.0   vc-x64 非线程安全

mysql5.7.16 下载地址: https://dev.mysql.com/downloads/mysql/  下载社区版zip包

2. 安装和配置 nginx1.8

解压nginx1.8的zip包到安装目录,配置conf/nginx.conf

 新增 .php文件为默认文件   

       location / {
            root   html;
            index  index.html index.htm inde.php;
        }
    开启文件gzip压缩
      gzip on;  #开启gzip压缩
      gzip_min_length 1k;  #设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大
      gzip_buffers 16 16k; #设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。16 16k代表以16k为单位,安装原始数据大小以16k为单位的16倍申请内存。
      gzip_http_version 1.1; #识别http协议版本号
      gzip_comp_level 9; #文件压缩比  1-9 1 压缩比最小,处理速度最快  9压缩比最高处理速度慢,响应最快
      gzip_types  text/plain application/x-javascript text/css application/xml; #/匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。
      gzip_vary on; #和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
   设置fast-cgi 和 支持phpinfo
       location ~ \.php {
             set $path_info "";
             #定义变量 $real_script_name,用于存放真实地址
             set $real_script_name $fastcgi_script_name;
             #如果地址与引号内的正则表达式匹配
            if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
               #将文件地址赋值给变量 $real_script_name
                set $real_script_name $1;
               #将文件地址后的参数赋值给变量 $path_info
              set $path_info $2;
                 }
             root D:\www\safe;
             fastcgi_pass 127.0.0.1:9000;
             fastcgi_index index.php
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
             fastcgi_param PATH_INFO $path_info;
             fastcgi_param SCRIPT_NAME $real_script_name;
            include fastcgi_params;
        }
    备注:其他配置根据实际需要更改

3. php.ini 配置文件修改

修改php.ini-development文件,将文件名修改为php.ini,打开php配置文件php.ini,保存即可。

搜索“extension_dir”,找到: e;xtension_dir = “ext” 先去前面的分号再改为 extension_dir = “.\ext”

搜索“date.timezone”,找到:;date.timezone = 先去前面的分号再改为 date.timezone = PRC

搜索“enable_dl”,找到:enable_dl = Off 改为 enable_dl = On

搜索“cgi.force_redirect” ;cgi.force_redirect = 1 先去前面的分号再改为 cgi.force_redirect = 0

搜索“fastcgi.impersonate”,找到: ;fastcgi.impersonate = 1 去掉前面的分号

搜索“cgi.rfc2616_headers”,找到:;cgi.rfc2616_headers = 0 先去前面的分号再改为 cgi.rfc2616_headers = 1

   备注:其他配置项按需配置。

4. 使用其他工具启动php-cgi和nginx

 下载一个RunHiddenConsole.exe,开启php-cgi和nginx.exe,保存为run.bat     

RunHiddenConsole.exe的作用是在执行完命令行脚本后可以自动关闭脚本,而从脚本中开启的进程不被关闭。简单来说就是黑窗体(CMD命令窗体)不会显示,但CMD命令窗体中运行的程序不会被关闭。

          @echo off
          echo Starting PHP FastCGI...
          C:\php+nginx+mysql\RunHiddenConsole.exe C:\php+nginx+mysql\php\php-cgi.exe -b 127.0.0.1:9000 -c C:\php+nginx+mysql\php\php.ini
          echo Starting nginx...
          c\nginx\RunHiddenConsole.exe C:\php+nginx+mysql\nginx\nginx.exe -p C:\php+nginx+mysql\nginx

    关闭php-cgi和nginx.exe,保存为stop.bat   
         @echo off
         echo Stopping nginx...
         taskkill /F /IM nginx.exe > nul
         echo Stopping PHP FastCGI...
         taskkill /F /IM php-cgi.exe > nul
         exit

 

4. 安装mysql

解压mysql.zip包到安装目录

1. 设置环境变量path 的值   把mysql bin目录追加到path变量中

2.cmd以超级管理员运行,切换到mysql/bin目录,执行 mysqld –initialize-insecure 初始化无密码安装,执行完成生产data目录,运行错误需要安装vc++和 Microsoft DirectX 9 和 Microsoft DirectX 修复工具 修复

3.运行 mysqld –install 安装服务

4.配置my.ini文件(需先初始化安装在配置文件,且文件需要ansi格式编码,不能是utf-8或gbk

5. 启动 net start mysql

6 停止 net stop mysql

7.修改用户密码请参照: http://www.wenjunting.com/?p=68


					

linux 测网速的方法

很多时候我们需要测试Linux服务器的上行和下行速度。

1 下载脚本  wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py

2 赋予脚本执行权限  chmod +x speedtest-cli

3 执行脚本  ./speedtest-cli

58到家数据库30条设计规定

一、基础规范

(1)必须使用InnoDB存储引擎

解读:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高

 

(2)必须使用UTF8字符集

解读:万国码,无需转码,无乱码风险,节省空间,新库默认使用utf8mb4字符集。

utf8mb4是utf8的超集,emoji表情以及部分不常见汉字在utf8下会表现为乱码,故需要升级至utf8mb4。

默认使用这个字符集的原因是:“标准,万国码,无需转码,无乱码风险”,并不“节省空间”。

 

(3)数据表、数据字段必须加入中文注释

解读:N年后谁tm知道这个r1,r2,r3字段是干嘛的

 

(4)禁止使用存储过程、视图、触发器、Event

解读:高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。数据库擅长存储与索引,CPU计算还是上移吧

 

(5)禁止存储大文件或者大照片

解读:为何要让数据库做它不擅长的事情?大文件和照片存储在文件系统,数据库里存URI多好

 

二、命名规范

(6)只允许使用内网域名,而不是ip连接数据库

 

(7)线上环境、开发环境、测试环境数据库内网域名遵循命名规范

业务名称:xxx

线上环境:dj.xxx.db

开发环境:dj.xxx.rdb

测试环境:dj.xxx.tdb

从库在名称后加-s标识,备库在名称后加-ss标识

线上从库:dj.xxx-s.db

线上备库:dj.xxx-sss.db

 

(8)库名、表名、字段名:小写,下划线风格,不超过32个字符,必须见名知意,禁止拼音英文混用

 

(9)表名t_xxx,非唯一索引名idx_xxx,唯一索引名uniq_xxx

 

三、表设计规范

(10)单实例表数目必须小于500

 

(11)单表列数目必须小于30

 

(12)表必须有主键,例如自增主键

解读:

a)主键递增,数据行写入可以提高插入性能,可以避免page分裂,减少表碎片提升空间和内存的使用

b)主键要选择较短的数据类型, Innodb引擎普通索引都会保存主键的值,较短的数据类型可以有效的减少索引的磁盘空间,提高索引的缓存效率

c) 无主键的表删除,在row模式的主从架构,会导致备库夯住

 

(13)禁止使用外键,如果有外键完整性约束,需要应用程序控制

解读:外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql 的性能,甚至会造成死锁。高并发情况下容易造成数据库性能,大数据高并发业务场景数据库使用以性能优先

 

四、字段设计规范

(14)必须把字段定义为NOT NULL并且提供默认值

解读:

a)null的列使索引/索引统计/值比较都更加复杂,对MySQL来说更难优化

b)null 这种类型MySQL内部需要进行特殊处理,增加数据库处理记录的复杂性;同等条件下,表中有较多空字段的时候,数据库的处理性能会降低很多

c)null值需要更多的存储空,无论是表还是索引中每行中的null的列都需要额外的空间来标识

d)对null 的处理时候,只能采用is null或is not null,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’shenjian’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录

 

(15)禁止使用TEXT、BLOB类型

解读:会浪费更多的磁盘和内存空间,非必要的大量的大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能

 

(16)禁止使用小数存储货币

解读:使用整数吧,小数容易导致钱对不上

 

(17)必须使用varchar(20)存储手机号

解读:

a)涉及到区号或者国家代号,可能出现+-()

b)手机号会去做数学运算么?

c)varchar可以支持模糊查询,例如:like“138%”

 

(18)禁止使用ENUM,可使用TINYINT代替

解读:

a)增加新的ENUM值要做DDL操作

b)ENUM的内部实际存储就是整数,你以为自己定义的是字符串?

 

五、索引设计规范

(19)单表索引建议控制在5个以内

 

(20)单索引字段数不允许超过5个

解读:字段超过5个时,实际已经起不到有效过滤数据的作用了

 

(21)禁止在更新十分频繁、区分度不高的属性上建立索引

解读:

a)更新会变更B+树,更新频繁的字段建立索引会大大降低数据库性能

b)“性别”这种区分度不大的属性,建立索引是没有什么意义的,不能有效过滤数据,性能与全表扫描类似

 

(22)建立组合索引,必须把区分度高的字段放在前面

解读:能够更加有效的过滤数据

 

六、SQL使用规范

(23)禁止使用SELECT *,只获取必要的字段,需要显示说明列属性

解读:

a)读取不需要的列会增加CPU、IO、NET消耗

b)不能有效的利用覆盖索引

c)使用SELECT *容易在增加或者删除字段后出现程序BUG

 

(24)禁止使用INSERT INTO t_xxx VALUES(xxx),必须显示指定插入的列属性

解读:容易在增加或者删除字段后出现程序BUG

 

(25)禁止使用属性隐式转换

解读:SELECT uid FROM t_user WHERE phone=13812345678 会导致全表扫描,而不能命中phone索引,猜猜为什么?(这个线上问题不止出现过一次)

 

(26)禁止在WHERE条件的属性上使用函数或者表达式

解读:SELECT uid FROM t_user WHERE from_unixtime(day)>=’2017-02-15′ 会导致全表扫描

正确的写法是:SELECT uid FROM t_user WHERE day>= unix_timestamp(‘2017-02-15 00:00:00’)

 

(27)禁止负向查询,以及%开头的模糊查询

解读:

a)负向查询条件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,会导致全表扫描

b)%开头的模糊查询,会导致全表扫描

 

(28)禁止大表使用JOIN查询,禁止大表使用子查询

解读:会产生临时表,消耗较多内存与CPU,极大影响数据库性能

 

(29)禁止使用OR条件,必须改为IN查询

解读:旧版本Mysql的OR查询是不能命中索引的,即使能命中索引,为何要让数据库耗费更多的CPU帮助实施查询优化呢?

 

(30)应用程序必须捕获SQL异常,并有相应处理

使用虚拟机 VirtualBox 管理工具vagrant

在项目开发中需要使用lamp、lnmp等各种环境各类型软件,安装维护等等各种不方便,使用vagrant和virtualbox来管理虚拟机可以在开发环境、测试环境或个人计算机都可以方便的安装不同的虚拟机。同时可灵活配置ip,端口转发,共享目录等,还可以打包配置好的系统分发使用。

vagrant 下载地址:https://www.vagrantup.com/downloads.html

virtualbox下载地址:https://www.virtualbox.org/wiki/Downloads

可以根据自己的系统下载合适的版本,可以在vagrant官网查看版本兼容,都是外网,需要耐心等待下载会比较慢。box系统文件也需要在vagrant官网下载或其他途径,请自行百度。准备完成即可安装两款软件。安装完成【需要重启改变环境变量】后按照以下配置:

vagrant 常用的命令:

vagrant box list     查看box列表

vagrant box  add   box名称  .box系统文件 # 添加box

vagrant box remove box名称    #移除box

vagrant init box名称    #初始化一个虚拟机

vagrant  up                    #在虚拟机目录开启虚拟机

vagrant ssh                  #登录到虚拟机  windows下使用xshell

vagrant halt               #关闭虚拟机

vagrant reload         #重新启动虚拟机

vagrant destroy  虚拟机名称         #销毁虚拟机

vagrant suspend       #挂起虚拟机

更多命令 : https://www.vagrantup.com/docs/boxes.html

添加虚拟机的步骤如下:

1. 添加.box为后缀的系统文件到vagrant 的安装目录,   输入 vagrant add box 系统名称 (系统的名称) .box系统文件的位置

使用vagrant box list 查看系统中添加成功的box,添加成功后就可以初始化虚拟机。

2. 新建虚拟机目录安装 ,然后切换到虚拟机安装目录,输入命令 vagrant init 系统名称 (初始化虚拟机)

3. 输入命令vagrant up 启动虚拟机,启动虚拟机时先手动启动VirtualBox,才能启动虚拟机。

4.配置虚拟机配置文件:在初始化虚拟机后可以在虚拟机安装目录下看到生成Vagrantfile文件,可以编辑改文件后重启虚拟机生效。

5.配置文件配置项说明:

config.vm.box = “ubuntu1604”  #box名称 系统初始化名称 

config.vm.hostname = ‘ubuntu’   #虚拟机内部主机名称

config.vm.network “forwarded_port”, guest:80,host:8080 #端口转发 、本地端口转发至虚拟机

config.vm.network “private_network”,  ip:”192.168.1.1″  #设置静态的私有ip,主机可访问

config.vm.network “public_network”,  ip:”192.168.1.10″ #设置静态的公有ip,局域网可访问

config.vm.synced_folder "../project", "/src/website"  #共享目录
#设置了同步目录需要修改apache或nginx配置【关闭后实时同步】 
#nginx  配置 :sendfile off;
#apache 配置 : EnableSendfile off; 默认是关闭的。不需要更改

config.vm.provider “virtualbox” do |vb|

vb.name = ‘ubuntu1604’   #虚拟机名称

vb.cpus = 2    #虚拟机cpu数量

vb.memory = ‘1024’   #虚拟机内存M

#vb.gui = true    #此配置可以在出错时在界面查看错误位置

end

6. 打包分发配置好的虚拟机

打包命令:  vagrant package  [–output ubuntu.box【打包box文件】] [–base 设置虚拟机名称]

分发可以通过文件拷贝.box文件即可 ,安装初始化如上所述。

 

使用Haproxy实现反向代理

反向理软件很多,原理都是大同小异,可以使用Apache、Nginx、Haproxy等等。

Haproxy是一款功能强大、灵活好用反向代理软件,提供了高可用、负载均衡、后端服务器代理的功能,它在7层负载均衡方面的功能很强大(支持cookie track, header rewrite等等),支持双机热备,支持虚拟主机,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入;同时还提供直观的监控页面,可以清晰实时的监控服务集群的运行状况。

当用户并发请求达到一定的数量时,使用Haproxy进行负载均衡有明显的优势;而且Haproxy还可以根据用户的cookies,根据调度算法,将用户一直定向分配到以前访问过的后端服务器上;为了提高网站访问速度,一般在Haproxy的后端都要配置缓存服务器,可以是静态页面内容的缓存,也可以是动态网页内容的缓存,生产环境中有必要添加Mysql的缓存。
用户访问网站域名时,DNS解析到IP和主机头发送到外网接口Haproxy服务器上,Haproxy将请求直接转发(tcp)至后方服务器,或者先分析用户请求,然后以客户端身份向后端服务器发出同样的请求(http),获得后方服务器返回的内容后重新封装,响应给客户端,此时Haproxy如同代理商处理请求和响应请求。

配置文件安装目录:/etc/haproxy/haproxy.conf
Haproxy的配置文件分为四个部分:
全局配置:
global:  全局配置段
代理配置:
default: 默认配置—–>所有在backend、frontend、linsten中相同内容可以在此定义;
frontend:前段配置—–>定义前端套接字,接受客户端请求;
backend: 后端配置—–>定义后端分配规则,与后端服务器交互;
listen:  绑定配置—–>直接将指定的客户端与后端特定服务器绑定到一起;
通常没有特别需求,不需要手动调试配置文件里面的选项,大部分默认值就可以满足我们的需求;而且官方文档介绍说很多选项都建议使用默认。

简单配置如下:

global #全局配置
#运行配置
log /dev/log local0 #记录日志 记录位置 等级
log /dev/log local1 notice
chroot /var/lib/haproxy #修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别
#不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限

stats socket /run/haproxy/admin.sock mode 660 level admin #用户访问统计数据的接口
stats timeout 30s

user haproxy #指定身份运行 同uid
group haproxy #指定组运行 同gid
daemon #让haproxy以守护进程的方式工作于后台

#性能配置
maxconn 65535 #设定每个haproxy进程所接受的最大并发连接数

#ssl证书配置
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private

# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
#代理配置
defaults #用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一                      #个“defaults”所重新设定
log global
mode http
option httplog #启用记录HTTP请求、会话状态和计时器的功能
option dontlognull
option httpclose
option forwardfor #允许在发往服务器的请求首部中插入“X-Forwarded-For”首部
timeout connect 5000 #定义haproxy将客户端请求转发至后端服务器所等待的超时时长

timeout client 50000 #客户端非活动状态的超时时长
timeout server 50000 #客户端与服务器端建立连接后,等待服务器端的超时时长
#errorfile 在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成      #的错误代码;可用于所有段中 http状态码 响应文件位置
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http

#监听设置
listen admin_status
bind 10.2.5.110:8888 #绑定监听地址和端口
mode http #运行协议
stats refresh 5s #统计界面的刷新周期
stats uri /admin?stats # 自定义统计页面的URL
stats realm number #设置密码提示
stats auth root:123456!zxc #进入统计页面的账号密码
stats auth admin:12345678
stats admin if TRUE #启用统计报告页面的管理级别功能
listen site_status
bind 10.2.5.110:18000 #绑定监听地址和端口
mode http
monitor-uri /site_status #进入查看运行情况

frontend http_80_in # frontend 用于定义一系列监听的套接字,这些套接字可接受客户端#请求并与之建立连接
bind 116.204.64.61:80 #绑定的公网ip和端口 域名A记录指向ip
mode http
option forwardfor #允许在发往服务器的请求首部中插入“X-Forwarded-For”首部

#ACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息来做出转发决#策、简单的说就是根据主机头匹配响应数据
######ACL Ctrl###########
acl s1 hdr(host) -i www.jinfeijie.com #acl定义 这句配置的意思就是查看报文中的首部不区 #分大小写是否满足后面的字符串value

use_backend svr_mcc_web if s1 #如果有匹配的acl,则转发给backend处理,否则跳转到default_backend
default_backend svr_mcc_web #未匹配到acl 时使用的后端

#backend 配置
backend svr_mcc_web
mode http
cookie SERVERID # 允许向cookie中插入SERVERID,服务器的SERVERID在后端使用#cookie关键字定义
#option httpchk get /work.html #开启对后端服务器的健康检查,通过检查work.html文件#来判断服务器的健康状况
server web_mcc 10.2.5.68:80 cookie 1 check inter 3000 rise 3 fall 3 #定义后端服务器地址#和端口和服务器的cookieid,并对服务器进行检查间隔为3000毫秒,连续3次成功认为是  #有效的,连续3次失败则认为检查失败,服务器宕机

 

 

 

使用Nginx实现反向代理与负载均衡

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

Nginx 反向代理的指令不需要新增额外的模块,默认自带 proxy_pass 指令,只需要修改配置文件就可以实现反向代理。

Nginx反向代理应用场景可以作为web服务器负载均衡的服务器,同时也可以作为一个代理服务器【一个公网ip对应多个站点做代理服务使用】

 

 

  1.   Nginx 实现反向代理

域名服务商—>绑定A记录到代理服务器–>代理服务器解析server_name->设置转发请求到指定服务器

upstream website{
server 192.168.1.254:81;   #内部服务器ip:port
}
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

root /usr/share/nginx/html;
index index.php index.html index.htm;   #目录下默认加载文件
# Make site accessible from http://localhost/
server_name 127.0.0.1;  #域名或ip

#通过访问service二级目录来访问后台
location /service/ {
#website后面的斜杠是一个关键,没有斜杠的话就会传递service到后端节点导致404
proxy_pass http://website/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

#其他路径默认访问前台网站
location / {
proxy_pass http://website;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

2. Nginx 实现负载均衡

……

 

Linux Ubuntu 安装配置 Nginx

  1. 使用sudo apt-get  install  nginx 命令安装Nginx,
  2. 安装 fastcgi 公共网关接口【进程池】: 使用sudo apt-get install  php5-cgi  php5-fpm  命令安装;
  3. nginx 常用命令
    1.   pkill -9 nginx #杀进程,不建议使用
    2. 获取nginx进程号[使用ps命令查看进程或查看/var/log/nginx/nginx.pid文件]    kill -USR2  cat /var/log/nginx/nginx.pid   详情:http://nginx.org/en/docs/control.html
    3. 在nginx安装目录使用nginx -t 测试配置文件语法是否正确
    4. 在nginx安装目录使用nginx -s reload 加载最新配置文件
    5. 在nginx安装目录使用nginx -s stop 立即停止
    6. 在nginx安装目录使用nginx -s quit 优雅的停止  [会在响应完当前请求后停止]
    7. 在nginx安装目录使用nginx -s reopen  重新打开日志,日志备份后,需要执行此命令,重新打开文件,否则会在备份文件继续执行此操作
  4. 修改nginx 配置 在/etc/nginx/sites-avaitnglable/default文件 :

server {    //默认主机段
listen 80 default_server;         //默认端口为80
listen [::]:80 default_server ipv6only=on; //如果开启了ip6则监听ip6的80端口

root /usr/share/nginx/html;   //网站目录路径
index index.html index.htm;    //默认加载的文件名称
server_name localhost;        //服务器名称

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;  //如果文件不存在
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
}

location ~ \.php$ {  //如果文件是php文件
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000; #cgi监听的端口
fastcgi_param SCRIPT_FILENAME $DOCUMENT_ROOT$fastcgi_script_name;
fastcgi_index index.php;
}

}

4.nginx.conf文件主要是全局配置段

worker_processes 1; #工作进程使用1个 一般与服务器配置相关,cpu数量*核心数

事件

events{

worker_connections  1024;  #单个进程最大的连接数,与网卡配置对应

}

虚拟主机段在 conf.d 中配置,文件必须是*.conf结尾文件

server

{

listen 80;

server_name www.wenjunting.com;

root  /var/www;  #程序目录

index  index.php index.html;  #默认入口文件

 

location / {
if  ( -f  $request_filename )
{
break;   //请求的文件存在直接跳出
}
if  ( !-e  $request_filename )
{
rewrite ^/(.*)$ /index.php/$1 last;  //文件不存在,重写在index.php并把字符串作为请求参数
break;
}
}

location ~\.php$ {

fastcgi_pass 127.0.0.1:9000;  #cgi监听的端口

fastcgi_index index.php

fastcgi_param SCRIPT_FILENAME $DOCUMENT_ROOT$fastcgi_script_name;

include  fastcgi_params;

try_files $uri = 404;

}

}

5. php cgi 设置端口监听

在 /etc/php5/fpm/pool.d/www.conf 文件中查找 listen = /var/run/php5-fpm.sock;

默认为socket监听,修改为端口监听:

listen = 127.0.0.1:9000

6.重启php5-fpm/nginx;

sudo /etc/init.d/php5-fpm restart

sudo /etc/init.d/nginx restart