代码编织梦想

安装 tengine

打开虚拟机

wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz
tar -zxvf tengine-2.3.2.tar.gz 
cd tengine-2.3.2/


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

提示缺少编译器

checking for OS
 + Linux 3.10.0-1062.el7.x86_64 x86_64
checking for C compiler ... not found

./configure: error: C compiler cc is not found

系统依赖组件

gcc openssl-devel pcre-devel zlib-devel

安装:

yum install gcc openssl-devel pcre-devel zlib-devel -y 

安装完毕再次执行

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

执行make && make install

make && make install

进入tengine目录

cd /usr/local/tengine/sbin

运行nginx

./nginx

访问nginx主机
http://主机名:80

关闭nginx

查看nginx进程

ps -ef|grep nginx

关闭对应的进程

kill -9 10010
kill -9 10086

制作启动服务脚本

vi /etc/init.d/nginx

nginx

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15 
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid
 
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
 
nginx="/usr/local/tengine/sbin/nginx"
prog=$(basename $nginx)
 
NGINX_CONF_FILE="/usr/local/tengine/conf/nginx.conf"
 
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
 
lockfile=/var/lock/subsys/nginx
 
make_dirs() {
   # make required directories
   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}
 
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
 
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
 
restart() {
    configtest || return $?
    stop
    sleep 1
    start
}
 
reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
 
force_reload() {
    restart
}
 
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
 
rh_status() {
    status $prog
}
 
rh_status_q() {
    rh_status >/dev/null 2>&1
}
 
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

修改可执行权限

chmod 777 nginx

启动服务

service Nginx start 启动服务

service Nginx stop 停止

service Nginx status 状态

service Nginx reload 动态重载配置文件

Nginx配置解析

文件位置

/usr/local/tengine/conf/nginx.conf

定义Nginx运行的用户和用户组

user www www;

进程数

建议设置为等于CPU总核心数。

worker_processes 8;

全局错误日志

全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]

error_log /var/log/nginx/error.log info;

进程文件

pid /var/run/nginx.pid;

打开的最多文件描述符

一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。

worker_rlimit_nofile 65535;

event

单个进程最大连接数

并发总数是 worker_processes 和 worker_connections 的乘积

即 max_clients = worker_processes * worker_connections

在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
为什么上面反向代理要除以4,应该说是一个经验值根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000worker_connections 值的设置跟物理内存大小有关

因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数

工作模式与连接数上限
events
{
参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}

可以打开的文件句柄数是多少

–$ cat /proc/sys/fs/file-max

输出:97320

并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内

所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置,使得并发总数小于操作系统可以打开的最大文件数目

– # 其实质也就是根据主机的物理CPU和内存进行配置

当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。

查看系统限制 ulimit -a

打开文件句柄数量限制

是Linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的SOCKET数量,可影响MySQL的并发连接数目)

系统总限制: /proc/sys/fs/file-max 当前使用句柄数:/proc/sys/fs/file-nr

修改句柄数:ulimit -SHn 65535

http

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

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

charset utf-8; #默认编码

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

sendfile

sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。

sendfile()还能够用来在两个文件夹之间移动数据

tcp_nopush 在linux/Unix系统中优化tcp数据传输,仅在sendfile开启时有效

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

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

gzip

gzip on; 开启gzip压缩输出

gzip_min_length 1k; 设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于2k的字节数,小于2k可能会越压越大。

gzip_buffers 4 16k; 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。 如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。

gzip_http_version 1.0;压缩版本(默认1.1,前端如果是squid2.5请使用1.0)

gzip_comp_level 2; 压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间

gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。

默认值: gzip_types text/html (默认不对js/css文件进行压缩)

压缩类型,匹配MIME类型进行压缩

设置哪压缩种文本文件可参考 conf/mime.types

gzip_disable "MSIE [1-6]\.";E6及以下禁止压缩

gzip_vary on;给CDN和代理服务器使用,针对相同url,可以根据头信息返回压缩和非压缩副本

server

listen 80; 监听端口
server_name www.mashibing.com mashibing.com; 域名可以有多个,用空格隔开

charset koi8-r; 编码集

 access_log  logs/host.access.log  main;
日志相关
access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;

index index.html index.htm index.jsp; 默认页
root /data/www/ha97; 主目录

虚拟主机

虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O1DxsIAn-1607763543007)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1562927031929.png)]

通过nginx可以实现虚拟主机的配置,nginx支持三种类型的虚拟主机配置

  • 基于ip的虚拟主机, (一块主机绑定多个ip地址)
  • 基于域名的虚拟主机(servername)
  • 基于端口的虚拟主机(listen如果不写ip端口模式)
http{
	server{
		#表示一个虚拟主机
	}
}

location

映射/虚拟目录

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

location [ = | ~ | ~* | ^~ ] uri { … }

location URI {} 对当前路径及子路径下的所有对象都生效;

location = URI {} 注意URL最好为具体路径。 精确匹配指定的路径,不包括子路径,因此,只对当前资源生效;

location ~ URI {} location ~* URI {} 模式匹配URI,此处的URI可使用正则表达式,区分字符大小写,*不区分字符大小写;

location ^~ URI {} 禁用正则表达式

优先级:= > ^~ > |* > /|/dir/

location配置规则

location 的执行逻辑跟 location 的编辑顺序无关。
矫正:这句话不全对,“普通 location ”的匹配规则是“最大前缀”,因此“普通 location ”的确与 location 编辑顺序无关;

但是“正则 location ”的匹配规则是“顺序匹配,且只要匹配到第一个就停止后面的匹配”;

“普通location ”与“正则 location ”之间的匹配顺序是?先匹配普通 location ,再“考虑”匹配正则 location 。

注意这里的“考虑”是“可能”的意思,也就是说匹配完“普通 location ”后,有的时候需要继续匹配“正则 location ”,有的时候则不需要继续匹配“正则 location ”。两种情况下,不需要继续匹配正则 location :

  • ( 1 )当普通 location 前面指定了“ ^~ ”,特别告诉 Nginx 本条普通 location 一旦匹配上,则不需要继续正则匹配;
  • ( 2 )当普通location 恰好严格匹配上,不是最大前缀匹配,则不再继续匹配正则

IP访问控制

location  {
	   deny  IP /IP段
	   deny  192.168.1.109;
	   allow 192.168.1.0/24;192.168.0.0/16;192.0.0.0/8
	}

用户认证访问

模块ngx_http_auth_basic_module 允许使用“HTTP基本认证”协议验证用户名和密码来限制对资源的访问。

        location ~ (.*)\.avi$ {
                 auth_basic  "closed site";
                 auth_basic_user_file conf/users;
        }

httpd-tools

yum install httpd

htpasswd -c -d /usr/local/users zhangyang

nginx访问状态监控

location /basic_status {
    stub_status on;
}

反向代理

通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务器向Internet上的web服务器发起请求,最终达到客户机上网的目的。

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WP66CWoO-1607763543010)(images/image-20200103154711795.png)]

经典的反向代理结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B9gf6SFf-1607763543016)(images/image-20200103154652173.png)]

Proxy_pass http://192.168.43.152/

301重定向问题

upstream

反向代理配合upstream使用

  upstream httpds {
    server 192.168.43.152:80;
    server 192.168.43.153:80;
}

weight(权重)

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream httpds {
    server 127.0.0.1:8050       weight=10 down;
    server 127.0.0.1:8060       weight=1;
     server 127.0.0.1:8060      weight=1 backup;
}
  • down:表示当前的server暂时不参与负载
  • weight:默认为1.weight越大,负载的权重就越大。
  • backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。
max_conns

可以根据服务的好坏来设置最大连接数,防止挂掉,比如1000,我们可以设置800

upstream httpds {
    server 127.0.0.1:8050    weight=5  max_conns=800;
    server 127.0.0.1:8060    weight=1;
}
max_fails、 fail_timeout

max_fails:失败多少次 认为主机已挂掉则,踢出,公司资源少的话一般设置2~3次,多的话设置1次

max_fails=3 fail_timeout=30s代表在30秒内请求某一应用失败3次,认为该应用宕机,后等待30秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的那一台,时间到后再有请求进来继续尝试连接宕机应用且仅尝试1次,如果还是失败,则继续等待30秒…以此循环,直到恢复。

upstream httpds {
    server 127.0.0.1:8050    weight=1  max_fails=1  fail_timeout=20;
    server 127.0.0.1:8060    weight=1;
}
负载均衡算法

轮询+weight ip_hash url_hash least_conn least_time

健康检查模块

配置一个status的location

location /status {
            check_status;
 
        }

在upstream配置如下

check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;

session共享

Memcached

安装

在Tomcat节点上安装

  • 安装libevent

  • Tomcat的 lib 引入依赖jar包

  • 在这里插入图片描述

  • 安装memcached

可以用yum方式安装


 yum –y install memcached

启动memcached

ip为节点的ip

memcached -d -m 128 -u root -l 192.168.64.178 -p 11211 -c 256 -P /tmp/memcached.pid

验证memcache服务

memcached-tool 192.168.64.178:11211

在这里插入图片描述

参数解释:
-d:后台启动服务
-m:缓存大小
-p:端口
-l:IP
-P:服务器启动后的系统进程ID,存储的文件
-u:服务器启动是以哪个用户名作为管理用户

Nginx配置

upstream tomcat{
        server 192.168.64.178:8080;
        server 192.168.64.179:8080;
      }

        location /tomcat {
        proxy_pass http://tomcat/;
      } 

Tomcat配置

每个tomcat 节点里面的context.xml中加入

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
	memcachedNodes="n1:192.168.64.178:11211" 
    sticky="false" 
    lockingMode="auto"
    sessionBackupAsync="false"
	requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" 
/>

http_proxy 本地磁盘缓存

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
     set $upstream http://ip:port
          location / {
                   proxy_cache my_cache;
                   proxy_pass $upstream;
                }
}

 /path/to/cache #本地路径,用来设置Nginx缓存资源的存放地址
 levels #默认所有缓存文件都放在同一个/path/to/cache下,但是会影响缓存的性能,因此通常会在/path/to/cache下面建立子目录用来分别存放不同的文件。假设levels=1:2,Nginx为将要缓存的资源生成的key为f4cd0fbc769e94925ec5540b6a4136d0,那么key的最后一位0,以及倒数第2-3位6d作为两级的子目录,也就是该资源最终会被缓存到/path/to/cache/0/6d目录中
 key_zone #在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key
 max_size #最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除最少使用的cache文件
 inactive #未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件
 use_temp_path #如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝
 proxy_cache #启用proxy cache,并指定key_zone。另外,如果proxy_cache off表示关闭掉缓存。

开机启动

chkconfig --list
chkconfig --add nginx
chkconfig nginx on

时间问题

service ntpd status

虚拟目录

   location /www {
        alias  /var/data/www1;
        index  index.html index.htm a.html;
    }

自动索引

   location /art {
        alias  /var/data/www1/;
          autoindex on;
   
    }

动静分离

      location / {
		proxy_pass http://192.168.64.177:803;
    
        }

     
     
     location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|html|htm|css|js)$ {
            root  /var/data/www1/;
	       
        }

如果没有make

CentOS 中无法使用make,make install 命令

提示错误:make: command not found

make是gcc的编译器,一定要安装

 1、安装:

yum -y install gcc automake autoconf libtool make

2、安装g++:

yum install gcc gcc-c++

常见错误

  • nginx.conf 配置的时候忘记加分号
  • 缺少空格
  • 用maven打jar包,在虚拟机上出现thymeleaf templates相关错误,可以检查一下controller,return是不是多了 ‘’/ ‘’

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/ZTM2020/article/details/111073557

IO问题成顽疾,鹅厂专家来教你-爱代码爱编程

在日常工作中,有时候会发现 MySQL 的状态不太对劲,这时候就会看看监控指标,可能会发现:写入 QPS 开始出现毛刺,或者 IO 的指标很高。这时候该怎么办呢?本文会从 Linux 层面入手,根据不同的 IO 特点来分析 MySQL 数据库可能遇到的问题,并给出一些可参考的优化/缓解思路。 一、怎么看懂 IO 指标? 检查 IO 的问题会使用iost

Mybatis最拿得出手的功能之一 SpringBoot整合Mybatis-Plus 实战之动态SQL-爱代码爱编程

MyBatis的动态SQL是最令人喜欢的功能 在了解 动态SQL之前,你首先得知道一个表达式 OGNL,这个是基础!   面试常问问题 : Mybatis 中$与#的区别? #是将传入的值当做字符串的形式,select id,name,age from test where id =#{id}, 当把id值传入到后台的时候,就相当于 select

java 类文件结构详解-爱代码爱编程

java 类文件结构详解 简单介绍 Class文件是一组以八个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在文件中,中间没有任何分割符号,所以整个class文件中存储的内容几乎全是程序运行的必要数据,没有空隙存在。 当遇到需要占用八个字节以上空间的数据项时,则会按照 高位在前 (这种顺序被称为Big-Endian,具体顺序是指按高位字节

super与实例方法-爱代码爱编程

我就是喜欢对照题目来讲更好理解 上题目 class Super { public void m1(){ System.out.println("m1() in Super"); } public void m2(){ System.out.println("m2() in Supe

【剑指offer】17. 打印从1到最大的n位数-爱代码爱编程

题目描述 // 力扣 // 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3, // 则打印出 1、2、3 一直到最大的 3 位数 999。 题解 // 直接法(不推荐,毫无意义) // 力扣 // 执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户 // 内存消耗:46.3 MB, 在所有 J

加载流程详解JVM类-爱代码爱编程

前言 加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序交叉混合进行,而解析阶段则不一定,它在某些情况下可能在初始化阶段后在开始,因为java支持运行时绑定。 正文 流程图   装载(Load) 查找和导入class文件 原理 通过一个类的全限定名获取定义此类的二进制字节流(此处有多种方式,不知道

tomcat利用nginux进行负载均衡-爱代码爱编程

1、下载nginx,http://nginx.org/en/download.html 2、解压后双击nginx.exe文件或通过cmd进入解压目录执行nginx.exe启动服务,关闭服务需要通过cmd进入解压目录执行nginx -s stop,启动后访问localhost可以进入欢迎页。 3、复制3个tomcat,分别命名tomcat_1、tomca

Kubernetes-DashBoard安装使用-爱代码爱编程

之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实,为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界面(Dashboard)。用户可以使用Dashboard部署容器化的应用,还可以监控应用的状态,执行故障排查以及管理kubernetes中各种资源。 #下载 wget https://raw.

一文让你深刻理解异步请求池-DNS解析与实现-爱代码爱编程

一、DNS概念简述 DNS:Domain Name Service 域名解析服务,工作在应用层,是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS监听在TCP和UDP端口53。FQDN:全称域名,如 www.example.com www是主机名example.com是域名实现名称到IP解析的有三种

Kubernetes-pod控制器-ReplicaSet(RS)-爱代码爱编程

Deployment(Deploy)企业常常使用 为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。值得一提的是,这种控制器并不直接管理pod,而是通过管理ReplicaSet来间接管理Pod,即: Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment

Kubernetes-pod控制器-DaemonSet(DS)-爱代码爱编程

DaemonSet(DS) DaemonSet类型的控制器可以保证集群中的每一台(或指定)节点上都运行一个副本,一般适用于日志收集、节点监控等场景。也就是说,如果一个pod提供的功能是节点级别的(每个节点都需要且只需要一个),那么这类Pod就适合使用DaemonSet类型的控制器创建。 DameonSet控制器的特点: 每当向集群中添加一个节点时,指

Kubernetes-deployment管理无状态应用-爱代码爱编程

遇到的问题kubectl get deployment -n dev 显示No resources found in default namespace. 可以试一试创建 kubectl create deployment nginx --image=nginx:1.17.1 --namespace dev 因版本原因replicas=3不能用