Nginx分布式框架
2021/9/22 7:10:12
本文主要是介绍Nginx分布式框架,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
nginx
是一个高性能的HTTP和反向代理web服务器。
提供的服务:
- 动静分离(web 服务)
- 负载均衡 (反向代理)
- web 缓存
- 内存少,并发能力强(支持50,000 个并发)
安装
下载地址:http://nginx.org/en/download.html
-
下载完上传Linux服务器上,一般安装在/usr/local下,进行解压
tar -zxvf nginx-1.18.0.tar.gz
-
进行配置,在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
-
查找安装路径:
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
编写脚本实现自动切换
-
在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 } }
-
编写脚本
内容:监听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
-
为脚本文件设置权限
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
这篇关于Nginx分布式框架的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-13用Nginx防范DDoS攻击的那些事儿
- 2024-12-13用Terraform在AWS上搭建简单NGINX服务器指南
- 2024-10-29Nginx发布学习:从入门到实践的简单教程
- 2024-10-28Nginx发布:新手入门教程
- 2024-10-21nginx 怎么设置文件上传最大20M限制-icode9专业技术文章分享
- 2024-10-17关闭 nginx的命令是什么?-icode9专业技术文章分享
- 2024-09-17Nginx实用篇:实现负载均衡、限流与动静分离
- 2024-08-21宝塔nginx新增8022端口方法步骤-icode9专业技术文章分享
- 2024-08-21nginx配置,让ws升级为wss访问的方法步骤-icode9专业技术文章分享
- 2024-08-15nginx ws代理配置方法步骤-icode9专业技术文章分享