Q1、编译安装tengine,openresty
1、安装依赖包,下载源码包
[root@centos7 ~]# yum install gcc pcre-devel openssl-devel zlib-devel perl-ExtUtils-Embed git -y
[root@centos7 ~]# cd /usr/local/src/
[root@centos7 src]# wget wget http://tengine.taobao.org/download/tengine-2.1.2.tar.gz
[root@centos7 src]# git clone https://github.com/openresty/echo-nginx-module.git
2、编译安装
[root@centos7 src]# tar xf tengine-2.1.2.tar.gz
[root@centos7 src]# cd tengine-2.1.2/
[root@centos7 tengine-2.1.2]# useradd -s /sbin/nologin -r nginx
[root@centos7 tengine-2.1.2]# ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-http_concat_module --add-module=/usr/local/src/echo-nginx-module
[root@centos7 tengine-2.1.2]# make && make install
3、查看编译后的nginx及加载模块
[root@centos7 tengine-2.1.2]# /apps/nginx/sbin/nginx -V
Tengine version: Tengine/2.1.2 (nginx/1.6.2)
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-http_concat_module --add-module=/usr/local/src/echo-nginx-module
loaded modules:
...
ngx_http_concat_module (static)
...
ngx_http_echo_module (static)
Q2、搭建基于LNMP的WordPress站点
1、准备好源码包
[root@Centos7 ~]# cd /usr/local/src/
[root@Centos7 src]# ls -lh
total 82M
-rw-r--r-- 1 root root 69M Dec 6 2019 mariadb-10.2.25.tar.gz
-rw-r--r-- 1 root root 1009K Apr 28 17:02 nginx-1.16.1.tar.gz
-rw-r--r-- 1 root root 12M Mar 7 22:26 php-7.3.15.tar.xz
2、编译mariadb-10.2.25
[root@Centos7 src]# mkdir /data/mysql
[root@Centos7 src]# useradd -r -s /sbin/nologin -d /data/mysql mysql
[root@Centos7 src]# chown mysql.mysql /data/mysql
#安装依赖
[root@Centos7 src]# yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel libdb-cxx-devel -y
#编译
[root@Centos7 ~]$ tar xf mariadb-10.2.25.tar.gz
[root@Centos7 ~]$ cd mariadb-10.2.25/
[root@Centos7 mariadb-10.2.25]$ cmake . -DCMAKE_INSTALL_PREFIX=/apps/mysql \
-DMYSQL_DATADIR=/data/mysql/ \
-DSYSCONFDIR=/etc/ \
-DMYSQL_USER=mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8_general_ci
[root@Centos7 mariadb-10.2.25]$ make && make install
[root@Centos7 mariadb-10.2.25]$ chown mysql.mysql /apps/mysql
#编译后一些准备工作
[root@Centos7 mariadb-10.2.25]# echo 'PATH=/apps/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
[root@Centos7 mariadb-10.2.25]# . /etc/profile.d/mysql.sh
[root@Centos7 mariadb-10.2.25]# cd /apps/mysql/
[root@Centos7 mysql]# cp support-files/my-huge.cnf /etc/my.cnf
[root@Centos7 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@Centos7 mysql]# vim /etc/my.cnf
[client]
default-character-set=utf8mb4
[mysqld]
character_set_server=utf8mb4
[root@Centos7 mysql]# scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql
3、编译php-fpm
[root@Centos7 src]# yum install libxml2-devel bzip2-devel libmcrypt-devel gcc openssl-devel -y
[root@Centos7 src]# tar xf php-7.3.15.tar.xz
[root@Centos7 src]# cd php-7.3.15/
[root@Centos7 php-7.3.15]# ./configure --prefix=/apps/php \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php.d \
--enable-mbstring \
--enable-xml \
--enable-sockets \
--enable-fpm \
--enable-maintainer-zts \
--disable-fileinfo
[root@Centos7 php-7.3.15]# make && make install
#准备配置文件
[root@Centos7 php-7.3.15]# cp php.ini-production /etc/php.ini
[root@Centos7 php-7.3.15]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@Centos7 php-7.3.15]# chmod +x /etc/init.d/php-fpm
[root@Centos7 php-7.3.15]# cp /apps/php/etc/php-fpm.conf.default /apps/php/etc/php-fpm.conf
[root@Centos7 php-7.3.15]# cp /apps/php/etc/php-fpm.d/www.conf.default /apps/php/etc/php-fpm.d/www.conf
[root@Centos7 php-7.3.15]# vim /apps/php/etc/php-fpm.d/www.conf
user = nginx
group = nginx
listen = /var/run/php7-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
4、编译nginx
[root@Centos7 src]# yum install git gcc pcre-devel openssl-devel zlib-devel perl-ExtUtils-Embed -y
[root@Centos7 src]# tar xf nginx-1.16.1.tar.gz
[root@Centos7 src]# git clone https://github.com/openresty/echo-nginx-module.git
[root@Centos7 src]# cd nginx-1.16.1/
[root@Centos7 nginx-1.16.1]# groupadd -r nginx
[root@Centos7 nginx-1.16.1]# useradd -r -g nginx -s /sbin/nologin nginx
[root@Centos7 nginx-1.16.1]# ./configure \
--prefix=/apps/nginx \
--user=nginx --group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_perl_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--add-module=/usr/local/src/echo-nginx-module
[root@Centos7 nginx-1.16.1]# make && make install
[root@Centos7 nginx-1.16.1]# ln -sv /apps/nginx/sbin/nginx /usr/sbin/
#安装wordpress
1、配置nginx支持fastcgi
[root@Centos7 ~]# cd /apps/nginx/
[root@Centos7 nginx]# vim conf/nginx.conf
http {
...
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
include "/apps/nginx/conf.d/*.conf";
...
}
[root@Centos7 nginx]# mkdir conf.d
[root@Centos7 nginx]# vim conf.d/www.conf
server_tokens off;
server {
listen 80;
server_name www.x.com;
root /data/php;
index index.php index.html;
access_log logs/x.com.access.log;
location ~* \.php$ {
fastcgi_pass unix:/var/run/php7-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
2、创建mysql用户
[root@Centos7 ~]# service mysqld start
[root@Centos7 ~]# mysql -e 'create database wordpress;grant all on wordpress.* to wpuser@"192.168.37.%" identified by "centos";flush privileges;'
3、安装wordpress网站
[root@Centos7 ~]# mkdir /data/php
[root@Centos7 ~]# tar -xf wordpress-5.4.1-zh_CN.tar.gz -C /data/php
[root@Centos7 ~]# cd /data/php/wordpress/
[root@Centos7 wordpress]# cp wp-config-sample.php wp-config.php
[root@Centos7 wordpress]# vim wp-config.php
define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wpuser' );
define( 'DB_PASSWORD', 'centos' );
define( 'DB_HOST', '192.168.37.87' );
[root@Centos7 wordpress]# mkdir wp-content/uploads
[root@Centos7 wordpress]# cp * ../
[root@Centos7 ~]# chown -R nginx.nginx /data/php/
4、服务启动
[root@Centos7 ~]# service php-fpm start
[root@Centos7 ~]# nginx
#客户端测试
http://192.168.37.87/
Q3、详解haproxy的几种算法实现原理,应用场景。
-
静态调度算法
- 静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和相应速度等,且无法实时修改权重,只能重启后生效。
• static-rr:基于权重的轮询调度,不支持权重的运行时调整及后端服务器慢启动,其后端主机数量没有限制
• first:根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置。
- 静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和相应速度等,且无法实时修改权重,只能重启后生效。
-
动态调度算法
- 动态算法:基于后端服务器 状态进行调度适当调整,比如优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。
• roundrobin(默认):基于权重的轮询动态调度算法,支持权重的运行时调整,不等于lvs 的rr,支持慢启动即新加的服务器会逐渐增加转发数,每个后端backend中最多支持4095个server,此为默认调度算法, server 权重设置 weight
• leastconn: 加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度,比较适合长连接的场景使用,比如MySQL等场景。
- 动态算法:基于后端服务器 状态进行调度适当调整,比如优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。
-
source调度算法
-
source:源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session保持/缓存业务等场景。
• consistent:一致性哈希,该hash是动态的,支持在线调整权重,支持慢启动,优点在于当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动。• map-based:取模法,基于服务器权重的hash数组取模,该hash是静态的即不支持在线调整权重,不支持慢启动,其对后端服务器调度均衡,缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因权重发生变化而导致调度结果整体改变, hash(o) mod n 。
-
-
uri调度算法
-
uri:基于对用户请求的uri做hash并将请求转发到后端指定服务器
map-based:取模法
consistent:一致性哈希
uri: uniform resource identifier,统一资源标识符,是一个用于标识某一互联网资源名称的字符串
-
-
url_param调度算法
- 对用户请求的url中的<params>部分中的参数name作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server
假设url = http://www.magedu.com/foo/bar/index.php?k1=v1&k2=v2
则:
host = "www.magedu.com"
url_param = "k1=v1&k2=v2"
- 对用户请求的url中的<params>部分中的参数name作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server
-
hdr算法
- hdr(<name>):针对用户每个http头部(header)请求中的指定信息做hash, 此处由<name>指定的http首部将会被取出并做hash计算, 然后由服务器总权重相除以后派发至某挑出的服务器, 假如无有效的值,则会被轮询调度
-
rdp-cookie算法
- rdp-cookie对远程桌面的负载,使用cookie保持会话,应用于windows远程桌面,很少使用。