Nginx 是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及IMAP / POP3代理服务器。 Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。很多高知名度的网站都使用 Nginx,如:Netflix,GitHub,SoundCloud,MaxCDN 等。
一、反向代理
先说说正向代理。我们常说的代理也就是只正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,某些科学上网工具扮演的就是典型的正向代理角色。用浏览器访问http://www.google.com 时,被残忍的block,于是你可以在国外搭建一台代理服务器,让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。


二、安装nginx
-
- 去官网http://nginx.org/下载对应的nginx包,推荐使用稳定版本
-
- 上传nginx到linux系统
-
- 安装依赖环境
(1)安装gcc环境
yum install gcc-c++
(2)安装PCRE库,用于解析正则表达式
yum install -y pcre pcre-devel
(3)zlib压缩和解压缩依赖
yum install -y zlib zlib-devel
(4)SSL 安全的加密的套接字协议层,用于HTTP安全传输,也就是https
yum install -y openssl openssl-devel
-
- 解压,需要注意,解压后得到的是源码,源码需要编译后才能安装 tar -zxvf nginx-1.16.1.tar.gz
-
- 编译之前,先创建nginx临时目录,如果不创建,在启动nginx的过程中会报错 mkdir /var/temp/nginx -p
-
- 在nginx目录,有个configure的文件,这是默认的安装配置,如果要自定义,要生产Makefile。


- 7.make编译
make
- 8.安装
make install
- 9.这时候默认会安装到/usr/local/nginx。看下相关目录

conf是相关的nginx配置,html是静态页面相关的,sbin是相关的二进制文件,用来启动nginx
进入sbin目录启动nginx
./nginx
停止./nginx -s stop
重新加载nginx相关 ./nginx -s reload
默认是80端口,访问就行了。
三、nginx的进程模型
master进程:主进程,管理、监控worker进程,也会分发信号给worker进程,比如./nginx -s reload等。。
worker进程:工作进程,为master进程服务,可以有多个。
在nginx.conf中可以修改worker数量,默认为1
worker_processes 2;
我们看到nginx的进程就会变成三个

nginx的master会fork出多个worker进程,每个进程都会通过抢占机制来处理请求 先打开accept_mutex选项,只有获得了accept_mutex的进程才会去添加accept事件。nginx使用一个叫ngx_accept_disabled的变量来控制是否去竞争accept_mutex锁。也就是多路复用IO模型机制epoll,这也是nginx高性能的原因。
四、nginx配置文件
nginx.conf 文件的结构
- events: 配置工作模式和连接数
- http: http模块相关配置
- server: 虚拟主机配置,可以有多个
- location:路由规则,表达式
- upstream:集群,内网服务器,负载均衡
- server: 虚拟主机配置,可以有多个
1.global(nginx运行相关)
配置运行 nginx 服务器用户
user nobody nobody;
配置允许生成的 worker process 数
worker_processes auto; worker_processes 4;
这个数字一般和cpu数量一致,如果有其他中间件的话,可以设置n-1数量
配置错误日志的存放路径
error_log logs/error.log; error_log logs/error.log error;
可以设置日志级别
配置 nginx 进程 PID 存放路径
pid logs/nginx.pid;
gzip压缩输出,提高网络效率
gzip on;
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认 1.1,前端如果是 squid2.5 请使用 1.0)
gzip_comp_level 2; #压缩等级,gzip 压缩比,1 为最小,处理最快;9 为压缩比最大,处理最慢,传输速度最快,也最消耗 CPU;
gzip_types text/plain application/x-javascript text/css application/xml;
这里面保存的就是一个数字,nginx master 进程的进程号
2.event
与用户的网络连接相关的 events
events {
# 默认是使用epoll,也是nginx高性能的关键,io多路复用
use epoll;
# worker进程最大连接数
worker_connections 1024;
}
3.http(针对http网络传输的一些指令配置)
include和MIME-Type
include mime.types;
default_type application/octet-stream;
include可以引入外部的文件,通常我们有多个虚拟主机需要管理时,可以写多个server的配置,然后通过这种方式引入配置,方便管理。mime.types里主要是定义了一堆网络请求的方式和类型,default_type为默认的请求类型。
自定义服务日志access.log
# 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; access_log off;
nginx的日志格式和一些请求日志信息都在这里
配置允许 sendfile 方式传输文件和tcp_nopush
sendfile off;
sendfile on; sendfile_max_chunk 128k;
tcp_nopush on;
nginx 每个 worker process 每次调用 sendfile() 传输的数据量的最大值,tcp_nopush设置为on会在数据包到达一定大小才传输,提升效率。
配置连接超时时间
keepalive_timeout 75s 65s;
与用户建立连接后,nginx 可以保持这些连接一段时间,默认 75s 下面的 65s 可以被 Mozilla/Konqueror 识别,是发给用户端的头部信息Keep-Alive值
单连接请求数上限
keepalive_requests 100;
和用户端建立连接后,用户通过此连接发送请求;这条指令用于设置请求的上限数
server
server {
# 监听的端口
listen 80;
# 域名或者ip地址
server_name localhost;
# 路由地址
location / {
# 根路径,这里是在nginx的html文件,后面加上路由地址
# 该上级目录下要含有和 location 后指定名称的同名目录才行,末尾“/”加不加无所谓
root html;
# 设置首页
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
alias可以设置别名
server{
#访问/staic路径则是访问html目录下资源
location /static {
alias /html
}
}
location的匹配规则
空格 :默认匹配,普通匹配
location / {
root /home;
}
= :精确匹配
location = /zcq/img/face1.png {
root /home;
}
~* :匹配正则表达式,不区分大小写
#符合图片的显示
location ~* \.(GIF|jpg|png|jpeg) {
root /home;
}
~ :匹配正则表达式,区分大小写
#GIF必须大写才能匹配到
location ~ \.(GIF|jpg|png|jpeg) {
root /home;
}
^~ :以某个字符路径开头
location ^~ /zcq/img {
root /home;
}
nginx的跨域配置
常用的解决跨域问题有jsonp,springboot配置处理和nginx处理。
#允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
#允许请求的header
add_header 'Access-Control-Allow-Headers' *;
nginx静态资源防盗链
#对源站点验证
valid_referers *.zhanchaoqun.com;
#非法引入会进入下方判断
if ($invalid_referer) {
return 404;
}
nginx负载均衡
请求会分发到两台tomcat上
server {
listen 80;
server_name 111.231.64.120;
location / {
root html;
index index.html index.htm;
#代理地址
proxy_pass http://111.231.64.120;
}
}
upstream 111.231.64.120{
#默认是轮询。这里为权重
server 111.231.64.120:8088 weight=1;
server 111.231.64.120:8080 weight=1;
}