1 Linux下Nginx安装

1.1 源码编译方式

安装make:yum -y install autoconf automake make
安装g++: yum -y install gcc gcc-c++
#一般系统中已经装了了make和g++,无须再装

yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum install -y openssl openssl-devel
#安装nginx依赖的库
wget http://nginx.org/download/nginx-1.15.8.tar.gz
tar -zxvf nginx-1.15.8.tar.gz
cd nginx-1.15.8
# ./configure —prefix 意思是把所有资源文件放入到/usr/local/nginx 文件夹下
./configure —prefix=/usr/local/nginx —with-http_stub_status_module —with-http_ssl_module

配置
#—prefix指定安装目录
#—with-http_ssl_module安装https模块
#creating objs/Makefile 代表编译成功
make && make install
#make编译
#make install安装

注意安装完了nginx的安装文件在/usr/local/nginx/ 路径下,不是你下载的位置

1.2 yum方式

yum install yum-utils
yum-config-manager —add-repo https://openresty.org/package/centos/openresty.repo
yum install openresty

1.3 Nginx目录结构

  • Conf 配置文件
  • Html 网页文件
  • Logs 日志文件
  • Sbin 二进制程序

    1.4 Nginx常用命令

    启停命令:
    ./nginx -c nginx.conf的文件。如果不指定,默认为NGINX_HOME/conf/nginx.conf
    ./nginx -s stop 停止
    ./nginx -s quit退出
    ./nginx -s reload 重新加载nginx.conf

    2 Linux的Nginx操作问题

2.1 nginx的使用

2.1.1 查看nginx的安装位置

nginx -t 查看 nginx 的安装位置

2.1.2 重启(启动)nginx服务

nginx -c /etc/nginx/nginx.conf

/etc/nginx/nginx.conf 是Linux的nginx的conf的配置文件安装位置,如果不确定就输入 nginx -t可以查看到nginx的conf文件安装位置

此时再查看ps -ef |grep nginx 就能查看进程号了

2.1.3 查看nginx的错误日志

nginx访问日志的默认路径是在 /var/log/nginx
直接 cd /var/log/nginx 进入nginx文件下
ls查看一下
02.[Nginx]使用 - 图1
vi log就可以查看日志的详细信息了

3 配置文件

3.1 配置文件结构

02.[Nginx]使用 - 图2
main(全局设置)
events设定nginx的工作模式及连接数上限
http 服务器相关属性
server(虚拟主机设置)虚拟主机能够为不同的域名/ip/端口提供服务入口.其实是每一个域名能够提供一个东西,这就是虚拟主机
upstream(上游服务器设置,主要为反向代理、负载均衡相关配置)
location(URL匹配特定位置后的设置)

user nobody; #主模块命令, 指定Nginx的worker进程运行用户以及用户组,默认由nobody账号运行。
worker_processes 1;#指定Nginx要开启的进程数。
worker_rlimit_nofile 100000; #worker进程的最大打开文件数限制
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
/*

3.1.1 配置详解

以上这块配置代码是对nginx全局属性的配置。
user :主模块命令, 指定Nginx的worker进程运行用户以及用户组,默认由nobody账号运行。
worker_processes: 指定Nginx要开启的进程数。
error log:用来定义全局错设日志文件的路径和日志名称。
日志输出级别有debug,info,notice,warn,error,crit 可供选择,其中debug输出日志最为详细,面crit(严重)输出日志最少。默认是error
pid: 用来指定进程id的存储文件位置。
event:设定nginx的工作模式及连接数上限,
其中参数use用来指定nginx的工作模式(这里是epoll,epoll是多路复用IO(I/O Multiplexing)中的一种方式),
nginx支持的工作模式有select ,poll,kqueue,epoll,rtsig,/dev/poll。
其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,对于linux系统,epoll是首选。
worker_connection是设置nginx每个进程最大的连接数,默认是1024,所以nginx最大的连接数max_client=worker_processes worker_connections。
进程最大连接数受到系统最大打开文件数的限制,需要设置ulimit。
/
#下面部分是nginx对http服务器相关属性的设置
http {
include mime.types; 主模块命令,对配置文件所包含文件的设定,减少主配置文件的复杂度,相当于把部分设置放在别的地方,然后在包含进来,保持主配置文件的简洁
default_type application/octet-stream; 默认文件类型,当文件类型未定义时候就使用这类设置的。
#log_format main ‘$remote_addr - $remote_user [$time_local] “$request” ‘ 指定nginx日志的格式
# ‘$status $body_bytes_sent “$http_referer” ‘
# ‘“$http_user_agent” “$http_x_forwarded_for”‘;
#access_log logs/access.log main;
sendfile on; 开启高效文件传输模式(zero copy 方式),避免内核缓冲区数据和用户缓冲区数据之间的拷贝。
#tcp_nopush on; 开启TCP_NOPUSH套接字(sendfile开启时有用)
#keepalive_timeout 0; 客户端连接超时时间
keepalive_timeout 65;
#gzip on; 设置是否开启gzip模块
#下面是server段虚拟主机的配置
server {
listen 80; 虚拟主机的服务端口
server_name localhost; 用来指定ip或者域名,多个域名用逗号分开
#charset koi8-r;
location / {
#地址匹配设置,支持正则匹配,也支持条件匹配,这里是默认请求地址,用户可以location命令对nginx进行动态和静态网页过滤处理
root html; 虚拟主机的网页根目录
index index.html index.htm; 默认访问首页文件
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

4 配置虚拟主机

需要SwitchHosts软件配置host

在本地方案 配置方案 然后使用

192.168.3.101 a.zjj.com
192.168.3.101 b.zjj.com

然后修改
/usr/local/nginx/conf路径下的 nginx.conf 文件夹

主要是修改 server_name 啥的

server {
# 监听端口
listen 80;
# 监听域名
server_name a.zjj.com;

location / {
# 访问这个文件
root /etc/static;
# 默认文件是a.html文件
index a.html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

server {
listen 80;
server_name b.zjj.com;
location / {
root /etc/static;
index b.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

然后去
/usr/local/nginx/sbin 文件下输入:
./nginx -s reload #命令刷新配置文件

然后浏览器访问 :http://a.zjj.com/http://b.zjj.com/ 就能访问对应的页面

当然你也可以直接访问ip地址 http://192.168.3.101/ , 这样的话如果nginx只有一个server的话,它就会去找那个server的location指定的页面和路径,如果nginx配置了多个server的话,nginx会随机找一个server作为默认的路径,如果想配置默认的虚拟主机的话也可以配置

配置默认的虚拟主机
假如你访问的域名在server_name都没有的话,nginx就会默认走这个,
假如你访问 c.zjj.com (已经事先配置好了host了),但是server_name里面都没有,那就默认走这个. 注意,只能设置一个,如果过多就会报错的,

server {
listen default_server; # 表示当前主机是默认的
server_name b.zjj.com;
location / {
root /etc/static;
index b.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

配置端口

host文件

192.168.3.101 a.zjj.com

nginx.conf配置文件修改 ,添加listen监听端口, 你也可以设置别的,只要不冲突就行了

server {

listen 8080;
server_name a.zjj.com;
location / {
root /etc/static;
index a.html;
}
}

/usr/local/nginx/sbin 文件下输入:
./nginx -s reload #命令刷新配置文件

浏览器访问:

http://a.zjj.com:8080/
就能看到效果, 如果看不到内容就强刷一下浏览器缓存, 就能看到新的页面

多个端口情况

server {
listen 80;
server_name b.zjj.com;

location / {
root /etc/static;
index b.html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
server {
listen 8888;
server_name b.zjj.com;

location / {
root /etc/static;
index c.html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

/usr/local/nginx/sbin 文件下输入:
./nginx -s reload #命令刷新配置文件

访问: http://b.zjj.com:8888/http://b.zjj.com/ 就是不同的页面了. 注意80端口默认是不写的

引入外部配置文件

include /usr/local/nginx/*.conf; # 也可以通配,但是不用和nginx.conf在一个文件夹里面,这样会出现问题

include /usr/local/nginx/conf/a.conf; # 引入配置文件
include /usr/local/nginx/conf/b.conf; # 引入配置文件
include /usr/local/nginx/conf/c.conf; # 引入配置文件

直接在nginx.conf 配置文件

include /usr/local/nginx/conf/a.conf; # 引入配置文件
include /usr/local/nginx/conf/b.conf; # 引入配置文件
include /usr/local/nginx/conf/c.conf; # 引入配置文件

然后把要提出取出的内容删除掉,比如server模块儿.

  1. conf配置文件 | server {

    listen 80;
    server_name a.zjj.com;
    location / {
    root /etc/static;
    index a.html;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }
    } | | —- |

/usr/local/nginx/sbin 文件下输入:
./nginx -s reload #命令刷新配置文件
然后浏览器访问 a.zjj.com 就可以查看内容了.

5 路由—Location的使用

5.1 Location语法规则

02.[Nginx]使用 - 图3
当浏览器发了一个http请求被nginx监听到了之后,nginx会第一步匹配到内部的server虚拟主机,到达server虚拟主机的时候就开始路由的匹配,匹配有几个规则,
第一个规则就是精准匹配,location = /uri/{} ,只要有这个等号,就是精准匹配,优先级最高一旦判断出哪个url和你浏览器发过来的路径是一致的,nginx会立马进入这个location代码块儿里面来进行计算
然后就是一般匹配 location /uri/{} ,注意中间有个空格,根据前缀匹配
然后就是普通匹配 如果有多个都匹配上,就取uri最长的来匹配
也可以匹配正则的路径,

语法规则: location [=|~|~*|^~] /uri/ {… }
首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

符号 含义
= = 开头表示精确匹配
^~ ^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可(禁止正则匹配)。
~ ~ 开头表示区分大小写的正则匹配
~* ~* 开头表示不区分大小写的正则匹配
!~和!~* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则
/ 用户所使用的代理(一般为浏览器)

匹配规则优先级如下:

  • =精准匹配命中时,停止location动作,直接走精准匹配,
  • 一般匹配(含非正则)命中时,先收集所有的普通匹配,最后对比出最长的那一条
  • 如果最长的那一条普通匹配声明为非正则,直接此条匹配,停止location
  • 如果最长的那一条普通匹配不是非正则,继续往下走正则location
  • 按代码顺序执行正则匹配,当第一条正则location命中时,停止location

配置Tomcat路由

server {
listen 80;
server_name b.zjj.com;

location / {
proxy_pass http://192.168.3.101:8080/demo/lmxi/ceui2/;
}
}

访问:
http://192.168.3.101:8080/demo/lmxi/ceui2/AAA 可以直接访问Tomcat
然后我们配置了nginx之后就可以直接通过nginx来访问:
http://b.zjj.com/AAA 和上面的访问的是相同的页面. nginx帮我们路由的内容.

因为你访问b.zjj.com的时候nginx帮你转接了,就相当于你访问了http://192.168.3.101:8080/demo/lmxi/ceui2

也可以在location那里添加前缀

server {

listen 80;
server_name b.zjj.com;

location /nginx/ {
proxy_pass http://192.168.3.101:8080/demo/lmxi/ceui2/;
}

}

访问http://b.zjj.com/nginx/AAA相当于访问
http://192.168.3.101:8080/demo/lmxi/ceui2/AAA

因为nginx帮你把http://b.zjj.com/nginx/ 转接到http://192.168.3.101:8080/demo/lmxi/ceui2/了.

这样的话你就可以通过一个nginx来跳转到不同的Tomcat服务器路径了.假如
http://b.zjj.com/aaa/ 访问的是A的Tomcat
http://b.zjj.com/bbb/ 访问的是B的Tomca

你只需要配置两个location就行了

server {

listen 80;
server_name b.zjj.com;

location /aaa/ {
proxy_pass http://192.168.3.101:8080/aaa/;
}

location /bbb/ {
proxy_pass http://192.168.3.101:8080/bbb/;
}

}

配置图片服务器

用 alias 取别名.

配置图片访问地址(图片存放在别的文件夹下) window的,Linux有时间再配置

使用场景: 别的机器想通过ip加端口加路径访问我本机的图片
需要修改 nginx的conf的 nginx.conf

配置图片的
server {
listen 8090; # 监听的端口
server_name localhost;

  1. location / {<br /> alias D:/User/ZhuoMian/work/downloadceui/; # 本机存放的图片的文件夹<br /> autoindex on;<br /> }<br /> }

02.[Nginx]使用 - 图4
测试:
浏览器输入 ip加Nginx的端口号加图片名字就可以访问了.
http://192.168.0.122:8090/图片名.png

404错误重定向

server {

listen 80 default_server;
server_name a.zjj.com;

location / {

root /etc/static;
index a.html;
}
error_page 404 https://www.baidu.com; #错误页
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}

error_page这段配置就是当你访问路径造成404错误的时候,就会重定向到你指定的页面上,
上个配置是假如你访问 http://a.zjj.com/a 此时是没有的,如果你没配置的话,就会报404的错误,配置以后,让你访问要报404错误的页面的时候,它不会报错,而是跳转到你配置的页面上.
error_page 404 https://www.baidu.com; #错误页 是发生404错误的时候跳转到百度上.

让返回错误码大于400的时候重定向也起作用

proxy_intercept_errors on; #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off。

5.2 path匹配过程

02.[Nginx]使用 - 图5
假设http请求路径为
http://192.168.0.132:8088/mvc/index?id=2 ,匹配过程如下:

  • 将整个url拆解为域名/端口/path/params
  • 先由域名/端口,对应到目标server虚拟主机
  • path部分参与location匹配,path = path1匹配部分 + path2剩余部分
  • 进入location方法体内部流程。
  • 若是静态文件处理,则进入目标目录查找文件:root指令时找path1+path2对应的文件;alias指令时找path2对应的文件
  • 若是proxy代理,则形如proxy_pass=ip:port时转发path1+path2路径到tomcat;形如proxy_pass=ip:port/xxx时转发path2路径到tomcat。params始终跟随转发。02.[Nginx]使用 - 图602.[Nginx]使用 - 图7

    6 rewrite重定向

    什么是内部重定向和外部重定向
    浏览器发送了请求到你的服务器,你的服务器内部通过各种中转,浏览器没有发生任何变化,这就是内部重定向.
    如果我们的页面过来之后,我想要让浏览器自己跳转,这个就是外部重定向.

redirect重定向302 代表永久性的重定向
permanent 临时重定向 301 意思就是现在出错了,你想要请求的话去隔壁处理一下

rewrite regex replacement [flag];
flag=【break/last/redirect/permanent】

  • regex 是正则表达式
  • replacement 是替换值,新值
  • flag — 后续处理标识

flag=break
发生nginx内部重定向,path值被更新,rewrite层面的命令会中断。原控制流程逻辑不变往下走
flag=last
发生nginx内部重定向,path值被更新,rewrite层面的命令会中断。控制流程刷新,重新进行整个location层的逻辑流程,会重写进行匹配,如果匹配上了location上的uri值,就会直接执行location代码块儿里面的内容.
如果匹配不到的话,会直接往下查找.
flag= redirect/permanent
发生页面重定向(301永久重定向/302临时重定向),nginx流程结束,返回http响应到浏览器,页面url更新
flag为空
发生nginx内部重定向,path值被更新,rewrite层面的命令继续。最后一个rewrite完毕,刷新控制流程,重新进行location重匹配

7 Nginx日志

Nginx日志对于统计、系统服务排错很有用,Nginx日志主要分为两种:access_log(访问日志)和error_log(错误日志),通过访问日志我们可以得到用户的IP地址、浏览器的信息,请求的处理时间等信息
nginx支持你自己编辑自定义access格式的日志,错误日志记录了访问出错的信息,但是不能编辑错误日志的自定义格式,
日志可以帮助我们定位错误的原因,因此,将日志好好利用,可以得到很多有价值的信息。

查看日志命令:
tail -f /usr/local/nginx/logs/access.log

7.1 设置access_log

访问日志主要记录客户端的请求。客户端向Nginx服务器发起的每一次请求都记录在这里。客户端IP,浏览器信息,referer,请求处理时间,请求URL等都可以在访问日志中得到。当然具体要记录哪些信息,你可以通过log_format指令定义。

也可以每个虚拟主机(server代码块儿)配置一个独立的日志输出格式,也可以配置独立输出日志的位置.让一个server对应一个日志文件.

7.1.1 语法

  1. accesslog path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 设置访问日志_
  2. accesslog off; # 关闭访问日志_

path 指定日志的存放位置。
format 指定日志的格式。默认使用预定义的combined。
buffer 用来指定日志写入时的缓存大小。默认是64k。
gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。
flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。
if 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志。
另外,还有一个特殊的值off。如果指定了该值,当前作用域下的所有的请求日志都被关闭。

7.1.2 示例

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; # 这个main对应上面的main,名字可以随便定义的,只要能对应上就可以了.

改完日志完了还需要刷新配置文件.

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

  4. log_format main ‘$remote_addr - $remote_user [$time_local] “$request” ‘
  5. ‘$status $body_bytes_sent “$http_referer” ‘
  6. ‘“$http_user_agent” “$http_x_forwarded_for”‘;
  7. 日志格式使用默认的combined,指定日志的缓存大小为32k,日志写入前启用gzip进行压缩,压缩比使用默认值1,缓存数据有效时间为1分钟。

  8. access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m;
  9. }

    7.1.3 作用域

    access_log指令的作用域分别有http,server,location。

    7.2 2、log_format自定义格式

    默认的日志格式

  10. log_format main ‘$remote_addr - $remote_user [$time_local] “$request” ‘

  11. ‘$status $body_bytes_sent “$http_referer” ‘

    ‘“$http_user_agent” “$http_x_forwarded_for”‘;
    各参数明细表:

$remote_addr 客户端的ip地址(代理服务器,显示代理服务ip)
$remote_user 用于记录远程客户端的用户名称(一般为“-”)
$time_local 用于记录访问时间和时区
$request 用于记录请求的url以及请求方法
$status 响应状态码,例如:200成功、404页面找不到等。
$body_bytes_sent 给客户端发送的文件主体内容字节数
$http_user_agent 用户所使用的代理(一般为浏览器)
$http_x_forwarded_for 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$http_referer 可以记录用户是从哪个链接访问过来的

7.3 设置error_log

错误日志在Nginx中是通过error_log指令实现的。该指令记录服务器和请求处理过程中的错误信息。
错误日志不支持自定义。

7.3.1 语法和级别

error_log path [level];

  • path参数指定日志的写入位置。
  • level参数指定日志的级别(不写为全部)。level可以是debug, info, notice, warn, error, crit, alert,emerg中的任意值(等级从低到高排列)。

只有日志的错误级别等于或高于level指定的值才会写入错误日志中。默认值是error。

错误日志级别:常见的错误日志级别有[debug | info | notice | warn | error | crit | alert | emerg],级别越高记录的信息越少。
生产场景一般是 warn | error | crit 这三个级别之一
注意:不要配置info等级较低的级别,会带来大量的磁盘I/O消耗。

7.3.2 示例

在nginx.conf 里面配置 ,然后错误日志里面有不同的日志级别,就类似Java日志框架的info error 级别等等.

error_log logs/error.log;
error_log logs/error_notice.log notice;
error_log logs/error_info.log info; ##可以将不同的错误类型分开存储

7.4 日志配置和及切割

因为日志文件会越来越大,我可以切割成多个小的日志文件,使用nginx定时任务的配置.

/etc/init.d/rsyslog start #系统日志,如不开启,看不到定时任务日志
/etc/rc.d/init.d/crond start #定时任务开启
编写sh:

#!/bin/bash
#设置日志文件存放目录
LOG_HOME=”/usr/local/nginx/logs/“
#备分文件名称
LOG_PATH_BAK=”$(date -d yesterday +%Y%m%d%H%M)”
#重命名日志文件,按照日期格式来做的值,这个是按分钟的,可以按日期的.
mv ${LOG_HOME}/access.log ${LOG_HOME}/access.${LOG_PATH_BAK}.log
mv ${LOG_HOME}/error.log ${LOG_HOME}/error.${LOG_PATH_BAK}.log
#向nginx主进程发信号重新打开日志,kill不一定就是杀进程.
kill -USR1 cat ${LOG_HOME}/nginx.pid

配置cron:
/1 * /usr/local/nginx/sbin/logcut.sh

8 upstream—负载

8.1 介绍语法

在Tomcat集群的时候就需要负载均衡了

语法格式:
upstream 负载名 {
[ip_hash;]
server ip:port [weight=数字] [down];
server ip:port [weight=数字];
}
[]内容为可选项

server可以有多个
建议server后面只跟ip和端口,别的都不要配置

nginx的upstream常规使用
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。down 暂时不参与负载
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

8.2 轮询(默认)

upstream order {
server 192.168.0.128:8383;
server 192.168.244.233:8383;
}
不配置weight(即默认weight均为1)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

weight

upstream order {
server 192.168.0.128:8383 weight=3;
server 192.168.244.233:8383 weight=1 down;
}

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
down 暂时不参与负载

如果都不写weight就是轮询的方式,挨个儿来调用,如果我们配置了,比如上面一个是3,一个是1,那么就是3比1的比例,意思就是我访问四次,三次走那个weight = 3 的, 一次走 weight = 1 的那个.

ip_hash

upstream order {
ip_hash;
server 192.168.0.128:8383;
server 192.168.244.233:8383;
}

用户访问的时候,nginx通过ip进行hash算法,然后获取结果,这样同一客户端的请求总是发往同一个后端服务器,可以解决session的问题。

假如说A用户通过ip_hash 分配的是A服务器,那么A用户以后访问永远都是A服务器
B用户通过ip_hash分配的是B服务器,那么B用户以后访问的永远都是B服务器.

为什么要用ip_hash?

因为session是无法多项目共享的,假如用户访问被分配到A服务器的话,他登陆成功了,此时A服务器会有session信息, B服务器是没有session信息的,如果下次用户访问的时候恰巧被nginx分配到B服务器了,那么用户就得重写登陆,这样用户体验是非常不好的
如果你是用token机制等等,或者用别的方法实现了session共享问题. ,就不需要配置这个ip_hash这个东西.

不轮询这个服务器down

假如说你要对这个服务器进行升级,你不想nginx轮询到这个服务器,你可以用down配置, 然后这个Tomcat就不参与负载均衡了,也就是不会被访问到了.

upstream order{
server 192.168.3.101:8080 ;
server 192.168.3.102:8080 down ;
}

配置完了以后 192.168.3.102:8080 永远不会被轮询到.

8.3 负载均衡搭建过程

在http 代码块儿里面

upstream order{
server 192.168.3.101:8080 ; # 指定Tomcat1地址
server 192.168.3.102:8080 ; # 指定Tomcat2地址
}

server {
listen 80;
server_name test.enjoy.com;

if ( $host ~ (.*).enjoy.com){
set $domain $1;##记录二级域名值
}

location / {
proxy_pass http://order/;
}
}

需要配置host文件test.enjoy.com 配置到nginx所在的服务器的ip和端口
然后刷新nginx配置文件 nginx -s reload (在sbin文件夹里面)

直接用Tomcat访问的地址:
http://192.168.3.101:8080/home/enjoy/getPage
http://192.168.3.102:8080/home/enjoy/getPage
然后用nginx代理访问负载均衡
http://test.enjoy.com/home/enjoy//getPage
就能查看效果了

9 //**

10 前置知识

10.1 浏览器访问域名过程

假如访问京东网站,不是直接去网上找,而是先去本地的hosts文件里面去找,
C:\Windows\System32\drivers\etc 的hosts文件
02.[Nginx]使用 - 图8
Hosts配置文件里面前者是访问的地址,后者是地址的映射关系,如果配置了就基于本地的配置来走,如果没有配置的话就去网上去找,如果找不到就报404错误.
你也可以自己手动的修改hosts文件或者SwitchHosts来修改.配置好了还需要配置nginx

10.1.1 其他概念问题

web服务器分为2类

  1. web服务器

apache服务器
Nginx
IIS

  1. web应用服务器

    tomcat
    resin
    jetty
    nginx和Tomcat是不同的

区别:web服务器不能解析jsp等页面,只能处理js,css,html等静态资源
并发:web服务器并发能力远高于web应用服务器(tomcat最大连接数都是200 300层级 Nginx是3w~5w 差距巨大)

目前电商和互联网系统都会采用Nginx和Tomcat架构

概念:
Nginx挂Tomcat 域名可以挂一群(这就是Nginx集群)
02.[Nginx]使用 - 图9
Nginx允许编程(写一些脚本)

10.1.2 nginx的几种用法

https://www.toutiao.com/i6634336532838744589/

11 Nginx的使用

11.1 使用

11.1.1 SwitchHosts修改hosts文件

02.[Nginx]使用 - 图10

使用SwitchHosts软件专门修改hosts文件的,省的我们自己修改
!!!注意运行的SwitchHosts的时候需要用管理员身份运行
02.[Nginx]使用 - 图11
底下会显示这个
02.[Nginx]使用 - 图12

11.1.2 打开nginx的程序

但是还没有弄完, 需要nginx
02.[Nginx]使用 - 图13

双击打开
两个是正常, 1 个3个 4个都是错的
02.[Nginx]使用 - 图14
启动项目输入这个就访问成功了.
02.[Nginx]使用 - 图15
为什么能这样
02.[Nginx]使用 - 图16

过去的请求是直接到tomcat里面去,现在的是被nginx捉到了
02.[Nginx]使用 - 图17
然后它把我们的请求转给了对应的tomcat,这样就实现了我们域名访问工程

修改配置文件之后需要重启Nginx
不能正常关闭,需要用命令
02.[Nginx]使用 - 图18

11.1.3 Nginx.conf配置文件介绍

是nginx的核心配置文件

  1. server {<br /> listen 80;<br /> server_name crud.lookingforejob.com;<br /> location / {<br /> proxy_pass [http://127.0.0.1:9101;](http://127.0.0.1:9101;)<br /> root admin/;<br /> index admin/index.html;<br /> }<br /> }

Nginx默认监听端口号就是 80 ,80就是浏览器的端口号,
server_name 就是服务名称 就是你配置访问域名,你访问域名时候就找代理服务器
proxy_pass http: 代理服务器,指定地址的,不要写localhost,本地就写127.0.0.1 如果你本地的 http://127.0.0.1:9101项目正好启动状态,它就可以基于crud.lookingforejob.com网站访问的
index : 是配置默认访问的首页(在你部署的项目中) admin/index.html;

02.[Nginx]使用 - 图19

11.1.4 中文图片无法访问

nginx -t 查看 nginx 的安装位置
添加 charset utf-8; 在server代码块儿里面 root 上面
02.[Nginx]使用 - 图20
修改完了 重启 nginx 服务器
查看nginx进程号
02.[Nginx]使用 - 图21
从容停止Nginx:
kill -QUIT 主进程号
启动 nginx 指向的是nginx的conf配置文件
如果还不好使就试试下面的东西
确定系统是不是utf编码
输入 locale
02.[Nginx]使用 - 图22

nginx配置文件里默认编码设置为utf-8
nginx -t 命令查看 nginx 的安装位置
02.[Nginx]使用 - 图23
将非UTF-8的文件名转换为UTF-8编码
做法很简单,把文件名都修改成utf8编码就可以了!

安装包

安装convmv,由他去转换编码:
安装 rpm
输入命令 rpm -i xxxxxx (xxxxxx 是 rpm名字)
rpm -ivh xxxxxx (xxxxxx 是 rpm名字)

如果报错

1.安装软件:执行rpm -ivh rpm包名,如:
#rpm -ivh apache-1.3.6.i386.rpm
2.升级软件:执行rpm -Uvh rpm包名。
3.反安装:执行rpm -e rpm包名。
4.查询软件包的详细信息:执行rpm -qpi rpm包名
5.查询某个文件是属于那个rpm包的:执行rpm -qf rpm包名
6.查该软件包会向系统里面写入哪些文件:执行 rpm -qpl rpm包名

convmv就是更改文件名编码方式的一个工具。比如
sudo convmv -f gbk -t utf-8 -r –notest /data/font/html/upload

convmv -f GB2312 -t UTF-8 —nosmart —notest ./*

11.1.5 搭建静态服务器

现在很多项目流行前后分离,也就是前端服务器和后端服务器分离,分别部署,这样的方式能让前后端人员能各司其职,不需要互相依赖,而前后分离中,前端项目的运行是不需要用Tomcat、Apache等服务器环境的,因此可以直接用nginx来作为静态服务器。

静态服务器的配置如下,其中关键配置为:

  • root:直接静态项目的绝对路径的根目录。
  • server_name : 静态网站访问的域名地址。

先去conf页面配置
02.[Nginx]使用 - 图24
然后启动nginx服务
02.[Nginx]使用 - 图25

11.1.6 反向代理

https://note.youdao.com/web/#/file/recent/note/wcp1551917723462577/

02.[Nginx]使用 - 图26
反向代理:reverse proxy,是指用代理服务器来接受客户端发来的请求,然后将请求转发给内网中的上游服务器,上游服务器处理完之后,把结果通过nginx返回给客户端。

上面讲述了正向代理的原理,相信对于反向代理,就很好理解了吧。
反向代理是对于来自外界的请求,先通过nginx统一接受,然后按需转发给内网中的服务器,并且把处理请求返回给外界客户端,此时代理服务器对外表现的就是一个web服务器,客户端根本不知道“上游服务器”的存在。

02.[Nginx]使用 - 图27
举个栗子:一个服务器的80端口只有一个,而服务器中可能有多个项目,如果A项目是端口是8081,B项目是8082,C项目是8083,假设指向该服务器的域名为www.xxx.com,此时访问B项目是www.xxx.com:8082,以此类推其它项目的URL也是要加上一个端口号,这样就很不美观了,这时我们把80端口给nginx服务器,给每个项目分配一个独立的子域名,如A项目是a.xxx.com,并且在nginx中设置每个项目的转发配置,然后对所有项目的访问都由nginx服务器接受,然后根据配置转发给不同的服务器处理。具体流程如下图所示:
02.[Nginx]使用 - 图28

反向代理的配置关键点是:

  • server_name:代表客户端向服务器发起请求时输入的域名
  • proxy_pass:代表源服务器的访问地址,也就是真正处理请求的服务器(localhost+端口号)

反向代理配置:
server {
#监听端口
listen 80;
#服务器名称,也就是客户端访问的域名地址
server_name a.xxx.com;
#nginx日志输出文件
access_log logs/nginx.access.log main;
#nginx错误日志输出文件
error_log logs/nginx.error.log;
root html;
index index.html index.htm index.php;
location / {
#被代理服务器的地址
proxy_pass http://localhost:8081;
#对发送给客户端的URL进行修改的操作
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
}
}
这样就可以通过a.xxx.com来访问a项目对应的网站了,而不需要带上难看的端口号。

11.1.7 静态站点配置

https://note.youdao.com/web/#/file/recent/note/wcp1551917723462577/

11.1.8 负载均衡

https://note.youdao.com/web/#/file/recent/note/wcp1551917723462577/

11.1.9 配置多个html路径

https://note.youdao.com/web/#/file/recent/note/wcp1551917723462577/

11.1.10 设置跨域

https://note.youdao.com/web/#/file/recent/note/wcp1551917723462577/

11.2 错误解决

11.2.1 访问中文图片报403

02.[Nginx]使用 - 图29
是用户访问权限问题

看 nginx配置文件 给上面 urer修改一下 , 用root权限
02.[Nginx]使用 - 图30
如果还不好用就看看

https://blog.csdn.net/sinat_33716023/article/details/79017754

11.3 配置文件解读

events模块中包含nginx中所有处理连接的设置.