[TOC]
# Tengine
## Nginx和Tengine
### Nginx
Nginx ("engine x") 是一个高性能的 **HTTP** 和 **反向代理** 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
•第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名
官方测试nginx能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定
2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,
其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪、网易、腾讯等。
![image-20200103154530929](images/20200103154530929.png)
功能:
- web服务器
- web reverse proxy
- smtp reverse proxy
### Nginx和apache的优缺点
#### nginx相对于apache的优点:
- 轻量级,同样起web 服务,比apache 占用更少的内存及资源
- 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
- 高度模块化的设计,编写模块相对简单
- 社区活跃,各种高性能模块出品迅速
#### apache 相对于nginx 的优点:
- rewrite ,比nginx 的rewrite 强大
- 模块超多,基本想到的都可以找到
- 少bug ,nginx 的bug 相对较多
Nginx 配置简洁, Apache 复杂
最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;
nginx是异步的,多个连接(万级别)可以对应一个进程
## Nginx解决的问题
- 高并发
- 负载均衡
- 高可用
- 虚拟主机
- 伪静态
- 动静分离
## 安装
### 准备工作
#### 操作系统
最好使用linux操作系统,课上使用VirtualBox或VMware虚拟机搭建centos6.x做实验。
系统依赖组件 ``` gcc openssl-devel pcre-devel zlib-devel```
安装:``yum install gcc openssl-devel pcre-devel zlib-devel ``
#### Tengine下载和文档
http://tengine.taobao.org/
#### Nginx官网和文档
http://nginx.org
上传Nginx压缩包到服务器,一般安装在/usr/local目录下
#### 编译安装
找到解压后的tengine根目录下
./configure --prefix=/安装路径
make && make install
#### 启动
找到安装路径的sbin目录,比如/usr/local/tengine/sbin目录下
运行./nginx,即可启动nginx
但是目前这种方式只能这样手动启动,如果关机重启,他不会自动启动,所以最好把他写入service让其自启动
#### 查看所有打开的nginx进程,并杀死进程
查看进程 ps -ef | grep nginx
根据PID杀死进程
kill -9 64861
kill -9 64862
### 启动服务
### 脚本自启动
在文件夹`/etc/init.d/`中新建文件名为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 启动服务(/usr/local/tengine/sbin/nginx) (systemctl start nginx)
service Nginx stop 停止(/usr/local/tengine/sbin/nginx -s stop)
service Nginx status 状态(systemctl status nginx)
service Nginx reload 动态重载配置文件(/usr/local/tengine/sbin/nginx -s reload)
####添加开机自启动
chkconfig --add nginx
chkconfig nginx on
#### 配置文件
默认配置文件位于 /usr/local/tengine/conf/nginx.conf
location的路径匹配
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
请求“/”匹配配置A, 请求“/index.html”匹配配置B, 请求“/documents/document.html”匹配配置C, 请求“/images/1.gif”匹配配置D, 请求“/documents/1.jpg”匹配配置E。
限制访问配置范例
location / {
deny 192.168.1.110;
allow all;
}
这里 192.168.1.110被禁止访问 除了 1.110 其他都可以访问。
访问要求输入账号密码
location ~* \.(avi)$ {
auth_basic "closed site";
auth_basic_user_file users;
}
当请求以 .avi 结尾的uri时候,会要求输入用户名密码,密码存放在conf目录下的users文件中
设置用户名密码 htpasswd -c -d /usr/local/users bruce
在线查看状态
location /basic_status {
stub_status on;
}
打开目录浏览状态
设置了autoinex on则可以将页面变成目录浏览模式,多个location中只有一个能设置root,所以这里用alias替换root
location /xxx {
alias /usr/local/games/Sekiro;
autoindex on;
}
配置代理转发
在/usr/local/tengine/conf/nginx.conf文件中,在http{}中,server{}之前,加入
upstream tomcats {
url_hash;
server 192.168.0.112:9999 weight=1;
server 192.168.0.103:8080 weight=10;
}
server {
location / {
proxy_pass http://tomcats;
}
}
以上配置则是对统一请求tengine服务器的时候,会按权重weight来对应转发到不同的web服务器,也有其他的方式如:
ip_hash(某个第一次ip访问后,一直就会转到第一次的web),
url_hash(通过请求url进行hash,可以请求一次后对应web生成缓存,后续请求相同url则直接走对应web缓存),
least_conn,least_time
共享session操作
在装有tengine的服务器上安装memcached,执行如下命令
yum -y install memcached
memcached -d -m 128 -u root -l 192.168.0.112 -p 11211 -c 256 -P /tmp/memcached.pid
memcached-tool 192.168.0.112:11211
在所有运行tomcat的服务器上的lib文件夹下,导入对应jar包 https://download.csdn.net/download/dante1987/15481678
打开所有服务器上的tomcat的conf文件夹下的context.xml文件,在
memcachedNodes="n1:192.168.0.112:11211"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
然后重启所有tomcat,重启tengine,这时候所有的web服务器通过tengine请求所得到的session都是共享的
如果运行过程中有问题报错检查一下jdk的环境变量是否有正确配置以及对应配置中的IP地址是否填写正确
安装jdk
yum install java-1.8.0-openjdk* -y
在/etc/profile文件底部添加jdk环境变量,默认yum的方式会安装到/usr/lib/jvm目录下
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME CLASSPATH PATH
动静分离操作
将原来的工程中的静态图片、css、js等,剪切出来放到Linux下某个目录(这里用/home/brucewong/www/SpringBootMVCProject/static)
使得原来的工程中没有静态内容,这是为了让静态内容以后都直接通过tengine来访问而不再通过tomcat等服务器,减少web服务器的性能消耗。
在tengine下的nginx.conf文件中添加下面配置
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma|js|css)$ {
root /home/brucewong/www/SpringBootMVCProject/static;
}
如果此时页面不能正常显示,尝试单独访问页面的图片是不是提示403错误,是的话在nginx.conf文件开头配上访问权限即可