ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Nginx分布式框架

2021-09-21 20:58:46  阅读:145  来源: 互联网

标签:http 框架 nginx -- server Nginx html proxy 分布式


nginx

是一个高性能的HTTP和反向代理web服务器。

提供的服务:

  • 动静分离(web 服务)
  • 负载均衡 (反向代理)
  • web 缓存
  • 内存少,并发能力强(支持50,000 个并发)

安装

下载地址:http://nginx.org/en/download.html

  1. 下载完上传Linux服务器上,一般安装在/usr/local下,进行解压

    tar -zxvf nginx-1.18.0.tar.gz
    
  2. 进行配置,在nginx根目录下执行

    # 1.安装编译工具文件库
    yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
    
    # 2.使用默认配置
    ./configur
    
    # 3.然后回车,进行编译
    make
    
    # 4.然后回车,安装
    make install
    
    # 注意:如果自定义安装
    # 1. 创建nginx临时目录
    mkdir -p /var/temp/nginx
    
    # 2. 进入nginx安装目录,指定配置文件
    ./configure \ --prefix=/usr/local/nginx/nginx \
    --pid-path=/var/run/nginx/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http-gzip-static_module \
    --http-client-body-temp-path=/var/temp/nginx/client \
    --http-proxy-temp-path=/var/temp/nginx/proxy \
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
    --http-scgi-temp-path=/var/temp/nginx/scgi \
    --with-http-stub-status_module \
    --with-http_ssl_module 
    # --with-http_ssl_module 是配置支持https
    
    # 3.编译、安装
    make
    make install
    
  3. 查找安装路径:

    whereis nginx
    # 默认在/usr/local/nginx
    

    启动Nginx,默认是80端口,在浏览器输入服务器IP地址,就能访问Nginx默认页面,说明安装成功。

卸载Nginx:

# 关闭nginx进程
./nginx -s stop
rm -rf /user/local/nginx
make clean

常用命令

启动/停止/退出nginx:

# 启动
cd /usr/local/nginx/sbin/
./nginx
start nginx

# 停止
./nginx -s stop

# 安全退出,优雅退出
./nginx -s quit

# 重新加载配置文件
./nginx -s reload

# 查看配置文件是否错误
./nginx -t

# 查看nginx进程
ps aux|grep nginx

设置nginx开机启动:

vim /etc/rc.local
然后在底部增加
/usr/local/nginx/sbin/nginx

其他命令:

# 开启防火墙
service firewalld start
# 关闭防火墙
service firewalld stop
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp

核心配置文件结构

配置文件默认是放在/usr/local/nginx/conf/nginx.conf,配置文件中默认有三大块:全局块、events块、http块。

worker_processes  1;

events {
    worker_connections  1024;
}

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.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

全局块

user指令:

用于配置运行Nginx服务器的worker进程的用户和用户组。我们最开始创建Nginx时,执行./configure --user=user --group=group,在配置文件添加

user 用户名;

然后再Linux命令行,创建一个用户

useradd 用户名
user 用户名
# 然后该用户有/home/用户名/`目录下访问权限,其他目录没有权限

work process指令

nginx是进程模型,分为主进程、工作进程。

master_process:用来指定是否开启工作进程。

worker_processes:配置Nginx生成工作进程的数量,一般与CPU的内核数-1数保存一致。

# 设置工作进程
worker_processes  2;

events块

accept_mutex指令:

配置:accept_mutex on|off ;用来设置Nginx网络连接序列化。

worker_connections指令:

默认是 worker_commections 512;用来配置单个worker进程最大的连接数;

(单个worker进程最大的连接数 * N个worker线程),这个值不能大于操作系统支持打开的最大文件句柄数量。(Linux一般是65535)

# 修改操作系统支持打开的最大文件句柄数量,临时修改
ulimit -HSn 2048
# 永久修改
vi /etc/security/limits.conf

http块

include指令:

包含和导入外部文件,进行模块化的划分。

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

sendfile指令:

启用文件的高效传输,打开有利于文件传输的性能。

sendfile   on;  # 启用高效传输,与tcp_nopush联合使用
tcp_nopush on;  # 当请求累积一定大小的时候,在进行发送

keepalive_requests指令:

用来设置一个keep-alive连接使用的次数,客户端连接服务的超时时间。

gzip指令:

开启它有利于文件和请求数据的传输。

gzip on

server块:

listen指令:

用来配置监听端口。

server_name指令:

用来设置虚拟主机服务名称。

server {
	listen 80;
	server_name www.xx1.cn www.xx2.cn;
	# 可以配置多个,也可以通配符进行配置 *.itcast.cn www.itcast.* 注意*只能在首尾部分
}

location指令:

用来设置请求的URI。

server {
	...
	server_name xxx.cn
	# 可以在location后面加=(精确匹配)~(支持正则)~*(支持正则,支持大写)
	location /abc{
		default_type text/plain;
		return 200 "access success";
	}
}

error_page指令:

设置网站的错误页面。

server {
	error_page 404 http://www.404.cn;
}
或者
server{
	error_page 404 /50x.html;
	error_page 500 502 503 504 /50x.html;
	location =/50x.html{
		root html;
	}
}

gzip_static指令:

解决Gzip和sendfile共存问题,需要添加ngx_http_gzip_static_module模块,才能使用gzip_static指令。

# 1.查询当前Nginx的配置参数
nginx -V
# 2.清楚编译内容
cd /root/nginx/core/nginx-xxx
make clean
# 3.使用configure来配置参数
./configure (...之前的内容) --with-http_gzip_static_module
# 4.进行编译
make
# 5.将objs目录下的nginx二进制执行文件移动到nginx安装目录下的sbin下
mv objs/nginx /usr/local/nginx/sbin
# 6.执行更新命令
make upgrade
# 7.在配置文件http块下添加
gzip_static on

proxy块:

反向代理模块

proxy_pass指令:

令用来设置被代理服务器地址。

proxy_set_header指令:

该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后 将新的请求头发送给代理的服务器。

server {
	listen 8080;
	server_name localhost;
	# 设置DNS的IP,用来解析proxy_pass域名
	resolver 8.8.8.8;
	location /server {
		proxy_pass http://192.168.xx.xx:8080/;
		proxy_set_header username TOM;
	}
}

配置文件案例:

基本部署:

# 全局块
# 配置允许运行Nginx工作进程的用户和用户组
user www;
# 一般是CPU核数-1
worker_processes 2; 

# 配置Nginx服务器运行对错误日志存放的路径
error_log logs/error.log;
pid logs/nginx.pid;

# 全局块
events{
	accept_mutex on;
	multi_accept on;
	# 设置Nginx的worker进程最大的连接数
	worker_connections 1024;
}
# http块
http{
	include mime.types;
	default_type application/octet-stream;
	# 配置允许使用sendfile方式运输,开启高效的文件传输
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	# 配置连接超时时间
	keepalive_timeout 65;
	
	# Gzip压缩功能配置
	include /home/www/gzip/nginx_gzip.conf;
	# 配置请求处理日志格式
	log_format server1 '===>server1 access log';
	# log_format server2 '===>server2 access log';
	
	# server块 开始 #
	include /home/www/conf.d/*.conf;
	# server块 结束 #

}

server1的配置文件

server{
	listen 8081;
	# 设置虚拟主机服务名称,可以用域名,多个空格隔开,也可以通配符"*“例子:*.good.cn
	server_name localhost;
	# 配置请求处理日志存放路径
	access_log /home/www/myweb/server1/logs/access.log server1;
	
	location /server1/location1{
		root /home/www/myweb;
		index server1.html;
	}
	location /server1/location2{
		root /home/www/myweb;
		index server2.html;
	}
	# 配置错误页面转向
	location = /404.html {
		root /home/www/myweb;
		index 404.html;
	}
}

nginx_gzip.conf的配置文件

# 开启gzip功能
gzip on;
# 压缩源文件类型,例 application/javascript application/html;在mine.types里查看。
gzip_types *; 
# 压缩级别 1-9
gzip_comp_level 6; 
# 进行压缩响应页面的最小长度,小于这个数不进行压缩
gzip_min_length 1024k;
# 缓存空间大小,使用默认就好
gzip_buffers 4 16K; 
# 指定压缩响应所需要的最低HTTP请求版,使用默认就好
gzip_http_version 1.1;
# 往头信息中添加压缩标识,默认是off
gzip_vary on;
# 对IE6以下的版本都不进行压缩
gzip_disable "MSIE [1-6]\.";

解决跨域问题:

用add_header指令,该指令可以用来添加一些头信息

location /xxx{
	add_header ‘Access-Control-Allow-Origin’ *;
	add_header ‘Access-Control-Allow-Credentials’ 'true';
	add_header ‘Access-Control-Allow-Methods’ GET,POST,PUT,DELETE;
	add_header ‘Access-Control-Allow-Headers’ *;
	root /home/www/myweb;
	index server1.html;
}

解决静态资源防盗链:

用valid_referers指令,如果在添加上域名或者IP地址,如果该值为1就返回403

location /xxx {
	valid_referers none blocked www.baidu.* 127.0.0.1;
	if ($invalid_referer){
		# 返回403
		return 403
		# 如果让该图片显示其他默认图片
		rewrite ^/ /images/图片名.png break;
	}
	root /usr/local/nginx/html;
}

# 如果不算这个域名,会重定向403
valid_referers *.goodysr.cn
if($invalid_referer){
	return 403
}

Rewrite域名跳转:

访问xxx1、xxx2域名 会跳转到zong的域名下。

server {
	listen 80;
	server_name www.xxx1.com www.xxx2.cn;
	rewrite ^(.*) http://www.zong.cn$1;
	# 也可以某个路径下进行跳转
	location /user {
		rewrite ^/user(.*)$ http://www.user.cn$1;
	}
}

配置SSL:

步驟1:生成证书

1.使用阿里云等平台购买: 或者使用openssl

购买证书,然后创建证书,进行绑定域名,然后审核通过,下载证书。

在服务器上某文件下(nginx/conf下),创建cert目录,存放所下载的证书文件。

server {
	listen 80;
	server_name 域名;
	# 将http请求重定向https上
	rewrite ^(.*)$ https://$host$1;
	location / {
		root html;
		index index.html index.htm;
	}
}
server {
	listen 443 ssl;
	server_name 域名;
	root html;
	index index.html index.htm;
	# 证书文件
	ssl_certificate cert/xxx.pem;
	ssl_certificate_key cert/xxx.key;
	ssl_session_cache shared:SSL:1m;
	ssl_session_timeout 5m;
	# 加密规则
	ssl_ciphers HIGH:!aNULL:!MD5;
	# 表示使用TLS协议类型
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2
	ssl_prefer_server_ciphers on;
	location / {
		root html;
		index index.html index.htm;
	}
}

配置负载均衡

负载均衡状态 :

  • down 不参与负载均衡
  • backup 备份服务器,不执行,当主服务挂的时候才执行
  • max_fails 允许请求失败的次数,max_fails =3
  • fail_timeout 经过max_fails失败后,服务暂停时间,fail_timeout=15
  • max_conns 限制最大的接收连接数,当这台机器最大并发是100,也就是值为100

负载均衡策略:

  • 轮询 默认方式

  • weight 权重方式

  • ip_hash 根据ip分配方式 ,这样可以解决session不共享问题

    upstream backend{
    	ip_hash;
    	server 127.0.0.1:9091;
    	server 127.0.0.1:9092;
    }
    
  • least_conn 根据最少连接方式 ,适合请求处理时间长短不一造成服务器过载。

  • url_hash 根据URL分配方式 ,hash &request_uri;

  • fair 根据响应时间方式

# 负载均衡配置
upstream backend {
	server 127.0.0.1:9091 down;
	server 127.0.0.1:9092 max_conns=100 weight=1;
	server 127.0.0.1:9093 weight=2;
}
upstream backend2{
	hash &request_uri;
	server 127.0.0.1:9091;
	server 127.0.0.1:9091;
}
server {
    listen       80;
    server_name  localhost;
    location / {
        #root   html;
        #index  index.html index.htm;
		proxy_pass http://backend;
    }	
    location /backend2/ {
		proxy_pass http://backend2;
	}
}

配置缓存:

http{
	# 设置缓存根目录 levels缓存规则 keys_zone缓存名,缓存大小,1m=8000连接地址
 	# inactive缓存多久会被情况 max_size缓存空间最大空间
	proxy_cache_path /usr/local/cache levels=2:1 keys_zone=缓存名:200m inactive=1d max_size=20g;
	
	upstream backend{
		server 192.168.200.146:8080;
	}
	server {
		listen 8080;
		server_name localhost;
		location / {
			# 设置不缓存 如果是js文件不进行缓存
			if ($request_uri ~ /.*\.js$){
				set $nocache 1;
			}
			proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment;
			proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment;
			proxy_cache 缓存名;
			proxy_cache_key $scheme$proxy_host$request_uri;
			# 当请求为5次才进行缓存
			proxy_cache_min_uses 5;
			# 当缓存状态码是200 ,缓存时长5天
			proxy_cache_valid 200 5d;
			# 当缓存状态码是404,缓存时长30s
			proxy_cache_valid 404 30s;
			proxy_cache_valid any 1m;
			add_header nginx-cache"$upstream_cache_status";
			proxy_pass http://backend;
		}
	}
}

删除对应的缓存目录:

rm -rf /usr/local/proxy_cache/......

动静分离:

upstream webservice{
	# tomcat地址
	server 192.168.10.xxx:8080;
}
server {
	listen 80;	
	server_name localhost;
	# 动态资源
	location /demo {
		proxy_pass http://webservice;
	}
	# 静态资源
	location ~/.*\.(png|jpg|gif|js){
		root html/web; # 静态文件地址
		gzip on;
	}
	location / {
		root html/web;
		index index.html index.htm;
	}
}

搭建高可用Nginx集群:

准备两台Nginx机器,需要在这两台机器安装Keepalived,通过 VRRP 协议实现高可 用功能。

安装Keepalived

步骤1:从官方网站下载keepalived,官网地址 https://keepalived.org/
步骤2:将下载的资源上传到服务器 
keepalived-2.0.20.tar.gz
步骤3:创建keepalived目录
mkdir keepalived
步骤4:将压缩文件进行解压缩,解压缩到指定的目录
tar -zxf keepalived-2.0.20.tar.gz -C keepalived/
步骤5:对keepalived进行配置,编译和安装
cd keepalived/keepalived-2.0.20
./configure --sysconf=/etc --prefix=/usr/local
make && make install

配置文件

一般在 /etc/keepalived/keepalived.conf ,我们进行配置

global_defs {
	# 当keepalived发送切换时需要发email给具体的邮箱地址
	notification_email {
		xx1@xx1.com
		xx2@xx2.com
	}
	# 设置发件人的邮箱信息
	notification_email_from yy@xx3.com
	# 指定smpt邮箱服务地址
	smtp_server 192.168.200.1
	smtp_connect_timeout 30
	# 服务器的一个标识 A机器
	router_id keepalivedA
	vrrp_skip_check_adv_addr
	vrrp_strict
	vrrp_garp_interval 0
	vrrp_gna_interval 0
}
vrrp_instance VI_1 {
	# 两个值可选 MASTER主机 BACKUP从机
	state MASTER
	# 非抢占,这个参数只能用于state为backup
	# 所以我们把state都设置成backup 让其通过priority来竞争,实现主机和从机
	nopreempt
	interface ens33
	virtual_router_id 51
	# 优先级高的将成为主机
	priority 100
	advert_int 1
	authentication {
		# 认证方式
		auth_type PASS
		# 指定认证使用的密码,最多8位
		auth_pass 1111
	}
	virtual_ipaddress {
		# 虚拟IP地址设置虚拟IP地址
		192.168.200.222
	}
}

启用keepalived

cd /usr/local/sbin
./keepalived

编写脚本实现自动切换

  1. 在keepalived配置文件中添加对应的配置像

    gloval_defs{
    	....
    }
    
    # ck_n为脚本名称
    vrrp_script ck_n{
    	script "脚本位置"
    	interval 3 #执行时间间隔
    	weight -20 #动态调整vrrp_instance的优先级
    }
    
    vrrp_instance VI_1 {
    	...
    	virtual_ipaddress {
    		192.168.200.111
    	}
    	# 使用Shell脚本
    	track_script {
    		ck_n
    	}
    }
    
  2. 编写脚本

    内容:监听nginx运行状态,如果nginx启动失败,尝试再次启动,如果启动失败,关掉keepalived进程。

    #!/bin/bash
    num=`ps -C nginx --no-header | wc -l`
     if [ $num -eq 0 ];then
     /usr/local/nginx/sbin/nginx
     sleep 2
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
     killall keepalived
    fi
    fi
    
  3. 为脚本文件设置权限

    chmod 755 ck_nginx.sh
    

常见问题

启动失败找不到pid文件

解决:

mkdir -p /var/run/nginx/
# 指定配置文件进行重启
nginx -C /usr/local/nginx/conf/nginx.conf
# 重启
nginx -s reload

配置环境变量:

vim /etc/profile
# 在文件末尾加上
export NGINX_HOME=/usr/local/nginx
export PATH=$NGINX_HOME/sbin:$PATH

设置开机自动启动:

vim /lib/systemd/system/nginx.service
# 在文件添加
[Unit]
#描述服务
Description=nginx
#描述服务类别
After=network.target
 
#服务运行参数的设置,注意【Service】的启动、重启、停止命令都要用绝对路径
[Service]
#后台运行的形式
Type=forking
#服务具体运行的命令
ExecStart=/usr/local/nginx/sbin/nginx
#重启命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload
#停止命令
ExecStop=/usr/local/nginx/sbin/nginx -s quit
#表示给服务分配独立的临时空间
PrivateTmp=true
 
#运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
[Install]
WantedBy=multi-user.target

# 然后 修改文件权限
chmod 755 /usr/lib/systemd/system/nginx.service
# 设置开机自启动
systemctl enable nginx.service

标签:http,框架,nginx,--,server,Nginx,html,proxy,分布式
来源: https://blog.csdn.net/yanshengren520/article/details/120405247

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有