目录
一.Nginx简介
1.Nginx的模块
2.正向代理与反向代理
3.Nginx的作用
二.Nginx的安装
1.安装方式
2.编译安装步骤
三.Nginx的常用命令
1.启动
2.停止
3.退出
4.关闭
5.重新加载
6.查看nginx版本
四.Nginx配置文件
1.nginx.conf简介
2.配置文件解构
五.Nginx负载均衡
1.轮询
2.加权轮询
3.ip_hash
4.least_conn
六.Nginx之server(主机)配置
1.相同的ip配置不通的域名,模仿多个物理机
2.通配符实现
3.默认主机配置
七.Nginx之location配置
1.location的语法
2.常用的修饰符说明
3.前缀匹配
4.通用匹配
5.精确匹配
6.精确前缀匹配
7.正则表达式匹配(区分大小写)
7.正则表达式匹配(不区分大小写)
8.完整例子
9.实际使用建议
八.Nginx常用案例
1.代理静态文件
2.反向代理
3.跨域配置
4.防盗链
一.Nginx简介
1.Nginx的模块
高度模块化的设计是 Nginx 的架构基础,Nginx 服务器被分解为多个模块,每个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,低耦合”的原则。
核心模块
核心模块是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。
标准 HTTP 模块
标准 HTTP 模块提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。
可选 HTTP 模块
可选 HTTP 模块主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如:Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。
邮件服务模块
邮件服务模块主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。
第三方模块
第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。
2.正向代理与反向代理
正向代理最大的特点是客户端非常明确要访问的服务器地址,隐藏了真实客户端信息。正向代理,"它代理的是客户端,代客户端发出请求"。
反向代理最大的特点是服务端非常明确请求来自于那个客户端,隐藏了真实服务端信息。反向代理,"它代理的是服务端,代服务端接收请求"。
3.Nginx的作用
(1)正向代理:服务器代理客户端,在客户端配置代理服务器,通过代理服务器进行互联网访问
(2)反向代理:服务器代理服务器,客户端发送请求到代理服务器,由反向代理服务器获取数据返回给客户端,此时反向代理服务器和目标服务器带外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的IP地址
(3)负载均衡:单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上
(4)动静分离:为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
二.Nginx的安装
1.安装方式
(1)yum安装,简单易用
(2)编译安装,需要使用第三方模块时需要使用编译安装(推荐使用此方式安装)
(3)docker安装
2.编译安装步骤
1.安装make
yum -y install autoconf automake make
2.安装g++
yum -y install gcc gcc-c++
3.安装nginx依赖库
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel
4.下载nginx
wget http://nginx.org/download/nginx-1.21.1.tar.gz
5.解压
tar -zxvf nginx-1.19.1.tar.gz
目录结构如下
6.编辑安装
进入到nginx目录下
如果我们不需要指定安装其他模块的话,我们默认只需要执行–prefix就可以了。如果我们需要安装其他模块就需要在编译的时候执行–with 也就是说你需要安装的这个模块默认是没有安装进nginx的,如果我们不需要某些模块这个时候我们就需要执行–without,也就是说without后面跟着的模块默认是安装进nginx的。
./configure --prefix=/usr/local/nginx
make && make install
参数解释
–prefix指定安装目录
–with-http_ssl_module安装https模块
creating objs/Makefile 代表编译成功
make编译
make install安装
7.配置环境变量
vi /etc/profile
在最后一行加上
PATH=$PATH:/usr/local/nginx/sbin
export PATH
生效环境变量
source /etc/profile
8.关闭 防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
三.Nginx的常用命令
1.启动
nginx
# 如果执行配置文件
nginx -c nginx.conf #如果不指定,默认为NGINX_HOME/conf/nginx.conf
2.停止
nginx -s stop
3.退出
nginx -s quit
4.关闭
# 查看nginx进程号
ps -aux | grep nginx
# 杀掉进程
kill -9 nginx
5.重新加载
nginx -s reload
6.查看nginx版本
nginx -v
四.Nginx配置文件
1.nginx.conf简介
Nginx配置文件一般位于Nginx安装目录下的conf目录下,整个文件以block形式组合而成,每一个block都使用"{}"大括号来表示,block中可以嵌套其他block层级。其中main层是最高层次。
2.配置文件解构
Nginx配置文件主要有4部分,main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理,负载均衡相关配置)和location(url匹配特定位置的设置),每部分包含若干指令。
(1)Main:影响其他所有部分的设置;
(2)Server:主要用于指定虚拟机主机域名,ip和端口;
(3)Upstream:设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;
(4)Location:用于匹配网页位置(如,跟目录“/”,”/images”等)。
它们之间的关系是,server继承main,location继承server,upstream既不会继承指令也不会被继承。
3.配置文件样例详解
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}
五.Nginx负载均衡
1.轮询
upstream dynamicserver {
server 192.168.64.1:9001; #tomcat 1
server 192.168.64.1:9002; #tomcat 2
server 192.168.64.1:9003; #tomcat 3
server 192.168.64.1:9004; #tomcat 4
}
在轮询中,如果服务器down掉了,会自动剔除该服务器。缺省配置就是轮询策略。此策略适合服务器配置相当,无状态且短平快的服务使用。
2.加权轮询
#动态服务器组
upstream dynamicserver {
server 192.168.64.1:9001 weight=2; #tomcat 1
server 192.168.64.1:9002; #tomcat 2
server 192.168.64.1:9003; #tomcat 3
server 192.168.64.1:9004; #tomcat 4
}
weight参数用于指定轮询几率,weight的默认值为1,;weight的数值与访问比率成正比,比如Tomcat 1被访问的几率为其他服务器的两倍。
权重越高分配到需要处理的请求越多。
此策略可以与least_conn和ip_hash结合使用。
此策略比较适合服务器的硬件配置差别比较大的情况。
3.ip_hash
upstream dynamicserver {
ip_hash; #保证每个访客固定访问一个后端服务器
server 192.168.64.1:9001 weight=2; #tomcat 1
server 192.168.64.1:9002; #tomcat 2
server 192.168.64.1:9003; #tomcat 3
server 192.168.64.1:9004; #tomcat 4
}
在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
ip_hash不能与backup同时使用
此策略适合有状态服务,比如session。
当有服务器需要剔除,必须手动down掉。
4.least_conn
upstream dynamicserver {
least_conn; #把请求转发给连接数较少的后端服务器
server 192.168.64.1:9001 weight=2; #tomcat 1
server 192.168.64.1:9002; #tomcat 2
server 192.168.64.1:9003; #tomcat 3
server 192.168.64.1:9004; #tomcat 4
}
此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
六.Nginx之server(主机)配置
1.相同的ip配置不通的域名,模仿多个物理机
(1)修改配置文件如下
server {
listen 80;
charset utf-8;
server_name www.abc.com;
location /{
alias '/root/www/nginx/abc/';
index index.html index.htm;
expires 7d;
}
}
server {
listen 80 ;
charset utf-8;
server_name www.bbs.com;
location /{
alias '/root/www/nginx/bbs/';
index index.html index.htm;
expires 7d;
}
}
(2)修改/etc/hosts文件
192.168.64.150 www.abc.com
192.168.64.150 www.bbs.com
(3)访问测试
我们发现访问不同的域名访问的地址是不一样的这样就像是有多个物理机一样
2.通配符实现
server {
listen 80;
charset utf-8;
server_name *.com;
location /{
default_type text/html;
echo "通配符在前";
}
}
server {
listen 80;
charset utf-8;
server_name www.abc.*;
location /{
default_type text/html;
echo "通配符在后";
}
}
3.默认主机配置
server {
# 将域名bbs.com 设置为默认虚拟主机
listen 80 default;
charset utf-8;
server_name www.bbs.com;
location /{
alias '/root/www/nginx/bbs/';
index index.html index.htm;
expires 7d;
}
}
使用未配置的域名或者IP地址访问,我们发现如果访问一个没有配置的虚拟主机就会跳到www.bbs.com的页面。
七.Nginx之location配置
1.location的语法
location [修饰符] pattern {…}
2.常用的修饰符说明
3.前缀匹配
没有修饰符表示必须以指定模式开始,指定模式前面没有任何修饰符,直接在location后写需要匹配的uri,它的优先级次于正则匹配
server {
listen 80;
server_name www.tangbb.com;
location /abc {
default_type text/html;
echo "abc...";
}
}
4.通用匹配
通用匹配使用一个 / 表示,可以匹配所有请求,一般nginx配置文件最后都会有一个通用匹配规则,当其他匹配规则均失效时,请求会被路由给通用匹配规则处理;如果没有配置通用匹配,并且其他所有匹配规则均失效时,nginx会返回 404 错误
server {
listen 80;
server_name www.tangbb.com;
location /{
default_type text/html;
echo "abc...";
}
}
5.精确匹配
精确匹配使用 = 表示,nginx进行路由匹配的时候,精确匹配具有最高的优先级,请求一旦精确匹配成功nginx会停止搜索其他到匹配项
server {
listen 80;
server_name www.tangbb.com;
location = /abc {
default_type text/html;
echo "abc...";
}
}
如下内容可正确匹配:
www.tangbb.com/abc
www.tangbb.com/abc?.…
如下内容则无法匹配:
www.tangbb.com/abc/
www.tangbb.com/abc/adcde
6.精确前缀匹配
精确前缀匹配的优先级仅次于精确匹配,nginx对一个请求精确前缀匹配成功后,停止继续搜索其他到匹配项
server {
listen 80;
server_name www.tangbb.com;
location ^~ /abc {
default_type text/html;
echo "abc...";
}
}
那么如下内容可以就可以正确匹配:
www.tangbb.com/abc
www.tangbb.com/abc/other
www.tangbb.com/abc?.…
7.正则表达式匹配(区分大小写)
正则匹配区分大小写用 ~ 表示;一个请求精确匹配和精确前缀匹配都失败后,如果配置有相关的正则匹配location,nginx会尝试对该请求进行正则匹配。需要说明的是正则匹配之间没有优先级一说,而是按照在配置文件中出现的顺序进行匹配,一旦匹配上一个,就会停止向下继续搜索。
server {
server_name www.tangbb.com;
location ~ ^/abc$ {
default_type text/html;
echo "abc-regular-x";
}
}
那么如下内容可以正确匹配:
www.tangbb.com/abc
www.tangbb.com/abc?.…
如下内容则无法匹配:
www.tangbb.com/abc/
www.tangbb.com/ABC
www.tangbb.com/abcde
7.正则表达式匹配(不区分大小写)
正则匹配区分大小写用 ~* 表示。
server {
server_name www.tangbb.com;
location ~* ^/abc$ {
default_type text/html;
echo "abc-regular-x";
}
}
那么如下内容就可以正确匹配:
www.tangbb.com/abc
www.tangbb.com/abc?.…
www.tangbb.com/ABC
如下内容则无法匹配:
www.tangbb.com/abc/
www.tangbb.com/abcde
8.完整例子
server {
server_name www.tangbb.com;
default_type text/html;
charset utf-8;
location = / {
echo "规则A";
}
location = /login {
echo "规则B";
}
location ^~ /static/ {
echo "规则C";
}
location ^~ /static/files {
echo "规则X";
}
location ~ \.(gif|jpg|png|js|css)$ {
echo "规则D";
}
location ~* \.js$ {
echo "规则E";
}
location /img {
echo "规则Y";
}
location / {
echo "规则F";
}
}
请求uri 匹配路由规则
http://www.tangbb.com/ 规则A
http://www.tangbb.com/login 规则B
http://www.tangbb.com/register 规则F
http://www.tangbb.com/static/a.html 规则C
http://www.tangbb.com/static/files/a.txt 规则X
http://www.tangbb.com/a.png 规则D
http://www.tangbb.com/a.PNG 规则F
http://www.tangbb.com/img/a.gif 规则D
http://www.tangbb.com/img/a.tiff 规则Y
9.实际使用建议
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
alias /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
# 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
# 非静态文件请求就默认是动态请求,自己根据实际把握
# 毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}
八.Nginx常用案例
1.代理静态文件
server {
listen 10086;
server_name www.tangbb.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
}
location /data/ {
alias '/usr/local/data';
//这里是重点,就是代理这个文件夹
expires 7d;
}
}
访问 http://localhost:10086/data/下面的资源就是访问/usr/local/data文件夹的资源
2.反向代理
server {
listen 80;
server_name www.tangbb.com;;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm .jsp;
}
}
3.跨域配置
server {
listen 80;
server_name test.cross.com;
if ( $host ~ (.*).cross.com){
set $domain $1;##记录二级域名值
}
#是否允许请求带有验证信息
add_header Access-Control-Allow-Credentials true;
#允许跨域访问的域名,可以是一个域的列表,也可以是通配符*
add_header Access-Control-Allow-Origin *;
#允许脚本访问的返回头
add_header Access-Control-Allow-Headers 'x-requested-with,content-type,Cache-Control,Pragma,Date,x-timestamp';
#允许使用的请求方法,以逗号隔开
add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE';
#允许自定义的头部,以逗号隔开,大小写不敏感
add_header Access-Control-Expose-Headers 'WWW-Authenticate,Server-Authorization';
#P3P支持跨域cookie操作
add_header P3P 'policyref="/w3c/p3p.xml", CP="NOI DSP PSAa OUR BUS IND ONL UNI COM NAV INT LOC"';
if ($request_method = 'OPTIONS') {##OPTIONS类的请求,是跨域先验请求
return 204;##204代表ok
}
}
4.防盗链
# 需要防盗的后缀
location ~* \.(jpg|jpeg|png|gif|bmp|swf|rar|zip|doc|xls|pdf|gz|bz2|mp3|mp4|flv)$
#设置过期时间
expires 30d;
# valid_referers 就是白名单的意思
# 支持域名或ip
# 允许ip 192.168.0.1 的请求
# 允许域名 *.google.com 所有子域名
valid_referers none blocked 192.168.0.1 *.google.com;
if ($invalid_referer) {
# return 403;
# 盗链返回的图片,替换盗链网站所有盗链的图片
rewrite ^/ https://site.com/403.jpg;
}
root /usr/share/nginx/img;
}