聊聊nginx

219 阅读4分钟

Nginx 是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及IMAP / POP3代理服务器。 Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。很多高知名度的网站都使用 Nginx,如:Netflix,GitHub,SoundCloud,MaxCDN 等。

一、反向代理

先说说正向代理。我们常说的代理也就是只正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,某些科学上网工具扮演的就是典型的正向代理角色。用浏览器访问http://www.google.com 时,被残忍的block,于是你可以在国外搭建一台代理服务器,让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。

反向代理隐藏了真实的服务端,当我们请求 www.baidu.com 的时候,就像拨打10086一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡

二、安装nginx

    1. 去官网http://nginx.org/下载对应的nginx包,推荐使用稳定版本
    1. 上传nginx到linux系统
    1. 安装依赖环境

(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
    1. 解压,需要注意,解压后得到的是源码,源码需要编译后才能安装 tar -zxvf nginx-1.16.1.tar.gz
    1. 编译之前,先创建nginx临时目录,如果不创建,在启动nginx的过程中会报错 mkdir /var/temp/nginx -p
    1. 在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:集群,内网服务器,负载均衡

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;
    }