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 \
    --conf-path=/usr/local/nginx/nginx.conf  \
    --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
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf# 停止
./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.cnserver_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){# 返回403return 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.2ssl_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,缓存时长30sproxy_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.comxx2@xx2.com}# 设置发件人的邮箱信息notification_email_from yy@xx3.com# 指定smpt邮箱服务地址smtp_server 192.168.200.1smtp_connect_timeout 30# 服务器的一个标识 A机器router_id keepalivedAvrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}
vrrp_instance VI_1 {# 两个值可选 MASTER主机 BACKUP从机state MASTER# 非抢占,这个参数只能用于state为backup# 所以我们把state都设置成backup 让其通过priority来竞争,实现主机和从机nopreemptinterface ens33virtual_router_id 51# 优先级高的将成为主机priority 100advert_int 1authentication {# 认证方式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/nginxsleep 2
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; thenkillall 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

Nginx分布式框架相关推荐

  1. 我的面试标准:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架!...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:hsm_computer www.cnblogs.com/J ...

  2. J2ee分布式框架--技术介绍文档

    1.      项目核心代码结构截图 jeesz-utils jeesz-config jeesz-framework jeesz-core-cms jeesz-core-gen jeesz-core ...

  3. JEESZ分布式框架之技术介绍文档

    摘要: Jeesz主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件.代码生成等.采 ...

  4. java后端分布式框架路线图

    基于Spring全家桶的java后端分布式框架 框架图 框架图 最近开始在公司实习(摸鱼ing),自己理了一下后端分布式的大体框架,可以如以下简单的示意图所示(抽象派画家O(∩_∩)O...) 首先用 ...

  5. 我的面试标准:1.能干活;2.Java基础好;3.熟悉分布式框架

    点击上方"果汁简历",选择"置顶公众号" 我的面试标准 在上周,我密集面试了若干位 Java 后端的候选人,工作经验在3到5年间.我的标准其实不复杂: 1.第一 ...

  6. 大数据时代,如何根据业务选择合适的分布式框架

    内容来源:2018 年 5 月 5 日,小米HBase研发工程师吴国泉在"ACMUG & CRUG 2018 成都站"进行<大数据时代系统体系架构和对比:存储与计算& ...

  7. 淘宝分布式框架Fourinone2.0正式版发布

    淘宝Fourinone2.0提供了一个4合1分布式框架和简单易用的编程api,实现对多台计算机cpu,内存,硬盘的统一利用,从而获取到强大计算能力去解决复杂问题.Fourinone框架提供了一系列并行 ...

  8. 转载CSDN (MVC WebAPI 三层分布式框架开发)

    前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理,是本文论述的重点.此外,插件技术的应用,富客户端JQ ...

  9. Nginx:HTTP框架是如何介入请求

    考资料 <深入理解Nginx>(陶辉) Nginx事件模块博客地址:http://www.cnblogs.com/runnyu/p/4914698.html Nginx是一个事件驱动构架的 ...

最新文章

  1. NSMutableArray 记住取不到时要进行强转
  2. docker中部署springboot项目,并且外部访问
  3. SpringBoot用容器IoC管理Bean
  4. c:forEach varStatus=status中 varStatus的属性简介
  5. svn教程----权限管理
  6. UVa 10082 - WERTYU 解题报告 - C语言
  7. OFDM技术及其应用
  8. SChema中group指示器的使用
  9. kafka的消费顺序_Kafka原理和实践云平台技术栈13
  10. Sitecore8.2 GeoIP - 在8.2的引擎盖下发生了什么?
  11. 使用ApplicationContext类来完全封装闪屏功能
  12. 如何用BootStrap栅格系统实现响应式布局
  13. C语言实现扩展欧几里得算法
  14. Codeforces 1071C Triple Flips 构造
  15. Linux嵌入式开发 -- imx6ull 主频配置
  16. 淘宝直通车ROI,投产比怎么算,ROI计算公式
  17. JAVA餐厅线上点菜系统计算机毕业设计Mybatis+系统+数据库+调试部署
  18. kiosk 无效_开发Kiosk Web应用程序的10个技巧
  19. STM32H747 / STM32H745 简单测试
  20. JavaScript自动生成博文目录导航

热门文章

  1. python画企鹅_Python小记
  2. vivo一直点android版本,关于vivo的系统,我想说的
  3. 深度学习基础理论探索(一):激活函数、梯度消失
  4. android 仿qq的侧滑删除功能
  5. SAP FICO CBS接口-银企直连付款平台功能开发说明书(包括测试样例、FS)
  6. 新买的路由器怎么设置(收藏)
  7. 无法连接pptp服务器未响应,pptp服务器未响应
  8. c++服务器开发 之一 概要介绍
  9. python三引号怎么换行_python三引号怎么使用
  10. html调用显示高德地图,快速上手-数据可视化 JS API | 高德地图API