Nginx特性
- 高性能 处理高并发能力上很强
- 高扩展性 Nginx模块化,官方提供了多元化的模块。高可用性 三个999.9% 四个9 99.99%
- 热部署(版本平滑升级) 服务进行升级的同时,保证业务不宕机
- 应用场景非常多 代理、缓存、负载均衡、处理静态请求、动静分离、LNMP、LNMT、LNMU (Python)Uwsgi
Nginx安装部署
企业中安装Nginx,三种安装方式:
- 编译安装:根据源码,根据企业业务需求,需要什么功能,编译时添加什么模块,即可(私人定制),但是安装过程较为繁琐
- 自动化安装:配置好安装源,直接通过自动化安装工具安装即可
- 二进制安装:类似于绿色免安装版,编译安装好的程序封装起来的包。
编译安装
-
准备源码包上传并解压
-
预编译—>编译—>安装
准备依赖环境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. 基于域名+端口
- 浏览器输入域名:www.demo.com
- 浏览器将请求添加个协议
- 针对访问的域名进行解析(DNS解析:把域名解析成对应IP过程)
- 发起TCP连接请求,发送http请求报文
- 服务端中Nginx通过端口接收到http报文请求之后,通过报文中请求域名与自己配置文件中的server模块中的server_name 进行匹配
- 交由location模块匹配所请求的uri信息,根据响应规则进行处理
- 通过调用内核,又内核调用磁盘,取得响应资源,封装—》返回给用户
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; 返回状态
return url;location ~ /test{ default_type application/json return 200 "success"; }
location ~ /test{ return http://www.xxx.com/status; }
- rewrite
应用场景:https跳转、针对seo的url优化(伪静态)、类似alias、安全
rewrite跳转的模式break 将访问的uri信息进行直接跳转,不会重新发起连接请求 last 当用户发送请求的时候,会重新让客户端根据新的uri,重新发起请求,匹配新的location规则了
301 和302的应用场景permanent 301 永久跳转 会将跳转过程保存在浏览器中 redirect 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平时不给你调度,只剩下你可用时再调度