一.简介
Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。
所谓的反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
二.为什么选择Nginx
- I/O多路复用
I/O多路复用就是多个描述符的I/O操作,可以在一个线程内并发,交替地顺序完成,这就叫I/O多路复用,IO多路复用实现方式select,poll,epoll。epoll效率更高。 - 轻量级
功能模块少 代码模块化 - CPU亲和
Cpu亲和是一种把Cpu亲和和Nginx工作进程绑定方式,把每个worker进程固定在一个cpu上执行,减少切换cpu的cache miss,以此获得更好的性能。 - Sendfile
Sendfile 函数让两个文件描写叙述符之间直接传递数据(全在内核中操作,传送),从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝,操作效率非常高,被称之为零拷贝。
轻量级 功能模块少 代码模块化
三.安装Nginx
环境:Centos7
- 安装必要环境
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
yum -y install wget httpd-tools vim
- 关闭iptable,防火墙
iptables -F
iptables -t nat -F
setenforce 0
- 在
/etc/yum.repos.d/nginx.repo
添加仓库。
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
- 安装
yum install nginx
- 查看配置参数以及模块
nginx -V
- 查看配置文件
nginx -t
7.Location匹配(优先级由上至下)
= :进行普通字符精确匹配,也就是完全匹配
^~: 表示普通字符匹配,使用前缀匹配
~(区分大小写) ~*(不区分大小写):表示执行一个正则匹配
访问Nginx官方网站http://nginx.org/en/linux_packages.html#stable 查看Nginx的安装方法
各类配置参数可以参考官方文档http://nginx.org/en/docs/
四.常见Nginx中间架构
静态资源WEB服务
- 设置浏览器缓存
- 防盗链
- 跨域控制
#以下配置代表允许来自于百度请求
add_header Access-Control-Allow-Origin http://www.baidu.com
add_header Access-Allow-Method GET,POST,PUT,DELETE,OPTIONS
代理服务
实现
使用的都是proxy_pass
语法,正向代理访问外网,反向代理访问内部服务器
PS:访问域名的时候还需要配置DNS解析:resolver 8.8.8.8
正向代理与反向代理的区别
位置不同
正向代理,架设在客户机和目标主机之间;
反向代理,架设在服务器端;
代理对象不同
正向代理,代理客户端,服务端不知道实际发起请求的客户端;
反向代理,代理服务端,客户端不知道实际提供服务的服务端;
负载均衡调度器SLB
1.GSLB
2.SLB
四层负载均衡,七层负载均衡
基本语法:
使用的都是upstream param
语法
upstream test{
server 192.168.15.129:8080;
server 192.168.15.129:8081;
server 192.168.15.129:8082;
}
其他参数:
weight:权重参数
down:当天服务不参与负载均衡
backup:预留的备份服务器
max_fails:允许请求失败的次数
fail_timeout:经过最大失败后,服务暂停的时间
max_conns:限制最大的接受的连接数
调度算法:
轮询:按时间顺序逐一分配
加权轮询:按设置的weight分配
ip_hash:按请求的IP的HASH结果分配,这样同一个IP固定访问到同一台后端服务器,开启在upstream中加入ip_hash
即可。
url_hash:按URL的HASH结果分配,同一个URL定向到同一台后台服务器,开启在upstream中加入hash $request_uri
即可。
least_conn:最少链接数,那个机器连接数少就分发
hash关键值:hash自定义的key
- 动态缓存
try_files
语法
try_files $uri $uri/ /index.php
作用
依次匹配文件是否存在
Alias和Root的区别
location /request_path/image/{
alias /local_path/image/;
}
http:/localhost/request_path/image/cat.png - > /local_path/image/cat.png
location /request_path/image/{
root /local_path/image/;
}
http:/localhost/request_path/image/cat.png - > /local_path/image/request_path/cat.png
Rewrite
语法
rewrite regex replacement flag
作用
1.Url访问跳转
2.SEO优化,优化路径
3.维护
4.安全(伪静态页面)
flag
last:停止rewrite检测,新建请求。
break:停止rewrite检测,到root下查找。
redirect:返回302临时重定向,地址栏会显示跳转后的地址
permanent:返回301永久重定向,地址栏会显示跳转后的地址,即使源站服务停止了,也会继续重定向。
示例
以下的作用是把nginx.org改写为www.nginx.org;
server{
listen 80;
server_name nginx.org;
rewrite ^ http://www.nginx.org$request_uri?;
}
server{
listen 80;
server_name www.nginx.org;
}
动静分离
动静分离就是把动态资源和静态资源分开请求。静态资源直接请求,动态资源访问tomcat。
upstream java_api{
server 127.0.0.1:8080;
}
location ~ \.jsp$ {
proxy_pass http://java_api;
index index.html index.htm
}
location ~ \.(jpg|png|gif)$ {
expires 1h;
gzip on;
}
Geoip模块
所谓GeoIP,就是通过来访者的IP,定位他的经纬度,国家/地区,省市,甚至街道等位置信息。
- 安装模块
yum install nginx-module-genip
- 下载数据库
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
- 修改nginx.conf添加模块加载
load_module "modules/ngx_http_geoip_module.so";
load_module "modules/ngx_stream_geoip_module.so";
- conf添加应用
geoip_country /opt/work/GeoIP.dat;
geoip_city /opt/work/GeoLiteCity.dat;
upstream bz.coder.com{
server localhost;
}
server {
listen 80;
server_name localhost;
location /myip {
default_type text/plain;
return 200 "$remote_addr $geoip_country_name $geoip_country_code $geoip_city";
}
配置Https服务
1.生成密钥和CA证书
- 生成key密钥
确认安装openssl,输入openssl genrsa -idea -out ssl.key 1024
,生成过程中还会让你输入一个密码,生成完毕后会生成ssl.key文件。 - 生成证书签名请求文件(csr文件)
输入openssl req -new -key ssl.key -out sslkey.csr
生成csr文件,按照提示输入相关信息之后会生成csr证书签名请求文件。 - 生成证书签名文件(CA文件)
对于公司,将生成的key文件以及csr文件发送给相应的签名机构生成CA文件。
对于个人,openssl x509 -req -days 3650 -in sslkey.csr -signkey ssl.key -out sslkey.crt
即可打包生成CA文件,期间要输入之前key所对应的密码。
2.Nginx端配置
- 添加以下三行:
listen 443 ssl
ssl_certificate +证书路径
ssl_certificate _key + Key文件路径
- 添加后重新运行,输入
netstat -luntp|grep 443
查看443端口是否在始终中。 - 如果没有netstat工具,先安装
yum install net-tools
- 接下来就可以通过HTTPS访问我们的页面
3.优化HTTPS服务
- 激活keepalive长连接,添加
keepalive_timeout 100;
- 设置ssl session缓存,添加
ssl_session_cache shared:SSL:10m;
,ssl_session_timeout 10;
4.配置苹果要求的后台HTTPS服务
作为苹果后台,需要满足以下要求
- openssl版本大于1.0.2
- HTTPS证书必须使用SHA256以上哈希签名算法
- HTTPS证书必须使用RSA 2048位或ECC 256位以上的公钥算法
- 使用前向加密技术
openssl x509 -noout -text -in /etc/nginx/ssl_key/sslkey.crt
查看加密类型信息
Nginx性能优化
worker_processes
设置使用CPU数目,一般设置和CPU数目一致即可。
worker_cpu_affinity auto
自动分配CPU