Load Balancing On Nginx And Docker Env

环境:阿里云 CentOS7, Ngnix 1.16.1,内核>=3.10

查看内核版本:
uname -r
查看系统版本:
cat /etc/redhat-release
安装依赖:
yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源:
yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
搜索是否有docker-ce:
yum list docker-ce –showduplicates | sort -r
安装docker-ce:
yum install docker-ce
打开docker-ce:
systemctl start docker
设置开机自启:
systemctl enable docker
查看docker版本:
docker version
拉取nginx:
docker pull nginx

做两个目录作为docker中2个服务器的根目录:
mkdir -p /www/web1/
mkdir -p /www/web2/
放入2个index.html:
touch /www/web1/index.html
touch /www/web2/index.html
随便往html文件中填入内容,可以分辨即可。

开启docker中2个nginx服务:
docker run -itd -p 8080:80 -v /www/web1:/usr/share/nginx/html –name web1 nginx
docker run -itd -p 8081:80 -v /www/web2:/usr/share/nginx/html –name web2 nginx
可以通过docker ps查看正在运行的容器。

配置宿主机的conf文件:
vim /usr/local/nginx/conf/nginx.conf
在http{}末尾添加(weight=1表示权重,权重越高被访问的次数也就越多):
upstream 47.96.104.4{
server 47.96.104.4:8080 weight=1;
server 47.96.104.4:8081 weight=1;
}
在server中location中添加(http://***,***添加的是upstream后面的那个名字):
proxy_pass http://47.96.104.4
注意将server中的server_name那一行注释去掉并且将server_name后的内容修改为ip地址。
location修改完后将变成:
location / {
          root   html;
            index  index.html index.htm;
    proxy_pass http://47.96.104.4;
}
注意:如果是云服务器,记得开放相应的端口号。

通过浏览器访问: http://47.96.104.4
多次刷新页面将会显示不同的内容,内容根据index.html中所填写的内容显示。

Install Nginx By Compile Sources

环境:阿里云 CentOS7.3

1.安装pcre
安装在/usr/local/下:
cd /usr/local
获取pcre包,注意不要获取pcre2的包,否则编译Nginx将出错:
网址:https://ftp.pcre.org/pub/pcre/
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
解压pcre压缩包:
tar -zxvf pcre-8.43.tar.gz
进入pcre目录:
cd pcre-8.43
对环境进行配置检查:
./configure
编译并安装:
make && make install

2.安装zlib
安装在/usr/local/下:
cd /usr/local
获取zlib:
网址:http://zlib.net/
wget http://zlib.net/zlib-1.2.11.tar.gz
解压zlib包:
tar -zxvf zlib-1.2.11.tar.gz
进入zlib目录:
cd zlib-1.2.11
对环境进行配置检查:
./configure
编译并安装:
make && make install

3.安装openssl
安装在/usr/local/下
cd /usr/local
获取openssl:
网址:https://www.openssl.org/source/
wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz
解压openssl包:
tar -zxvf openssl-1.1.1c.tar.gz
进入openssl目录:
cd openssl-1.1.1c
对环境配置检查:
./config
编译并安装:
make && make install

4.安装nginx:
安装在/usr/local/下:
cd /usr/local
获取nginx:
网址:http://nginx.org/en/download.html
wget http://nginx.org/download/nginx-1.16.1.tar.gz
解压nginx:
tar -zxvf nginx-1.16.1.tar.gz
进入nginx目录:
cd nginx-1.16.1
对环境进行配置检查:
./configure –prefix=/usr/local/nginx –with-pcre=/usr/local/pcre-8.43 –with-zlib=/usr/local/zlib-1.2.11 –with-openssl=/usr/local/openssl-1.1.1c
进行编译安装:
make && make install

开启nginx:
/usr/local/nginx/sbin/nginx
关闭nginx:
/usr/local/nginx/sbin/nginx -s stop
重启nginx:
/usr/local/nginx/sbin/nginx -s restart
通过浏览器浏览,输入ip地址。

PHP:Constant And Data Type

常量及数据类型

php的字符串的定义方式及各自区别

字符串定义方式:单引号、双引号、heredoc和newdoc

单引号

<1> 单引号不能解析变量
<2> 单引号不能解析转义字符,只能解析单引号和反斜杆本身
<3> 变量和变量、变量和字符串、字符串和字符串之间可以用.连接
<4> 效率比双引号高

结果:
My name is {$name}, id is $id, age is $age.\n\t

双引号

<1> 双引号可以解析变量,变量可以使用特殊字符和{}包含
<2> 双引号可以解析所有转义字符
<3> 可以用.连接

结果:
My name is Jhon, id is 1, age is 23.
注意:双引号中包含单引号,单引号中的变量仍然会被解析为变量本身的值,并且单引号仍然以单引号输出.

heredoc和nowdoc

都是用来处理大文本.
注意:heredoc和nowdoc的结束符(EOF等)需要顶格书写.heredoc类似于双引号,newdoc类似于单引号.

heredoc

结果:
My Name is Jhon,
id is 1,
age is 23.

newdoc

结果:
My Name is $name,
id is $id,
age is {$age}. \n

数据类型

三大数据类型:标量、复合、特殊

标量类型

浮点类型:浮点类型不能运用于比较运算中(不能被用于==的比较)

结果:
bool(false)
原因:运算过程中,浮点数会从内存进入到浮点寄存器,浮点数的精度会拓展,计算结果返回内存,导致精度下降,从而使值发生截断.而浮点运算的结果由于下次还要再使用(没有写回内存,一种优化策略),导致数据并不是内存中和内存中的数据进行比较而是内存和浮点寄存器中的数进行比较,由于内存和浮点寄存器的精度不同,所以比较结果是不想等的.

布尔类型:FALSE的7种情况.(0, 0.0, ”, ‘0’, false, array(), NULL)
注意:’ ‘是为true,而”是为false,中间有空格仍然是true.

字符串类型

整型

复合类型

数组类型:超全局数组:$GLOBALS、$_GET、$_POST、$_REQUEST、$_SESSION、$_COOKIE、$_SERVER、$_FILES、$_ENV
注意:$GLOBALS包含所有;$_REQUEST包含$_GET、$_POST、$_COOKIE(尽量不要使用$_REQUEST,因为它可以接受三种请求);
$_SERVER[‘SERVER_ADDR’]:服务器的IP,
$_SERVER[‘SERVER_NAME’]:服务器名称,
$_SERVER[‘REQUEST_TIME’]:请求时间,
$_SERVER[‘QUERY_STRING’]:查询字符串,
$_SERVER[‘HTTP_REFERER’]:引导用户来到当前页的上一页地址,
$_SERVER[‘HTTP_USER_AGENT’]:请求头,
$_SERVER[‘REMOTE_ADDR’]:用户IP,
$_SERVER[‘REQUEST_URI’]:URI指定要访问的页面,
$_SERVER[‘PATH_INFO’]:跟在真实脚本名称并在查询语句之前的路径名称.如:http://www.fixbugs.cn/php/ind.php/hello/demo?name=Lan,那么PATH_INFO将是/hello/demo.

对象类型

特殊类型

NULL:直接赋值为NULL,为定义的变量,unset销毁的变量

常量

定义:通过const、define来定义.const更快,是语言结构,define是函数.define不能用于定义类的常量,const可以.常量不能被修改和删除.

预定义常量:
FILE:文件所在的路径以及文件名称,
DIR:文件所在的目录,
LINE:文件中的当前行号,
FUNCTION:函数名称,
CLASS:类名(由命名空间也会显示命名空间),
TRAIT:Trait的名称,
METHOD:类名称和函数名称(有命名空间也会显示命名空间),
NAMESPACE:命名空间的名称.

例题

1.用php写出显示客户端IP和服务端IP的代码.

2.FILE表示什么意思?

返回文件所在路径以及文件名.

PHP:Variable Reference

php引用变量

引用变量概念:意味着使用不同的变量名访问同一个变量内容。

引用变量定义方式:使用&符号。

引用原理

不使用引用:

结果:int(394448) int(394480) int(431400)

使用引用:

结果:int(394448) int(394504) int(394504)

原因:php的COW(Copy Or Write)机制

通过xdebug_debug_zval()查看

不使用引用代码:

结果:
a: (refcount=1, is_ref=0)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1)
a: (refcount=2, is_ref=0)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1)
a: (refcount=1, is_ref=0)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1)
从refcount看出,变量a改变后,refcount变成1,变量a开辟新的空间,即变量a和变量b指向不同的地址.

使用引用代码:

结果:
a: (refcount=1, is_ref=0)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1)
a: (refcount=2, is_ref=1)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1)
a: (refcount=2, is_ref=1)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1)
从refcount看出,变量a改变后,refcount不变,变量a没有开辟新的空间,即变量a和变量b指向同一个地址.a和b的值仍然相同.

unset

unset:unset只是取消引用没有取消地址空间.

结果:
a: (refcount=0, is_ref=0)=1
a: (refcount=2, is_ref=1)=1
a: (refcount=1, is_ref=1)=1
1
a的值仍然存在.

对象本身就是引用传递

结果:
stu1: (refcount=1, is_ref=0)=class Student { public $id = (refcount=0, is_ref=0)=1 }
stu1: (refcount=2, is_ref=0)=class Student { public $id = (refcount=0, is_ref=0)=1 }
stu1: (refcount=2, is_ref=0)=class Student { public $id = (refcount=0, is_ref=0)=2 }

例题

运行结果:
array(3) {
[0] =>
string(1) “a”
[1] =>
string(1) “b”
[2] =>
string(1) “c”
}
array(3) {
[0] =>
string(1) “b”
[1] =>
string(1) “b”
[2] =>
string(1) “c”
}
array(3) {
[0] =>
string(1) “b”
[1] =>
string(1) “c”
[2] =>
string(1) “c”
}
解析:
第一次循环:
$key = 0; $value = ‘a’; $value引用$data[0] = ‘a’;
结果:[‘a’, ‘b’, ‘c’]
第二次循环:
$key = 1; $value = ‘b’; 由于上一次循环中, $value引用$data[0], 所以$data[0]的值发生改变, 变为’b’, 即$data[0]=’b’, 且$value引用$data[1] = ‘b’;
结果:[‘b’, ‘b’, ‘c’]
第三次循环:
$key = 2; $value = ‘c’; 由于上一次循环中, $value引用$data[1], 所以$data[1]的值发生改变, 变为’c’, 即$data[1]=’c’, 且$value引用$data[2] = ‘c’;
结果:[‘b’, ‘c’, ‘c’]