nginx的介绍
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,
nginx的简单配置
由于nginx的安装配置网上一堆教程,这里就不一一阐述了。
server {
server_name localhost;
listen 80; #监听的端口
location / { #location表示路径匹配
root /home; #root表示寻找文件夹的路径
index index.html index.htm; #index表示在root已经定义的文件夹下面的具体文件
}
}
#另一种写法
server {
server_name localhost;
listen 80;
root /home;
location / {
#try_files是表示寻找文件 $uri表示root已经定义的变量
#下面用来两个$uri是因为有时候html会引入其他css或者js文件,第一个$uri表示在当前文件夹下面寻找,第二个$uri表示精确找到html文件
try_files $uri $uri/ /index.html;
}
}
location用来匹配url地址,语法是:location [ = | ~ | ~* | ^~ ] uri{}
这里会有四种匹配规则:
=
该装饰符会精确匹配并终止搜索~
该装饰符使用区分大小写的正则表达式匹配~*
该装饰符使用不区分大小写的正则表达式匹配^~
该装饰符使用在不含正则表达式的uri前,当匹配成功以后,将不会再执行其他的正则表达式的location块
nginx的正反向代理概念
**正向代理:**假如你想翻墙出去看YouTube网站,众所周知国内IP是不能直接访问外网网站的,这个时候你就得挂一个vpn才能成功访问。在这里vpn的ip代理了你的国内ip,外网的这个网站也只认vpn的ip,只让vpn的ip通过,故vpn就是中间代理,只有经过成功代理才能正常访问到外网网站。
**反向代理:**现在假设用户是租户,服务器是房子,租户现在想要找一间房屋居住,这时租户就去找房屋中介的人租房屋,房屋中介的工作人员就帮租户去找房东租借房屋,但是租户并不认识房屋的房东是谁,他只认识房屋中介的人。
nginx的正向代理
建议拿两台服务器去测试,效果比较直观,现在我给服务器A设置正向代理,服务器B设置拦截,假设服务器A的IP地址是 1.1.1.1,服务器B的IP地址是2.2.2.2;
先来配置服务器A
server{
resolver 8.8.8.8;
listen 80;
server_name localhost 2.2.2.2;
location / {
proxy_pass http://$http_host$request_uri;
}
}
再去配置服务器B
server{
server_name localhost;
listen 80;
location / {
#注意这里if和括号中间有一个空 不然保存会报错
if ( $remote_addr !~* "1\.1\.1\.1" ){
return 403;
}
root html;
index index.html;
}
}
配置完成服务器A和B的nginx后,重启nginx服务 /usr/local/nginx/conf/nginx.conf -s reload
这里保存服务器B的时候可能会报错,修改保存的指令为 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
然后在本地去尝试访问服务器B的80端口,会返回一个403的错误页面,说明拦截已经成功了,再来验证正向代理成功了没,在geogle浏览器里下载一个扩展插件 Proxy SwitchySharp,把网页的代理手动设置为服务器A的IP和80端口,设置成功以后切换到服务器A的代理,再去访问服务器B的80端口发现访问成功了,说明正向代理已经成功!
nginx的反向代理
我只拿了我自己的服务器A测试,用pm2同时开了两个node后端服务(这里有一个小坑,第一次安装成功开启node服务,可能node端口打不开,也不能访问后台服务,但用npm指令能启动node服务,说明node项目没有问题,直接重启服务器再开启pm2监听就行了),端口号分别是4001和4002,我再拿4000端口拿去做反向代理。
server{
listen 4000;
server_name localhost;
location /a/{
proxy_pass http://localhost:4001/; #这里有个坑,node服务默认是给了/,这里也就需要带,否则将代理失败
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
#后台服务通过x-forward-for知道用户的实际IP
proxy_set_header X-Forward-For $proxy_add_x_forward_for;
}
location /b/{
proxy_pass http://localhost:4002/;
}
}
配置完成以后重启nginx服务,通过localhost:4000/a/可以访问到localhost:4001的node服务,通过localhost:4000/b/可以访问到localhost:4002的node服务,到这里反向代理配置成功!
nginx的负载均衡
顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。
使用nginx实现负载均衡需要proxy模块和upstream模块搭配实现,upstream将启用一个新的配置区域,在该区域定义了一组上游服务器。
#1.默认轮询
#每个请求按照时间顺序分别分配到其他后台服务器,如果设置down则表示服务器暂时停机不作使用
#设置backup则表示其他所有非backup状态的主机在down或者忙的时候才会访问这个backup状态的主机
#设置max_fails表示最大失败数,超过次数则暂时停机
#设置fail_timeout表示如果请求受理失败,则暂停指定的多少秒以后重新发起请求
upstream myserver{
server localhost:4001 down;
server localhost:4002 max_fails=3 fail_timeout=20s;
server localhost:4003 backup;
}
#####################################
#2.weight权重分配
#指定轮询几率,权重跟轮询几率成正比,用来解决服务器性能不均的问题
upstream myserver{
server localhost:4001 weight=3;
server localhost:4002 weight=5;
server localhost:4003 weight=3;
}
####################################
#3.ip_hash分配
#每个请求按照ip的hash分配,即每个用户都固定使用一个后台服务器,用来解决session不同的问题
upstream myserver{
ip_hash;
server localhost:4001;
server localhost:4002;
server localhost:4003;
}
#4.fair(第三方包,需要自己去下载配置)
#按后台服务器的响应时间来分配请求,响应时间少的优先分配
upstream myserver{
server localhost:4001;
server localhost:4002;
server localhost:4003;
fair;
}
server{
listen 80;
server_name localhost;
location / {
proxy_pass http://myserver;
}
}
nginx的静态加载文件
在服务器的文件夹里偶尔会存放文件、图片,这个时候想要在本地直接查看文件但是又不想登录服务器去看,就需要用nginx去静态加载文件。
server{
server_name localhost;
listen 80;
location /image/{
autoindex on; #打开自动列表
alias /home/image/; #将/image/映射到/home/image/文件夹
}
}
nginx的https配置
https是基于http协议的,使用SSL或TLS进行加密处理数据、验证对方身份和数据完整性保护。
- https里客户端(浏览器)向服务端发送信息,客户端用服务端的公钥加密,然后传输到服务端以后,服务端用私钥解密。
- 服务端向客户端发送信息,服务端通过私钥加密,然后传输到客户端,客户端再用服务端的公钥解密。
一般是需要申请CA的https证书的,我用的是aliyun的服务器,所以需要找aliyun去申请证书,
假设我已经申请证书成功了,证书分别是 /home/test.pem和/home/test.key,我的服务器备案网址是www.example.cn,现在开始配置nginx的https:
server {
server_name localhost www.example.cn example.cn;
listen 80;
listen [::]:80; #配置https2的ipv6地址
listen 443 ssl http2; #配置443端口监听https加密
listen [::]:443 ssl http2;
ssl_certificate /home/test.pem;
ssl_certificate_key /home/test.key;
ssl_session_cache shared:SSL:10m;#配置共享会话缓存大小
ssl_session_timeout 5m; #配置会话超时时间
add_header X-xss-Protection 1;#防止xss攻击
location / {
root /home;
index index.html;
}
}
1.保存的时候可能会提示ipv6模块无法配置,因为是aliyun咱不支持ipv6模块,可将 [::]:80
和[::]:443
还有后缀http2
删除掉。
2.保存的时候可能会遇到模块报错nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx
,这说明没有nginx没有开启ssl模块,再查看原有模块/usr/local/nginx/sbin/nginx -V
,会看到下面有一行是configure arguments
,如果看到没有http_ssl_modul
,则进入源码包cd /usr/local/src/nginx-1.11.3
,执行./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
,这时把nginx服务停止/usr/local/nginx/sbin/nginx -s stop
,再依次执行 make
和 make install
,再开启nginx服务./usr/local/nginx/sbin/nginx
就行了。
nginx优化配置
打包压缩文件
http{
gzip on; #开启gzip压缩输出
gzip_min_length 1k;#最小压缩文件大小
gzip buffers 4 16k;#压缩缓冲区
gzip_comp_level 9; #压缩的等级,数值为1-9的任意值,9是最慢但压缩比最大
#压缩的文本类型
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_disable "MSIE[1-6]\."; #IE6客户端以下禁用压缩
}
worker机制
每个worker就是一个独立的进程,但每个进程里只有一个主线程,通过异步非堵塞的方式来方式来处理请求,每个worker的线程可以发挥服务器的一个cpu,所以设置worker数和服务器的cpu数相等是最合适的,再设置worker_connection连接数,表示最大的并发数。假如每次服务器要占三个连接,那么最大并发量是worker_processes * woker_connection/3,假如设置了反向代理服务器,则最大并发量是worker_processes * woker_connection/6,因为每个并发会建立前端和后台的连接,占用两个连接。
http{
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000; #分配cpu块
pid logs/nginx.pid; #进程文件
worker_rlimit_nofile 1024; #一个nginx进程最多打开多少文件
events{
use epoll;#使用多路复用方式,提高nginx性能
worker_connection 1024; #单个process的最大并发量
}
}
如有错误或者缺漏,欢迎指出!