欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Nginx

程序员文章站 2022-03-04 12:47:33
...

什么是Nginx?

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
特点是占有内存少,并发能力强,nginx 的并发能力确实在同类型的网页服务器中表现非常好。
大型网站高并发处理 使用Nginx+lvs 。
Tomcat在250人同时访问时开始出现连接丢失问题

Nginx 纵深对比其优缺点

Nginx 和 apache 的优缺点 
	1.nginx 相对于 apache 的优点: 
		轻量级,同样起 web 服务,比 apache 占用更少的内存及资源高并发
		nginx 处理请求是异步非阻塞(如前端 ajax)的,而 apache 则是阻塞型的,在高并发下 nginx 保持低资源低消耗高性能高度模块化的设计,编写模块相对简单,还有,它社区活跃,各种高性能模块出品迅速(十几年时间发展) 
	2.apache 相对于 nginx 的优点:
		Rewrite 重写 ,比 nginx 的 rewrite 强大模块多,基本想到的都可以找到少 bug ,nginx 的 bug 相对较多。(出身好起步高) 
	3.Nginx 配置简洁, Apache 复杂 

安装和部署

1. node01,node02,node03搭建JDK运行环境

复制压缩包到/usr/soft,解压`rpm –ivh jdk-7u67-linux-x64.rpm`,自动配置好

2. node01,node02,node03搭建Tomcat

复制压缩包到/usr/soft,解压`tar -zvxf apache-tomcat-7.0.61.tar.gz`到当前文件夹下
进Tomcat/bin目录  
./startup.sh   开启   
./shutdown.sh  关闭

3. 安装之前准备

3.1 下载依赖 `gcc` `openssl-devel` `cre-devel` `zlib-devel`
	安装:yum install gcc openssl-devel pcre-devel zlib-devel -y
	全:  yum install -y gcc gcc-c++ autoconf automake libtool make openssl openssl-devel pcre pcre-devel 
3.2 创建用户和用户组。为了方便nginx运行而不影响linux安全
	创建组:groupadd -r nginx
	创建用户:useradd -r -g nginx  -M nginx 
	-M 表示不创建用户的家目录。
3.3 上传`tengine-2.1.0.tar`到`/usr/soft`目录下,解压`tar -zxvf tenginx-2.1.0.tar`
3.4进入`tenginx-2.1.0`文件夹执行配置
	./configure 
	或
	./configure --prefix=/usr/local/nginx 
	或
	./configure \
	--prefix=/usr/local/nginx \
	--sbin-path=/usr/local/nginx/sbin/nginx \
	--conf-path=/usr/local/nginx/conf/nginx.conf \
	--pid-path=/usr/local/nginx/logs/nginx.pid \
	--with-http_ssl_module \
	--with-http_stub_status_module \
	--with-http_gzip_static_module
3.5 编译并安装
	make && make install
	默认安装目录:/usr/local/nginx
3.6 配置Nginx为系统服务,以方便管理
	3.6.1、在`/etc/rc.d/init.d/`目录中建立文本文件nginx
	3.6.2、在文件中粘贴下面的内容:
	#!/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/nginx/sbin/nginx"
	prog=$(basename $nginx)
	 
	NGINX_CONF_FILE="/usr/local/nginx/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

	3.6.3、修改nginx文件的执行权限
		chmod +x nginx
	3.6.4、添加该文件到系统服务中去
		chkconfig --add nginx
		系统服务中开启该文件
		chkconfig nginx on
		查看是否添加成功
		chkconfig --list nginx
3.7、启动,停止,重新装载
	service nginx start|stop

Nginx配置

nginx 默认配置详解

#进程数,建议设置和 CPU 个数一样或 2 倍 
worker_processes  2; 
#日志级别 
error_log  logs/error.log  warning;(默认 error 级别) 
# nginx 启动后的 pid 存放位置 
#pid        logs/nginx.pid; 
events {  
# 配置每个进程的连接数,总的连接数= worker_processes * worker_connections     
#默认 1024     
worker_connections  10240; } 
http {     
include mime.types;
default_type application/octet-stream;
sendfile on; 
#连接超时时间,单位秒 
keepalive_timeout  65;
server {         
listen       80;
server_name  localhost                          
#默认请求     
location / {          
	root  html;   #定义服务器的默认网站根目录位置          
	index  index.php index.html index.htm;  #定义首页索引文件的 名称
     }      
#定义错误提示页面         
error_page   500 502 503 504  /50x.html; 
location = /50x.html {             root   html;         } } 

负载均衡机制:

nginx 支持以下负载均衡机制(或方法): 
a) 轮询 - 对应用程序服务器的请求以循环方式分发, 
b) 最少连接数 - 将下一个请求分配给活动连接数最少的服务器 
c) ip-hash - 哈希函数用于确定下一个请求(基于客户端的 IP
地址)应该选择哪个服务器。 

默认负载平衡配置

http {      
	upstream shsxt{          
	server srv1.example.com;          
	server srv2.example.com;          
	server srv3.example.com;
	}  
 
server {          
	listen 80;   
	server_name  localhost;         
		location / {             
			proxy_pass http://shsxt;         
		}     
	}  
} 

加权负载平衡

upstream shsxt {         
	server srv1.example.com weight=3;         
	server srv2.example.com;         
	server srv3.example.com;
} 

最少连接负载平衡

upstream shsxt {         
	least_conn;         
	server srv1.example.com;         
	server srv2.example.com;         
	server srv3.example.com;     
}

会话持久性

upstream shsxt{     
	ip_hash;     
	server srv1.example.com;     
	server srv2.example.com;     
	server srv3.example.com; 
}

解决Session一致性问题

安装memcached,实现session的共享

1.在主节点安装memcached,yum –y install memcached

2.安装telnet和telnet服务,yum -y install telnet telnet-server

3.把需要的jar包拷贝到副节点的tomcat的lib目录下

4.配置副节点tomcat下conf目录下的context.xml,注意修改ip,此处修改为主节点IP 

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
    memcachedNodes="n1:192.168.198.111:11211" 
    sticky="true" 
    lockingMode="auto" 
    sessionBackupAsync="false" 
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" 
    sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
5.修改/webapps/ROOT/index.jsp,显示session的ID
   <%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%> 
   SessionID:<%=session.getId()%> 


6.副节点开启tomcat,主节点开启memcached
	memcached -d -m 128m -p 11211 -l 192.168.198.111 -u root -P /tmp/ 
注:修改tomcat配置文件要及时关闭,打不开的话要清理tomcat缓存

Linux环境下清理Tomcat缓存

1.进入`tomcat/bin`目录下,执行`sh shutdown.sh`命令关闭tomcat。
2.然后执行命令 `ps -aux | grep tomcat` 命令?,查看tomcat命令是否真的关闭
3.如果没有关闭执行 `kill -9 #pid` 来彻底关闭tomcat(#pid是tomcat的进程ID)?
		root    17505    0.0        0.0    63344  768    pts/1    S+  10:22  0:00 grep tomcat?	
		USER    PID    %CPU  %MEM  VSZ  RSS    TTY  STAT  START TIME COMMAND?
4.最后进入`tomcat/work`目录下?,执行` rm -rf Catalina `来删除缓存文件
5.执行`ls ?`确认是否删除,如果work目录下没有Catalina文件夹说明删除成功。
6.在进入`tomcat/bin`目录下,执行`sh startup.sh`命令来重启tomcat。
相关标签: Nginx