Nginx安装、反向代理、负载均衡

Nginx特性

  • 高性能 处理高并发能力上很强
  • 高扩展性 Nginx模块化,官方提供了多元化的模块。高可用性 三个999.9% 四个9 99.99%
  • 热部署(版本平滑升级) 服务进行升级的同时,保证业务不宕机
  • 应用场景非常多 代理、缓存、负载均衡、处理静态请求、动静分离、LNMP、LNMT、LNMU (Python)Uwsgi

Nginx安装部署

企业中安装Nginx,三种安装方式:

  • 编译安装:根据源码,根据企业业务需求,需要什么功能,编译时添加什么模块,即可(私人定制),但是安装过程较为繁琐
  • 自动化安装:配置好安装源,直接通过自动化安装工具安装即可
  • 二进制安装:类似于绿色免安装版,编译安装好的程序封装起来的包。
编译安装
  1. 准备源码包上传并解压

  2. 预编译—>编译—>安装
    准备依赖环境

    yum install -y openssl-devel pcre-devel gcc
    

    预编译

    ./configure --prefix=/usr/local/nginx --sbinpath=/bin/ --user=nginx --group=nginx --withhttp_ssl_module --withhttp_stub_status_module --withhttp_gzip_static_module
    

    添加Nginx用户

    useradd nginx -m -s /sbin/nologin
    

    安装

    make && make install
    
    /bin/nginx -V # 检测当前Nginx版本
    nginx version: nginx/1.19.7
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-
    44) (GCC)
    built with OpenSSL 1.0.2k-fips 26 Jan 2017
    TLS SNI support enabled
    configure arguments: --
    prefix=/usr/local/nginx --sbin-path=/bin/ --
    user=nginx --group=nginx --withhttp_ssl_module --withhttp_stub_status_module --withhttp_gzip_static_module
    

    启动Nginx

    /bin/nginx
    
自动化安装

centos自动工具安装yum
配置Nginx官方yum源
地址:http://nginx.org/en/linux_packages.html#RHEL-CentOS

sudo yum install yum-utils

检查yum源配置完成

yum makecache
yum repolist

安装Nginx

yum install nginx -y

检查已安装的nginx

nginx -V

启动nginx

nginx

Nginx程序结构

rpm -ql nginx
/etc/logrotate.d/nginx
# 日志切割(默认以天为单位)
/etc/nginx
# Nginx主程序存放路径
/etc/nginx/conf.d
# Nginx的自配置文件目录
/etc/nginx/conf.d/default.conf
# Nginx默认配置文件
/etc/nginx/fastcgi_params
# Nginx与PHP交互的内置变量
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
# 存放响应报文中回传的文件类型
/etc/nginx/modules
# 存放Nginx程序模块路径
/etc/nginx/nginx.conf
# Nginx主配置文件
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
# 存放uwsgi交互的内置变量
/etc/nginx/win-utf
/etc/sysconfig/nginx
# 启动Nginx参数
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacyactions/nginx/check-reload
/usr/libexec/initscripts/legacyactions/nginx/upgrade
/usr/sbin/nginx
# 二进制文件 调用控制Nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.18.0
/usr/share/doc/nginx-1.18.0/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
# Nginx默认存放网站源码的位置
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx
# 存放Nginx日志路径

Nginx配置文件详解

user nginx;
# 指定我们Nginx服务的运行用户
worker_processes 1;
# 定义Nginx的worker进程数量的
error_log /var/log/nginx/error.log warn;
# 指定Nginx错误日志
pid /var/run/nginx.pid;
# 指定Nginx PID进程号文件
events {
worker_connections 1024;
# 指定Nginx当前一个worker进程同时可以处理的最大连接数量
}
http {
include /etc/nginx/mime.types;
# 应用某文件中的内容
default_type application/octet-stream;
# 当Nginx无法识别当前访问页面内容时,出发下载动作
log_format main '$remote_addr -
$remote_user [$time_local] "$request" '
'$status $body_bytes_sent
"$http_referer" '
Nginx子配置文件(站点配置文件)
'"$http_user_agent"
"$http_x_forwarded_for"'; # 指定Nginx访
问日志格式的
access_log /var/log/nginx/access.log
main; # 定义Nginx访问
日志的位置
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
# 当Nginx建立TCP连接之后,多长时间没有动作,自动断开
#gzip on;
include /etc/nginx/conf.d/*.conf;
# 包含自配置文件路径下的所有以.conf结尾的文件
}

Nginx子配置文件(站点配置文件)

server {
listen 8080; # 指
定监听端口
server_name www.dameinv.com; # 指
定当前网站的访问域名
location / {
root /html/game; # 指
定代码位置
index index.html; # 指
定首页文件
}
}

http、server、location彼此之间的关系

http: 主要用于解决用户请求中的报文信息
server:用于配置一个具体的某个网站的响应操作的
location:用于匹配uri

由上至下包含关系

1. 响应区域模块要一一对应
2. 配置文件中所编写的每一条参数指令,一定要注意“;”结尾
3. 确保配置文件中所定义或应用的目录路径或文件,要与我们系
统中相对应
4. 注意手残症

Nginx部署多个站点,多实例

  • 编写Nginx自配置文件
  • 根据配置文件内容准备系统环境
  • 准备项目源码

1、编写配置文件

vim /etc/nginx/conf.d/demo.conf
server {
listen 80;
server_name www.demo.com;
root /html/demo;
index index.html;
}
nginx -t 语法检查
systemctl restart nginx 重载配置文件

如果域名不存在的话,为了实现域名访问你的效果做本地解
析(C:\Windows\System32\drivers\etc\hosts)

2、准备项目路径

mkdir /html/

3、在浏览器输入域名www.demo.com

Nginx处理访问请求原理

网站访问的方式:

1. 基于ip访问
2. 基于域名访问
3. 基于IP+端口
4. 基于域名+端口
  1. 浏览器输入域名:www.demo.com
  2. 浏览器将请求添加个协议
  3. 针对访问的域名进行解析(DNS解析:把域名解析成对应IP过程)
  4. 发起TCP连接请求,发送http请求报文
  5. 服务端中Nginx通过端口接收到http报文请求之后,通过报文中请求域名与自己配置文件中的server模块中的server_name 进行匹配
  6. 交由location模块匹配所请求的uri信息,根据响应规则进行处理
  7. 通过调用内核,又内核调用磁盘,取得响应资源,封装—》返回给用户

Nginx安全访问控(Modulengx_http_access_module)

官方地址:
http://nginx.org/en/docs/http/ngx_http_access_module.html#allow
应用场景:安全控制,敏感目录访问限制

allow 允许通过
deny 拒绝
allow ip all 网段 sock文件

以demo项目为例,访问/admin目录的只允许Windows本地
访问,其他全拒绝

location /admin {
allow 10.0.0.1;
deny all;
}

Nginx文件列表功(Modulengx_http_autoindex_module)

官方地址:http://nginx.org/en/docs/http/ngx_http_autoindex_module.html#autoindex
应用场景:镜像站、yum仓库

location /list {
	autoindex on;
}

安全认证模块(Modulengx_http_auth_basic_module)

应用场景:针对某些页面不予许随便访问,必须通过用户证才可以访问

location / {
	auth_basic "closed site";
	auth_basic_user_file conf/htpasswd;
}
#用户名密码文件格式: 用户名:密码
#借助于htpasswd加密工具,由httpd-tools 提供。
安装 htpasswd
yum install httpd-tools -y

Nginx配置安全认证

location /list {
	autoindex on;
	auth_basic "请输入用户名及密码";
	auth_basic_user_file
	/etc/nginx/htpasswd;
}

htpasswd工具使用方法

htpasswd -c 用户密码文件 用户名

htpasswd --help

Usage:
        htpasswd [-cimB25dpsDv] [-C cost] [-r rounds] passwordfile username
        htpasswd -b[cmB25dpsDv] [-C cost] [-r rounds] passwordfile username password

        htpasswd -n[imB25dps] [-C cost] [-r rounds] username
        htpasswd -nb[mB25dps] [-C cost] [-r rounds] username password
 -c  Create a new file.
 -n  Don't update file; display results on stdout.
 -b  Use the password from the command line rather than prompting for it.
 -i  Read password from stdin without verification (for script usage).
 -m  Force MD5 encryption of the password (default).
 -2  Force SHA-256 crypt() hash of the password (secure).
 -5  Force SHA-512 crypt() hash of the password (secure).
 -B  Force bcrypt aencryption of the password (very secure).
 -C  Set the computing time used for the bcrypt algorithm
     (higher is more secure but slower, default: 5, valid: 4 to 31).
 -r  Set the number of rounds used for the SHA-256, SHA-512 algorithms
     (higher is more secure but slower, default: 5000).
 -d  Force CRYPT encryption of the password (8 chars max, insecure).
 -s  Force SHA-1 encryption of the password (insecure).
 -p  Do not encrypt the password (plaintext, insecure).
 -D  Delete the specified user.
 -v  Verify password for the specified user.

Nginx服务状态模块(Modulengx_http_stub_status_module)

应用场景:结合监控服务进行实时监控,zabbix,nagios

stub_status; # 开启Nginx服务状态模块
location = /status/ {
	stub_status;
}
Active connections: 2 # 当前Nginx
并发访问连接数
accepts # 接受请求用
户的连接数(累加值)
handled # 处理请求了
的用户连接数(累加值)
requests # 发送请求报
文数量(累加值)
Reading: 0 # 正在读取的
请求报文数量(根据worker进程数判断)
Writing: 1 # 正在响应的
请求报文数
Waiting: 1 # 队列中等待
请求的数量 *****

Nginx中Location模块的核心配置

location模块:根据不同的uri信息匹配,分别根据不同的定义规则处理请求。
location模块的匹配模式

= 进行uri的精确匹配
~ 进行uri的模糊匹配(区分大小写)支持正则表达式
~* 进行uri的模糊匹配(不区分大小写)
^~ 进行uri的优先匹配 不支持正则表达式
优先级有高到底排序 = ^~ 其他

Alias别名操作

Linux操作系统中的alias:能够将某个命令定义不同的功能在Nginx中的alias:访问/a 但是实际访问的内容文件是在/b。
作用:实现代码目录结构变化了,但是访问原uri仍然能够访问到现有的变化的资源,且uri不变。
应用场景:代码目录结构变化了的项目

location /uri {
alias /new_uri;
}

配置网页跳转功能

  • return
    return code; 返回状态
    location ~ /test{
    	default_type application/json
    	return 200 "success";
    }
    
    return url;
    location ~ /test{
    	return http://www.xxx.com/status;
    }
    
  • rewrite
    应用场景:https跳转、针对seo的url优化(伪静态)、类似alias、安全
    rewrite跳转的模式
    break 将访问的uri信息进行直接跳转,不会重新发起连接请求
    last 当用户发送请求的时候,会重新让客户端根据新的uri,重新发起请求,匹配新的location规则了
    
    permanent 301 永久跳转 会将跳转过程保存在浏览器中
    redirect 302 临时跳转 不会保存跳转过程,每次跳转都是由服务器端进行控制的
    
    301 和302的应用场景
    302 需要经常变化跳转路径的uri则使用302
    301 基本不用变的跳转uri (http跳转https)(seoa.aliyun.com b.aliyun.com)
    
  • 针对SEO进行url优化及安全的策略(伪静态)
    背景:百度推广,针对url,针对url做伪静态化,
    伪静态:当用户通过一个看似静态的url访问网站,实际访问的是一个动态解析文件
    伪静态作用:
    1. 提高seo推广的效果
    2. 针对安全方面:
    	1. 将真实的目录位置进行伪装
    	2. 安全扫描软件扫描伪装
    
    改成我们想让用户访问的连接,
    http://www.blog.com/wp-admin/post.php?post=2&action=edit
    www.blog.com/wp-admin/edit/2/post.html
    location ~ /wp-admin/edit {
    rewrite /wp-admin/(.*)/(.*)/(.*).html
    /wp-admin/$3.php?$3=$2&action=$1 last;
    }
    
    伪静态在企业中应用思路:
    1. seo沟通,seo给出想要推广的url以及访问的什么页面
    2. 根据推广url和真实访问的页面的url进行rewrite改写拼接
    

HTTPS安全认证

http协议问题:

1. 明文传输,有被第三方截取到数据信息的风险 (加密处理)
2. 对于数据完整性:篡改数据(校验码)
3. 身份验证:无法确认发送者身份(密钥对)

证书
证书可以对身份进行验证,密钥对存在漏洞,黑客可以伪装为发送者,生成密钥对,发送给接受者。
引入第三方证书,证书通过加密算法对内容进行加密,并且证书可以明确的记录证书颁发机构的信息,证书使用者的相关信息,从而接受者接收到证书,对证书信息通过公钥进行验证,能够识别真实的发布者身份。

证书获取方式

通过官方机构购买证书
通过证书签发工具,自签证书。

Openssl工具
证书基于ssl协议来实现安全认证

在这里插入图片描述
Openssl自签发证书

证书包含的内容:

一对密钥对
颁发者和使用者信息
证书的相关信息

Openssl命令应用

yum install openssl -y
-in filename 指定要加密的文件的路径
-out filename 指定加密后的文件的存放位置
-salt 自动插入一个随机数到文件中
-e 指定加密算法
-d 解密算法

生成密钥对

(umask 077;openssl genrsa -out private.pem 4096)  # 生成私钥
openssl rsa -in private.pem -pubout -out key.pem  # 根据私钥生成对应公钥

生成自签证书

openssl req -new -x509 -key private.pem -out ca.crt -days 36500

在这里插入图片描述

Nginx配置HTTPS

server {
	listen 443 ssl;                                    #ssl协议端口443
	server_name www.demo.com;                          #服务名
	root /html/demo;                                   #目录
	index index.html;                                  #文件
	ssl_certificate /etc/nginx/pki/ca.crt;             #证书文件路径
	ssl_certificate_key /etc/nginx/pki/private.pem;    #私钥文件路径
}
server {
	listen 80;
	server_name www.demo.com;
	location / {
		rewrite (.*) https://www.demo.com/$uri redirect;
	}
}

Nginx反向代理部署

本机代理到本机

环境规划:

  • 访问www.test.com 80端口 —> 代理到后端 1314端口的
    站点
  • 本机部署www.test.com 1314端口站点

配置

server {
	listen 1314;
	server_name www.test.com;
	root /html/test;
	index index.html;
}

反向代理配置

server {
	listen 80;
	server_name www.test.com;
	location / {
		proxy_pass http://192.168.0.5:1314;
		proxy_set_header HOST $host; # 在代理过程中添加host头部信息
		proxy_http_version 1.1; # 指定代理请求的http协议版本
	}
}

实现代理服务器转发请求到web应用服务器

环境规划:

  • 代理服务监听80端口,www.test.com 代理到web服务器
  • web应用服务器 监听80端口,www.test.com

在这里插入图片描述

Nginx负载均衡

什么是负载均衡?
Load Balance(lb),指将工作任务进行分流,减轻单点压力,实现工作任务均摊到过个节点的操作。(实现集群化)负载均衡常见的实现方式:

  • 硬件:F5

  • 软件:

    • Nginx
    • LVS
    • HAproxy
  • 云厂商:

    • 阿里云:SLB
    • 腾讯云:CLB

负载均衡种类及特点

四层负载:

基于传输层进行端口转发,特点:传输速度快,抗压能力强

七层负载

基于应用层进行调度转发,特点:针对业务协议可以进行各种不同的调度策略,是应用的场景多,可以实现http请求的改写。

Nginx负载均衡实现

提供负载均衡功能的模块ngx_stream_upstream_module

语法结构

upstream backend {
	hash $remote_addr consistent;
	server backend1.example.com:12345weight=5;
	server backend2.example.com:12345;
	server unix:/tmp/backend3;
	server backup1.example.com:12345 backup;
	server backup2.example.com:12345 backup;
}
server {
	listen 12346;
	proxy_pass backend;
}

配置Nginx七层负载均衡

在这里插入图片描述

upstream game {
	#配置主机清单
	server 192.168.0.8;
	server 192.168.0.9;
}
server {
	listen 80;
	server_name www.game.com;
	location / {
		proxy_pass http://game;
		#通过方向代理调用主机组名
		include proxy_params;
	}
}

七层负载调度算法

调度策略作用
轮询调度默认调度算法,按照主机组顺序挨个调度
加权轮询调度分配个权重占比,调度时根据权重,述职越大的则调度转发越多
ip_hash根据请求的客户端ip进行取模,统一访问同一后端web(会话保持)
轮询调度默认调度算法,按照主机组顺序挨个调度
轮询调度默认调度算法,按照主机组顺序挨个调度
轮询调度默认调度算法,按照主机组顺序挨个调度

加权

upstream game {
	server 192.168.0.8 weight=5;
	server 192.168.0.9 weight=1;
}

ip_hash

upstream game {
	ip_hash;
	server 192.168.0.8;
	server 192.168.0.9;
}

管理后端web应用的调度状态

  • down 将某一个后端服务器下线
  • backup平时不给你调度,只剩下你可用时再调度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值