概述
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,
其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
基础概念
代理
所谓代理就是一个代表、一个渠道
涉及到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户。
正向代理
在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们。
上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
反向代理
多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
反向代理 在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂拥而入时,会造成服务器忙不过来的局面,可以使用多个服务器来共同分担成千上万的用户请求,这些服务器提供相同的服务,对于用户来说,根本感觉不到任何差别。在服务器端接受客户端的请求,然后把请求分发给具体的服务器进行处理,然后再将服务器的响应结果反馈给客户端。
负载均衡
负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。
策略:
- 轮询策略(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2. weight 权重轮询策略
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3. ip_hash 客户端 ip 绑定
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4. fair(第三方)最快响应时间策略
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5. url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
6. least_conn 最小连接数策略
将请求优先分配给压力较小的服务器,它可以平衡每个队列的长度,并避免向压力大的服务器添加更多的请求。
安装
源码安装
本例以Ubuntu18.04为例
在安装Nginx之前,需要安装如下(gcc/pcre/zlib/openssl)插件
1 查看gcc是否安装
$dpkg -l | grep gcc
复制代码
如果看到有 libgcc-5-dev 就ok,没有就装一下
如果没有,按照以下步骤安装
$apt-get install build-essential
复制代码
2 查看pcre是否安装
$dpkg -l | grep pcre
复制代码
如果没有,按照以下步骤安装
$apt-get install libpcre3 libpcre3-dev
复制代码
3 查看openssl是否安装
$dpkg -l | grep openssl
复制代码
如果没有,按照以下步骤安装
$apt-get install openssl libssl-dev
复制代码
4 查看zlib是否安装
$dpkg -l | grep zlib
复制代码
如果没有,按照以下步骤安装
$apt-get install zlib1g-dev
复制代码
5 下载Nginx安装包
到该网址下找最新的安装包,nginx.org/download/
$cd /usr/local #这个安装地址随便找个地方放就好,个人习惯
$wget http://nginx.org/download/nginx-1.15.10.tar.gz
复制代码
6 安装Nginx
$tar -zxvf nginx-1.15.10.tar.gz
$cd nginx-1.15.10
$./configure
$make
$make install
复制代码
7 查看Nginx配置文件是否合法
$cd /usr/local/nginx/sbin
$./nginx -t
#或者在第8点启动的时候加上 -t 参数
复制代码
8 启动Nginx
$/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#nginx安装目录地址 -c nginx配置文件地址
#或者
$/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
复制代码
9 查看是否启动
$ps -ef|grep nginx
复制代码
10 停止Nginx
$kill 13387 #master的pid
复制代码
11 重启Nginx
$cd /usr/local/nginx/sbin
$./nginx -s reload
#或
$kill -hup 13387
复制代码
12 查看nginx默认html,端口看/usr/local/nginx/conf/nginx.conf,默认80。默认html放在/usr/local/nginx/html下
apt安装
1 apt指令安装
$apt-get install nginx
复制代码
2 安装到哪些目录下
#可执行文件
$cd /usr/sbin
#配置文件
$cd /etc/nginx
#日志文件
$cd /var/log/nginx
复制代码
3 启动Nginx,自动加入systemd
$systemctl start nginx.service
复制代码
配置参数
配置项有很多,目前只是看点基础的,之后再慢慢详细化,以及根据场景应用去配置相关参数。
默认配置
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#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;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
复制代码
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
复制代码
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。
6、upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
以kvp-mps nginx.cong-location配置为例
配置根目录 ‘/’ 到index.html页面,前端配置的根目录会直接到登录页面
配置文件目录 ‘/’ 到 ‘/data/kvp-mps’ 下,因为前端有些上传文件和下载文件的功能,所以要配置下载目录
location / {
root /home/kst/kvp-mps/web;
index index.html index.htm;
try_files $uri $uri/ /index.html;
if ($request_filename ~* ^.*?\.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|tar|pptx)$){
add_header Content-Disposition: 'attachment;';
}
}
location /data/ {
alias /data/kvp-mps/;
}
复制代码
部分常用配置
下面是nginx
一些配置中常用的内置全局变量,你可以在配置的任何位置使用它们。
变量名 | 功能 |
---|---|
$host | 请求信息中的Host ,如果请求中没有Host 行,则等于设置的服务器名 |
$request_method | 客户端请求类型,如Get 、Post |
$remote_addr | 客户端的IP 地址 |
$args | 请求中的参数 |
$content_length | 请求头中的Content-length 字段 |
$http_user_agent | 客户端agent 信息 |
$http_cookie | 客户端cookie 信息 |
$remote_addr | 客户端的IP 地址 |
$remot_port | 客户端的端口 |
$server_protocol | 请求使用的协议,如HTTP/1.0 、HTTP/1.1 |
$server_addr | 服务器地址 |
$server_name | 服务器名称 |
$server_port | 服务器的端口号 |
解决跨域
跨域的定义
同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。通常不允许不同源间的读操作。
同源的定义
如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。
URL | 结果 | 原因 |
---|---|---|
http://域名/dir2/other.html | 成功 | |
http://域名/dir/inner/another.html | 成功 | |
https://域名/dir2/other.html | 失败 | 不同协议(https 和http ) |
http://域名:81/dir2/other.html | 失败 | 不同端口(81 和80 ) |
http://另一个域名/dir2/other.html | 失败 | 不同域名 |
nginx 解决跨域的原理
server {
listen 80;
server_name 前端域名/IP;
# 匹配以/kst/开头的请求
location /kst/ {
proxy_pass 后端域名/IP/;
}
}
复制代码
将访问前端域名的请求代理回后端域名,对前端来说是在访问本域名,会被视为同源访问,而nginx
的转发前端不会知道
注意后端域名后面要加/
,这样代理后才会直接在请求路径前拼接上后端域名也即请求后端域名+请求路径
,否则会请求到后端域名+前端路径+请求路径
请求过滤
状态码过滤
error_page 500 501 502 503 504 506 /50x.html;
location = /50x.html {
# 将跟路径改编为存放 html 的路径。
root /root/static/html;
}
复制代码
URL过滤
根据 URL 名称过滤,精准匹配 URL,不匹配的 URL 全部重定向到主页。
location / {
rewrite ^.*$ /index.html redirect;
}
复制代码
请求类型过滤
if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
return 403;
}
复制代码