Linux上安装Nginx

安装nginx相关依赖

  • nginx 1.9版本之前,只支持http协议web服务器的负载均衡,从1.9版本之后,nginx开始支持tcp的长连接负载均衡,但是nginx默认并没有编译tcp负载均衡模块,编写它时,需要加入--with-stream参数来激活这个模块。
  • nginx编译安装需要先安装pcre、openssl、zlib等库,也可以直接编译执行下面的configure命令,根据错误提示信息,安装相应缺少的库。
# c编译器
yum -y install gcc gcc-c++ autoconf automake make
# 解析正则的pcre库
yum install -y pcre pcre-devel
# 添加对gzip的支持
yum install -y zlib zlib-devel
# SSL
yum -y install pcre  pcre-devel zlib  zlib-devel openssl openssl-devel

下载nginx安装包

http://nginx.org/en/download.html

安装nginx

解压 nginx 安装包:
[root@xxxx soft]# tar -zxvf nginx-1.9.9.tar.gz

物理机安装并激活 SSL 和 TCP stream模块:
[root@xxxx nginx-1.9.9]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
 

编译,make命令会向系统路径拷贝文件,需要在root用户下执行:
[root@xxxx nginx-1.9.9]# make

安装:
[root@xxxx nginx-1.9.9]# make install


编译完成后,默认安装在了 /usr/local/nginx 目录。
[root@xxxx nginx-1.9.9]# cd /usr/local/nginx/
[root@xxxx nginx]# ls
conf html logs sbin
可执行文件在sbin目录里面,配置文件在conf目录里面。

配置 nginx 环境变量

为了便于操作,不用每次执行nginx命令都要到/usr/local/nginx/sbin目录下,可以配置下nginx环境变量:

nginx安装目录:/usr/local/nginx

通过 vi /etc/profile 命令修改环境变量,在文件尾部添加以下内容:

export JAVA_HOME=/mnt/soft/jdk1.8.0_351
export JRE_HOME=$JAVA_HOME/jre
export NGINX_PATH=/usr/local/nginx
export PATH=$PATH:$JAVA_HOME/bin:$NGINX_PATH/sbin
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

通过 source /etc/profile 让环境变量生效

在任意目录下执行 nginx -V 验证是否配置成功:

以下命令均需在root用户下执行
nginx -s reload 重新加载配置文件启动
nginx -s stop 停止nginx服务

编辑 nginx.conf 配置文件

worker_processes 4;
worker_rlimit_nofile 655350;

events {
	worker_connections 100000;
}


stream {
    upstream plcserver{
        #least_conn; # 把请求分派给连接数最少的服务器
        server 172.18.0.1:2526;
        server 172.18.0.2:2526;
        #hash $remote_addr consistent;
        #server 127.0.0.1:6000 weight=1 max_fails=3 fail_timeout=30s;
        #server 127.0.0.1:6002 weight=1 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 2526;
        proxy_pass plcserver;
        tcp_nodelay on;
        proxy_connect_timeout 1s;
        #proxy_timeout 3s;
        # 开启代理协议,通过协议发送真实IP
        proxy_protocol on;
    }
}

http {
	include mime.types;
	default_type application/octet-stream;

	#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
	#                  '$status $body_bytes_sent "$http_referer" '
	#                  '"$http_user_agent" "$http_x_forwarded_for"';

	#access_log  logs/access.log  main;

	sendfile on;
	#tcp_nopush     on;

	#keepalive_timeout  0;
	keepalive_timeout 65;

	# 开启gzip压缩
	gzip on;
	# 不压缩临界值,大于1K的才压缩,一般不用改
	gzip_min_length 1k;
	# 压缩缓冲区
	gzip_buffers 16 64K;
	# 压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
	gzip_http_version 1.1;
	# 压缩级别,1-10,数字越大压缩的越好,时间也越长
	gzip_comp_level 5;
	# 进行压缩的文件类型
	gzip_types text/plain
		application/x-javascript
		text/css
		application/xml
		application/javascript;
	# 跟Squid等缓存服务有关,on的话会在Header里增加"Vary: Accept-Encoding"
	gzip_vary on;
	# IE6对Gzip不怎么友好,不给它Gzip了
	gzip_disable "MSIE [1-6]\.";

	upstream elecserver {
		server 172.18.0.2:8802;
	}

	server {
		listen 80;
		#填写证书绑定的域名
		server_name 172.18.0.2;
		#将所有HTTP请求通过rewrite指令重定向到HTTPS
		rewrite ^(.*)$ https://$host$1;
		location / {
			root /mnt/project/frontend/dist;
			try_files $uri $uri/ /index.html;
			index index.html index.htm;
		}
	}

	server {
		listen       443 ssl;
		# server_name 172.18.0.2;

		ssl_certificate      cert/9344252_uniquecharge.cn.pem;
		ssl_certificate_key  cert/9344252_uniquecharge.cn.key;
		
		ssl_session_timeout 5m;
		ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
		ssl_prefer_server_ciphers on;

		location / {
			root /mnt/project/frontend/dist;
			try_files $uri $uri/ /index.html;
			index index.html index.htm;
		}
   
		location /profile {
			 alias /mnt/uploadPath/;
		}

		location /prod-api/ {
			proxy_set_header Host $http_host;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection upgrade;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header REMOTE-HOST $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_pass http://elecserver;

		}
   
		location /vue/ {
			alias /mnt/project/frontend/vue;
		}
   
		location /vue/lbx/ {
			alias /mnt/project/frontend/h5/;
		}

		location /web-api/ {
			proxy_pass http://elecserver;
		}
   
		error_page 500 502 503 504 /50x.html;
		location = /50x.html {
			root html;
		}
   
		# MP_verify_vxs6TlQn9pENraPp.txt
		location = /MP_verify_vxs6TlQn9pENraPp.txt {
			alias /mnt/uploadPath/MP_verify_vxs6TlQn9pENraPp.txt;
		}
	}


	#nginx优化----------------------
	#隐藏版本号
	server_tokens on;

	#优化服务器域名的散列表大小 
	server_names_hash_bucket_size 64;
	server_names_hash_max_size 2048;

	#开启高效文件传输模式
	#sendfile on;
	#减少网络报文段数量
	#tcp_nopush on;
	#提高I/O性能
	tcp_nodelay on;

	#连接超时 时间定义 默认秒 默认65秒
	#keepalive_timeout 60;

	#读取客户端请求头数据的超时时间 默认秒 默认60秒
	client_header_timeout 15;

	#读取客户端请求主体的超时时间 默认秒 默认60秒
	client_body_timeout 15;

	#响应客户端的超时时间 默认秒 默认60秒
	send_timeout 25;

	#上传文件的大小限制  默认1m
	client_max_body_size 8m;
}

参数解释如下:

  • listen 2526;这个是nginx会监听的一个端口号,也就是说,所有的客户端连接指定的2526端口就可以,客户端发的请求如果都在2526端口上,nginx感应到,你要我完成反向代理的操作,也就是负载均衡的操作,nginx就按照既定的负载均衡算法把这些请求分发到不同的服务器上。
  • proxy pass plcserver; 相当于一个标记。所有连接到2526端口的请求都连接到这个plcserver的信息里面负载均衡。
  • plcserver的这个upstream就是负载均衡模块,包含了几台机器呢?包含了2台:172.18.0.162:2526,172.18.0.163:2526,相当于起了2台服务器。如果要添加新的服务器,我们只需要在下面新增这台服务器的信息就可以了。weight=1,就是权重,这2个服务器的权重都是1,就是说按照轮询算法,轮着往配置的服务器发,转着圈发送,配置强的服务器,我们可以给它配置的权重大一些。
  • max_fails是在完成心跳机制,连续超过3次心跳失败,就认为服务器挂掉,fail_timeout,等心跳30秒。
  • proxy_timeout 3s;是指nginx只和后端的 chatserver 连接3秒就断开,我们不加这个了。
  • proxy_connect_timeout 的意思是nginx得连接后台的server服务器,第一次连接的时候发现超过1秒的时间还没有握手成功就判定连接失败了
  • tcp_nodelay on 就是配置TCP的参数
  • hash remote addr 是基于一致性哈希的负载算法,可注销掉,默认使用轮询算法。

配置完成后,nginx -s reload平滑重启。

Nginx Stream(TCP/UDP)负载均衡

Nginx 的 TCP/UDP 负载均衡是应用 Stream 代理模块(ngx_stream_proxy_module)和 Stream 上游模块(ngx_stream_upstream_module)实现的。Nginx 的 TCP 负载均衡与 LVS 都是四层负载均衡的应用,所不同的是,LVS 是被置于 Linux 内核中的,而 Nginx 是运行于用户层的,基于 Nginx 的 TCP 负载可以实现更灵活的用户访问管理和控制。

1、TCP/UDP 负载均衡

Nginx 的 Stream 上游模块支持与 Nginx HTTP 上游模块一致的轮询(Round Robin)、哈希(Hash)及最少连接数(least_conn)负载均衡策略。Nginx 默认使用轮询负载均衡策略,配置样例如下:

stream {
    upstream backend {
        server 192.168.2.145:389 weight=5;
        server 192.168.2.159:389 weight=1;
        server 192.168.2.109:389 weight=1;
    }

    server {
        listen 389;
        proxy_pass backend;
    }
}

哈希负载均衡策略可以通过客户端 IP($remote_addr)实现简单的会话保持,其可将同一 IP 客户端始终转发给同一台后端服务器。

stream {
    upstream backend {
        hash $remote_addr;
        server 192.168.2.145:389 weight=5;
        server 192.168.2.159:389 weight=1;
        server 192.168.2.109:389 weight=1;
    }

    server {
        listen 389;
        proxy_pass backend;
    }
}

哈希负载均衡策略通过指令参数 consistent 设定是否开启一致性哈希负载均衡策略。Nginx 的一致性哈希负载均衡策略是采用 Ketama 一致性哈希算法,当后端服务器组中的服务器数量变化时,只会影响少部分客户端的请求。配置样例如下:

stream {
    upstream backend {
        hash $remote_addr consistent;
        server 192.168.2.145:389 weight=5;
        server 192.168.2.159:389 weight=1;
        server 192.168.2.109:389 weight=1;
    }

    server {
        listen 389;
        proxy_pass backend;
    }
}

最少连接负载均衡策略,可以在后端被代理服务器性能不均时,在考虑上游服务器组中各服务器权重的前提下,将客户端连接分配给活跃连接最少的被代理服务器,从而有效提高处理性能高的被代理服务器的使用率。配置样例如下:

stream {
    upstream backend {
        least_conn;
        server 192.168.2.145:389 weight=5;
        server 192.168.2.159:389 weight=1;
        server 192.168.2.109:389 weight=1;
    }

    server {
        listen 389;
        proxy_pass backend;
    }
}

2、TCP/UDP 负载均衡的容错机制

Nginx 的 TCP/UDP 负载均衡在连接分配时也支持被动健康检测模式,如果与后端服务器建立连接失败,并在 fail_timeout 参数的时间内连续超过 max_fails 参数设置的次数,Nginx 就会将该服务器置为不可用状态,并且在 fail_timeout 参数的时间内不再给该服务器分配连接。当 fail_timeout 参数的时间结束时将尝试分配连接检测该服务器是否恢复,如果可以建立连接,则判定为恢复。配置样例如下:

stream {
    upstream backend {
        # 10s内出现3次错误,该服务器将被熔断10s
        server 192.168.2.154:8080 max_fails=3 fail_timeout=10s;
        server 192.168.2.109:8080 max_fails=3 fail_timeout=10s;
        server 192.168.2.108:8080 max_fails=3 fail_timeout=10s;
        server 192.168.2.107:8080 max_fails=3 fail_timeout=10s;
    }

    server {
        proxy_connect_timeout 5s;           # 与被代理服务器建立连接的超时时间为5s
        proxy_timeout 10s;          # 获取被代理服务器的响应最大超时时间为10s

        # 当被代理的服务器返回错误或超时时,将未返回响应的客户端连接请求传递给upstream中的下
        # 一个服务器
        proxy_next_upstream on;
        proxy_next_upstream_tries 3;        # 转发尝试请求最多3次
        proxy_next_upstream_timeout 10s;    # 总尝试超时时间为10s
        proxy_socket_keepalive on;  # 开启SO_KEEPALIVE选项进行心跳检测
        proxy_pass backend;
    }
}

其中的参数及指令说明如下。

  • 指令值参数 max_fails 是指 10s 内 Nginx 分配给当前服务器的连接失败次数累加值,每 10s 会重置为 0;
  • 指令值参数 fail_timeout 既是失败计数的最大时间,又是服务器被置为失败状态的熔断时间,超过这个时间将再次被分配连接;
  • 指令 proxy_connect_timeout 或 proxy_timeout 为超时状态时,都会触发 proxy_next_upstream 机制;
  • proxy_next_upstream 是 Nginx 下提高连接成功率的机制,当被代理服务器返回错误或超时时,将尝试转发给下一个可用的被代理服务器;
  • 指令 proxy_next_upstream_tries 的指令值次数包括第一次转发请求的次数。


TCP 连接在接收到关闭连接通知前将一直保持连接,当 Nginx 与被代理服务器的两个连续成功的读或写操作的最大间隔时间超过 proxy_timeout 指令配置的时间时,连接将会被关闭。在 TCP 长连接的场景中,应适当调整 proxy_timeout 的设置,同时关注系统内核 SO_KEEPALIVE 选项的配置,可以防止过早地断开连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
window 版本 nginx 最新版本 一般结合Tomcat 使用 配置信息如下: #运行用户 user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; #工作模式及连接数上限 events { use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能 worker_connections 1024;#单个后台worker process进程的最大并发链接数 # multi_accept on; } #设定http服务器,利用它的反向代理功能提供负载均衡支持 http { #设定mime类型,类型由mime.type文件定义 include /etc/nginx/mime.types; default_type application/octet-stream; #设定日志格式 access_log /var/log/nginx/access.log; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用, #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime. sendfile on; #tcp_nopush on; #连接超时时间 #keepalive_timeout 0; keepalive_timeout 65; tcp_nodelay on; #开启gzip压缩 gzip on; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; #设定请求缓冲 client_header_buffer_size 1k; large_client_header_buffers 4 4k; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; #设定负载均衡的服务器列表 upstream mysvr { #weigth参数表示权值,权值越高被分配到的几率越大 #本机上的Squid开启3128端口 server 192.168.8.1:3128 weight=5; server 192.168.8.2:80 weight=1; server 192.168.8.3:80 weight=6; } server { #侦听80端口 listen 80; #定义使用www.xx.com访问 server_name www.xx.com; #设定本虚拟主机的访问日志 access_log logs/www.xx.com.access.log main; #默认请求 location / { root /root; #定义服务器的默认网站根目录位置 index index.php index.html index.htm; #定义首页索引文件的名称 fastcgi_pass www.xx.com; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; include /etc/nginx/fastcgi_params; } # 定义错误提示页面 error_page 500 502 503 504 /50x.html; location = /50x.html { root /root; } #静态文件,nginx自己处理 location ~ ^/(images|javascript|js|css|flash|media|static)/ { root /var/www/virtual/htdocs; #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。 expires 30d; } #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置. location ~ \.php$ { root /root; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name; include fastcgi_params; } #设定查看Nginx状态的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file conf/htpasswd; } #禁止访问 .htxxx 文件 location ~ /\.ht { deny all; } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值