東川印記

一本東川,笑看爭龍斗虎;寰茫兦者,度橫佰昧人生。

简单学习Nginx

2022年6月30日星期四



Nginx是一个高性能Web服务器、反向代理服务器、邮件代理服务器。

只能处理静态资源。

内存少,并发强。高性能、低系统资源消耗。

基于C语言编写。

主要用于 静态网站部署、负载均衡、静态代理、动静分离、虚拟主机。


查看网站使用的Server

请求网站,查看GET根路径,查看响应头中Server项

如taobao使用  server: Tengine

163显示的是AliyunOSS

google显示gws

百度显示bws/1.1

qq显示squid/3.5.24

没找到一个直接用Nginx的。。。。

nginx官网用的是 cloudflare-nginx

nginx客户第一个adobe用的是Apache。。。。


反向代理Reverse Proxy。以代理服务器接网络上请求,请求转发内部网络服务器,并将服务器结果返回给网络请求。

浏览器 -> Nginx -> tomcat 返回 -> Nginx -> 浏览器

正向代理,即跳板,代理访问外部资源。如VPN。

1,安装

https://nginx.org/en/download.html

https://nginx.org/download/nginx-1.20.2.tar.gz

解压

[senrsl@localhost nginx]$ tar -zxvf nginx-1.20.2.tar.gz

编译环境

[senrsl@localhost nginx-1.20.2]$ sudo yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y

编译

[senrsl@localhost nginx-1.20.2]$ ./configure --prefix=/home/senrsl/nginx/out    //安装的目标目录

。。。

checking for zlib library ... found
creating objs/Makefile

Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + using system zlib library

  nginx path prefix: "/home/senrsl/nginx/out"
  nginx binary file: "/home/senrsl/nginx/out/sbin/nginx"
  nginx modules path: "/home/senrsl/nginx/out/modules"
  nginx configuration prefix: "/home/senrsl/nginx/out/conf"
  nginx configuration file: "/home/senrsl/nginx/out/conf/nginx.conf"
  nginx pid file: "/home/senrsl/nginx/out/logs/nginx.pid"
  nginx error log file: "/home/senrsl/nginx/out/logs/error.log"
  nginx http access log file: "/home/senrsl/nginx/out/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

[senrsl@localhost nginx-1.20.2]$

编译安装

[senrsl@localhost nginx-1.20.2]$ make

[senrsl@localhost nginx-1.20.2]$ make install

安装目标目录应该是 /usr/local/nginx,不然还得配环境变量。。。。

[senrsl@localhost nginx-1.20.2]$ ll /usr/local/nginx/
总用量 4
drwxr-xr-x. 2 root root 4096 6月  29 02:36 conf
drwxr-xr-x. 2 root root   40 6月  29 02:36 html
drwxr-xr-x. 2 root root    6 6月  29 02:36 logs
drwxr-xr-x. 2 root root   19 6月  29 02:36 sbin
[senrsl@localhost nginx-1.20.2]$

安装完成。

2,启动关闭重启

[senrsl@localhost out]$ sudo ./sbin/nginx

[root@localhost out]# ps -ef | grep nginx
nobody    14772      1  0 03:36 ?        00:00:00 nginx: worker process
root      14825  14786  0 03:42 pts/7    00:00:00 grep --color=auto nginx
[root@localhost out]# kill -9 14772

[root@localhost out]# ./sbin/nginx -c conf/nginx.conf
[root@localhost out]# ps -ef | grep nginx
root      15036      1  0 04:28 ?        00:00:00 nginx: master process ./sbin/nginx -c conf/nginx.conf
nobody    15037  15036  0 04:28 ?        00:00:00 nginx: worker process
root      15039  14786  0 04:28 pts/7    00:00:00 grep --color=auto nginx
[root@localhost out]#

[root@localhost out]# ps -ef | grep nginx
root      15036      1  0 04:28 ?        00:00:00 nginx: master process ./sbin/nginx -c conf/nginx.conf
nobody    15037  15036  0 04:28 ?        00:00:00 nginx: worker process
root      15039  14786  0 04:28 pts/7    00:00:00 grep --color=auto nginx
[root@localhost out]# kill -QUIT 15036    //等待处理请求完成后关闭
[root@localhost out]# ps -ef | grep nginx
root      15048  14786  0 04:31 pts/7    00:00:00 grep --color=auto nginx
[root@localhost out]#

[root@localhost out]# ./sbin/nginx -c conf/nginx.conf
[root@localhost out]# ps -ef | grep nginx
root      15056      1  0 04:32 ?        00:00:00 nginx: master process ./sbin/nginx -c conf/nginx.conf
nobody    15057  15056  0 04:32 ?        00:00:00 nginx: worker process
root      15059  14786  0 04:32 pts/7    00:00:00 grep --color=auto nginx
[root@localhost out]# kill -TERM 15056   //不管请求是否完成,直接关闭
[root@localhost out]# ps -ef | grep nginx
root      15063  14786  0 04:33 pts/7    00:00:00 grep --color=auto nginx
[root@localhost out]#

[root@localhost out]# ./sbin/nginx -c conf/nginx.conf
[root@localhost out]# ./sbin/nginx -s reload  //重启
[root@localhost out]# 

启动后一直报403,然后测试发现启动/usr/local/nginx路径就正常。。。。

3,配置检查

[root@localhost out]# ./sbin/nginx -c conf/nginx.conf -t
nginx: the configuration file /home/senrsl/nginx/out/conf/nginx.conf syntax is ok
nginx: configuration file /home/senrsl/nginx/out/conf/nginx.conf test is successful
[root@localhost out]#

4,版本信息

[root@localhost out]# ./sbin/nginx -v
nginx version: nginx/1.20.2
[root@localhost out]# ./sbin/nginx -V
nginx version: nginx/1.20.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments: --prefix=/home/senrsl/nginx/out
[root@localhost out]#


5,配置文件 nginx.conf


#配置worker进程运行用户 nobody也是一个linux用户,一般用于启动程序,没有密码
user  nobody; 
#配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
worker_processes  1; 

#配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error
error_log  logs/error.log; 
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;  #配置进程pid文件


###====================================================


#配置工作模式和连接数
events {
    worker_connections  1024;  #配置每个worker进程连接数上限,nginx支持的总连接数就等于worker_processes * worker_connections
}

###===================================================


#配置http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型
    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日志及存放路径,并使用上面定义的main日志格式
    #access_log  logs/access.log  main;

    sendfile        on;  #开启高效文件传输模式
    #tcp_nopush     on;  #防止网络阻塞

    #keepalive_timeout  0;
    keepalive_timeout  65;  #长连接超时时间,单位是秒

    #gzip  on;  #开启gzip压缩输出
   
    ###-----------------------------------------------
   

    #配置虚拟主机
    server {
        listen       80;  #配置监听端口
        server_name  localhost;  #配置服务名

        #charset koi8-r;  #配置字符集

        #access_log  logs/host.access.log  main;  #配置本虚拟主机的访问日志

    #默认的匹配斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
        location / {
        #root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
            root   html; 
        #配置首页文件的名称
            index  index.html index.htm; 
        }       

        #error_page  404              /404.html;  #配置404页面
        # redirect server error pages to the static page /50x.html
        #error_page   500 502 503 504  /50x.html;  #配置50x错误页面
       
    #精确匹配
    location = /50x.html {
            root   html;
        }

        #PHP 脚本请求全部转发到Apache处理
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        #PHP 脚本请求全部转发到FastCGI处理
        # 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;
        #}

        #禁止访问 .htaccess 文件
        # 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服务,安全的网络传输协议,加密传输,端口443,运维来配置
    #
    # 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;
    #    }
    #}
}


6,部署ace静态资源

[root@localhost nginx]# mv /home/senrsl/nginx/ace /opt/ace

配置文件增加

        location / {
            root   html;
            index  index.html index.htm;
        }

        location /ace {
            root   /opt;
            index  login.html index.html index.htm;
        }

重启

[root@localhost nginx]# ./sbin/nginx -s reload

访问

http://192.168.0.121/ace/


7,负载均衡

硬件负载均衡器,F5、Array、深信服等。

软件负载均衡,Nginx、HVS、HAProxy等。

1)部署两个tomcat到服务器

需要修改conf.xml中默认端口

一个默认为 8080、8005、8009

第二个改成 8081、8006、8019

[senrsl@localhost apache-tomcat-8.5.81]$ vi webapps/examples/index.html

增加端口号

代理目标为 http://192.168.0.121:8080/examples/

启动即可。

2)nginx配置代理指向两个tomcat

    upstream www.tomcat.com {    //网址目标
        server 192.168.0.121:8080;
        server 192.168.0.121:8081;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /examples {
            proxy_pass http://www.tomcat.com;  //代理网址
        }


3) 测试,默认轮询两个tomcat。

http://192.168.0.121/examples/

依次展示 8081、8082页面。


8,负载均衡策略

四种策略

1)轮询

需要性能一致,不然会导致消息堆积。

2)权重策略

server 后面加 weight=权重值如5

性能不一致时,可以配权重。

    upstream www.tomcat.com {
        server 192.168.0.121:8080 weight=2;
        server 192.168.0.121:8081 weight=1;
    }

3)最小连接数

least_conn

那个服务器不忙,就发给哪个。

4)ip_hash

以上三种策略都会存在session丢失问题

ip_hash也叫ip绑定,每个请求按访问ip的hash值分配,这样每个请求客户端会固定访问一个后端服务器,解决session丢失问题。

    upstream www.tomcat.com {
        ip_hash;
        server 192.168.0.121:8080;
        server 192.168.0.121:8081;
    }

5)备份服务器

标记backup

只有其他服务器都宕机,才会分配给备份服务器。

6)服务器标记down

标记down后,表示宕机。


9,静态代理

静态资源从tomcat中抽离出来,给Nginx来处理。

1)拦截匹配静态资源后缀

使用正则表达式,拦截后缀

2)拦截匹配静态资源所在目录

        location /examples {
            proxy_pass http://www.tomcat.com;
        }
        location ~ .*/(css|js|img|images){
            root /opt/static;
        }

然后

cp webapps/ROOT/tomcat.svg /opt/static/examples/img/

如果没权限,会403

然后修改8080的index.html增加图片展示

<img src="img/tomcat.svg"/>

这样图片资源请求的就不是Tomcat里的,而是Nginx里的。实际目录为/opt/static下。


10,动静分离

动态资源如jsp放到tomcat。

静态资源如jpg、css、js放到Nginx。


用户 -> Nginx(负载均衡) -> tomcat动态资源

                                            -> tomcat动态资源

                                            ->nginx静态资源

                                            ->nginx静态资源

一个nginx用来做负载均衡,两个tomcat托管动态资源,两个nginx托管静态资源。

11,虚拟主机

一个虚拟主机配置多个域名,如 bj.58.com、tj.58.com

1)域名相同,端口不同

如 58.com:8080、58.com:8081

2)域名不同,端口相同

如访问 bj.58.com转到tomcat1,tj.58.com转到tomcat2。

配置

  ##虚拟主机

   upstream bj.test.com {
        server 192.168.0.121:8080;
   }

    server {
        listen       80;
        server_name  bj.test.com;


        location / {
            proxy_pass http://bj.test.com;
        }
    }

   upstream tj.test.com {
        server 192.168.0.121:8081;
   }

    server {
        listen       80;
        server_name  tj.test.com;


        location / {
            proxy_pass http://tj.test.com;
        }
    }

   ## 之前

    upstream www.tomcat.com {
        server 192.168.0.121:8080;
        server 192.168.0.121:8081;
    }

    server {
        listen       80;
        server_name  localhost;

    。。。。

然后本地修改域名映射 bj.test.com、tj.test.com到192.168.0.121也就是nginx负载均衡上。

测试bj.test.com 转到8080tomcat

测试tj.test.com转到8081tomcat.

或者可以定义三个conf文件,每次以不同的配置文件启动也可以。


--
senRsl
2022年06月29日17:42:09

没有评论 :

发表评论