nginx的安装和nginx的几个作用

1.centerOs7上安装nginx

1.1 下载

// 要把ningx下载到linux下的哪目录
cd /usr/local/soft   

// 下载
wget http://nginx.org/download/nginx-1.18.0.tar.gz

1.2 解压

tar -xzvf nginx-1.18.0.tar.gz

1.3 安装依赖环境

gcc环境:基本运行环境
pcre:用于nginx的http模块解析正则表达式
zlib:用户进行gzip压缩
openssl:用于nginx https协议的传输

yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

1.4 编译安装

–prefix=/usr/local/soft/nginx 的意思是把nginx安装到/usr/local/soft/nginx
所以后面会有一个源码目录nginx-1.18.0,一个编译安装后的目录nginx

cd /usr/local/soft/nginx-1.18.0 ./configure --prefix=/usr/local/soft/nginx 
make && sudo make install
cd /usr/local/soft/nginx/

1.5 测试配置是否成功

/usr/local/soft/nginx/sbin/nginx -t -c /usr/local/soft/nginx/conf/nginx.conf

1.6启动Nginx

/usr/local/soft/nginx/sbin/nginx

浏览器输入192.168.1.104 (是linux的i地址)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PLQZP4bg-1610873801353)(C:\Users\张\AppData\Roaming\Typora\typora-user-images\1610866328637.png)]

1.7 copy vimfile

为了让VIM查看nginx配置文件时语法高亮,需要把相应文件copy到VIM目录。
先确定本机的vimfiles目录在哪个位置。

// 查找vimfiles放在哪里了
find / -name vimfiles
cd /usr/local/soft/nginx-1.18.0
cp -r contrib/vim/* /usr/share/vim/vimfiles/

1.8 nginx常用命令

nginx -s reopen #重启Nginx

nginx -s reload #重新加载Nginx配置文件,然后以优雅的方式重启Nginx

nginx -s stop #强制停止Nginx服务

nginx -s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务)

nginx -t #检测配置文件是否有语法错误,然后退出

nginx -?,-h #打开帮助信息

nginx -v #显示版本信息并退出

nginx -V #显示版本和配置选项信息,然后退出

nginx -t #检测配置文件是否有语法错误,然后退出

nginx -T #检测配置文件是否有语法错误,转储并退出

nginx -q #在检测配置文件期间屏蔽非错误信息

nginx -p prefix #设置前缀路径(默认是:/usr/share/nginx/)

nginx -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf)

nginx -g directives #设置配置文件外的全局指令

killall nginx #杀死所有nginx进程

2.nginx具体的使用

2.1 nginx实现虚拟主机

很多年前还没有阿里云,腾讯云的技术时候,现在有一台服务器,假如每个用户要在这台服务器下想申请一个私人的内存空间用。那这时候就可以使用ningx来实现这个需求。

自己windows机器上的hosts文件配置映射关系

C:\Windows\System32\drivers\etc

192.168.1.104 www.zzg.com www.wangaiai.com

所以在浏览器输入www.zzg.com 和www.wangaiai.com。 先通过hosts映射到了192.168.1.104就是nginx那台机器上。然后通过nginx上的ningx.conf的server_name,root自然就分配到了root指定的目录。这就是用户的私人空间 目录了。

#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  www.zzg.com;   # 用户输入www.zzg.com就可以映射到这了
  	root  /usr/local/soft/nginx/study_data/zzg;    #自动映射到了这个文件夹下
        #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;
        #}
    }
   server {
        listen       80;
        server_name  www.wangaiai.com;
	root	/usr/local/soft/nginx/study_data/wangaiai;
        #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;
    #    }
    #}
}

2.2 nginx实现反向代理

什么是反向代理?

反向代理是针对服务端的,客户端是把nginx当作服务端的,ningx又把请求发到了真实的服务端。

反向代理的ningx的配置

客户端192.168.1.104,输入这个ip,nginx配置文件中 的server_name,和listen自动映射到了nginx(192.168.1.104)的listen的80端口。又通过location 的proxy_pass转发到了真实的服务地址。 http://192.168.1.104:9096;这就是方向代理的实现。

#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; #监听80端口
        #server_name  localhost;
        server_name  192.168.1.104; 
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass  http://192.168.1.104:9096;
	    proxy_method  POST;
            proxy_set_header  Host $host;
            proxy_set_header  X-Real-IP $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        }

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

    }
  }

2.3 nginx实现负载均衡

客户端输入192.168.1.104 通过nginx的配置文件中的server_name,listen映射到了nginx这台nginx机器上,

这个请求又被代理到了http://ecif上,upstrem ecif上配置了服务列表。这样就实现了负载均衡。ecif是自己随便起的名字。

upstrem 模块默认算法是权重轮询。它还有一些其他的配置,如最大连接数量等。下面是具体使用的例子。

upstream ecif {
        server 192.168.44.1:12673 weight=2 max_fails=3 fail_timeout=15;
        server 192.168.44.1:12674 weight=3;
        server 192.168.44.1:12675 weight=1;
        server 192.168.44.1:12676 down;
        server 192.168.44.1:12676 backup;


    }

weight: 默认为1,weight值越大,负载的权重越大。比如上面配置的例子中分别为1 2 3.那么请求接受的比例就是

1/6 2/6 3/6。

max_conns:限制分配给某台Server的处理的最大的连接数量,超过这个配置的值,将不会分配给新的连接请求给它了。默认为0,表示不限制。

max_fails: 默认为1,某台Server允许请求失败的次数,超过这个次数后,在fail_timeout时间内,新的请求将不会分配给这个Server机器了。

fail_timeout: 默认为10秒,某台Server达到max_fail、设置的失败次数后,在fail_timeout期间内,nginx会认为这个Server暂时不可以用,这个期间内不会分配给新的请求过来了

backup: 其他所有非back_up的机器都是down状态,或者是都正在忙的时候,nginx会把请求分配到back_up这台机器上。

默认的负载均衡策略: 1.权重轮询,2.ip_hash(每次相同的客户端请求都会被nginx分配到这台指定的Server上。可以解决session问题。) 3.least_conn(最小连接数)当前活跃连接数越小,权重越大,越被nginx优先选择。

nginx的配置

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

    upstream ecif {
        fair;
        server 192.168.44.1:12673;
        server 192.168.44.1:12674;
        server 192.168.44.1:12675;
    }

    server {
        listen       80;
        server_name  192.168.1.104;
        location / {
            proxy_pass http://ecif;
        }
    }

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

}xxxxxxxxxx #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;    upstream ecif {        fair;        server 192.168.44.1:12673;        server 192.168.44.1:12674;        server 192.168.44.1:12675;    }    server {        listen       80;        server_name  localhost;        location / {            proxy_pass http://ecif;        }    }    # 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;    #    }    #}}11

2.4 nginx实现Http缓存

腾讯课堂上有个视频很多用户都要请求这个资源,那么所有的人都去请求,那么后端的压力就大了。可以通过nginx去解决这个问题,资源被访问一次就被缓存在nginx上指定的目录下了,这样其他的请求不会被代理到服务端去请求资源了。

nginx配置文件

#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 {
    #缓存路径/data/nginx/cache缓存结构为2层,即该路径下会有2层子目录,缓存文件会保存在最下层子目录
    #缓存的key会保存在名为web_cache的内存区域,该内存区域大小为50m
    #10分钟内缓存没有被访问就会过期
    #缓存文件最多占用1g空间
    proxy_cache_path /usr/local/soft/nginx/study_data/cache levels=1:2 keys_zone=qingshan_cache:50m inactive=10m max_size=1g;
    
    #include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        
        server_name  localhost;
        location / {
            proxy_pass http://192.168.1.104:9096;

            # 缓存使用前面定义的内存区域
            proxy_cache qingshan_cache;
            proxy_ignore_headers   Expires Set-Cookie;
            # 对于200和304的响应码进行缓存,过期时间为1分钟,这会覆盖前面定义的10分钟过期时间
            proxy_cache_valid 200 304 5m;
            # 设置缓存的key,这里用到了nginx的内嵌变量,表示用整个url作 key
            #proxy_cache_key  $scheme$proxy_host$request_uri;
            proxy_cache_key $host$uri$is_args$args;
            # 在返回的响应里添加响应头 X-Proxy-Cache,其值表示是否命中了缓存
            add_header X-Proxy-Cache $upstream_cache_status;

       }
       # 缓存清理配置
      # location ~ /purge(/.*){
           # allow all;
            #proxy_cache_purge qingshan_cache $host$1$is_args$args;
    }
}

如果这个视频有更新怎么办,在缓存没有过期时间请求的都是这个缓存的数据,那么都是旧的视频数据。

这时候需要通过ngx_cache_purge-2.3.tar.gz第三方的jar去解决这个问题。

2.5 nginx实现动静分离

资源分为动态资源和静态资源,如服务端的java这是动态资源,js,jpg,css(静态资源)等就是把资源分开,提高响应速度。可以把静态资源存储在nginx上,动态资源去服务端去请求。

user  root;
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;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  192.168.1.104;
        location / {
            #动态资源去这个服务端去请求
            proxy_pass http://192.168.1.104:9096;
        }
        
        # 以下静态资源都放在了root下面这个路径下,直接去这个目录下去取。不用去服务端去请求了。
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
            # 可以是本机目录页可以是其他服务器,proxy_pass
            root /usr/local/soft/nginx/study_data/static;
        }
    }
}

2.6 nginx实现数据压缩

实现了压缩功能,就可以把访问的资源压缩后给到浏览器。这样就节省了网络消耗及减少了带宽。

gzip on /off; 是否开启gzip压缩。

gzip_comp_level 3; 压缩等级,值是1到9,等级越高CPU消耗越高。设置在3~5较合适。

gzip_disable “MESI [ 1-6] \.” 针对不同客户端发起的请求进行有选择的打开或关闭gzip。禁止IE的6关闭gzip。

gzip_http_version 1.0; 启用压缩功能时,协议的最小版本,默认HTTP/1.1

gzip_buffers 32 4K| 16 8K #缓冲(压缩在内存中缓冲几块? 每块多大?)

gzip_min_length 200 # 开始压缩的最小长度(再小就不要压缩了,意义不在)

gzip_types text/plain application/xml # 对哪些类型的文件用压缩 如txt,xml,html ,css

gzip_vary on|off # 是否传输gzip压缩标志

nginx配置:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    gzip on;
    gzip_http_version 1.0;
    gzip_comp_level 3;
    gzip_types text/plain application/json application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_min_length 1k;

    server {
        listen       80;
        server_name  192.168.1.104;
        location / {
            proxy_pass http://192.168.1.104:9096;
        }
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
            root /usr/local/soft/nginx/study_data/static;
        }
    }
}

2.7 nginx实现跨域访问

什么是同域: 协议,域名(IP),端口都相同。任何一个不同就是不同域。

在浏览器中有个同源策略,一个域的文档或脚本不允许和另外一个域的资源数据进行交互。

浏览器A 访问服务B 服务B又在后台访问了服务C 服务C把数据发给了服务B ,服务B把数据又给了浏览器A。这时候就是跨域了,就违反了同源策略。

跨域的集中解决方案:

1.修改浏览器配置

2.前段改为JSONP请求,但是它只能解决get请求。

3.服务端C 的代码的Controller加上@CrossOrigin注解,他的原理是在http响应头中加了以下配置

Access-Control-Allow-Origin' '*';
        'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
        'Access-Control-Allow-Credentials' 'true';
  1. 服务端添加拦截器,为指定的http请求添加允许跨域的header
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

@Configuration
public class CORSConfiguration  {
   @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                //registry.addMapping("/time/**"); // 拦截方法中存在time名字的
                registry.addMapping("/**")
                        //.allowedOrigins("*") // 拦截所有的
                        .allowedOrigins("http://192.168.44.1:9096")// 拦截这个IP端口的
                        .allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS")
                        .allowCredentials(false).maxAge(3600);
            }
        };
    }
}

5.nginx配置的

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        # 添加请求头,解决跨域问题
        listen       80;
        server_name  localhost;

        location / {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With,X-Data-Type,X-Auth-Token';
            proxy_pass http://192.168.44.1:9097;
        }

    }

}