Nginx

作者: tzktzk1 | 来源:发表于2023-12-15 19:13 被阅读0次

    什么是Nginx

    Nginx 是一个高性能的 http 和反向代理服务器,其特点是占用内存小,并发能力强。 Nginx 专为性能优化而开发,性能是其最重要的考量,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。

    Nginx可以从事的用途

    web服务器

    提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。

    反向代理

    正向代理:在浏览器中配置代理服务器,通过代理服务器进行互联网访问。
    反向代理:将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴漏的是代理服务器地址。

    负载均衡

    如果请求数过大,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器的情况改为请求分发到多个服务器上,就是负载均衡。

    Nginx安装

    CentOS

    yum install -y nginx
    

    Ubuntu

    apt-get install -y nginx
    

    当终端显示出Complete!字样时,则代表我们的Nginx已经安装成功了。

    Docker 方式安装: Docker 部署 Nginx - 简书 (jianshu.com)

    查看Nginx版本:

    nginx -v
    

    Nginx自带常用命令

    nginx -s stop       快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
    nginx -s quit       平稳关闭Nginx,保存相关信息,有安排的结束web服务。
    nginx -s reload     因改变了Nginx相关配置,需要重新加载配置而重载。
    nginx -s reopen     重新打开日志文件。
    nginx -c filename   为 Nginx 指定一个配置文件,来代替缺省的。
    nginx -t           不运行,仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
    nginx -v           显示 nginx 的版本。
    nginx -V           显示 nginx 的版本,编译器版本和配置参数。
    

    Nginx启动

    ##在centos7+ 启动nginx服务
    systemctl start nginx
    #centos6+ 上启动nginx服务
    service nginx start
    #或,简单粗暴一句,通过这种方式启动nginx 使用systemctl status nginx查看的状态是未运行
    nginx
    

    Nginx停止

    ##在centos7+ 停止nginx服务
    systemctl stop nginx
    #centos6+ 上停止nginx服务
    service nginx stop
    #粗鲁的停止,下班了,不干了,就算请求来了我也不接了。
    nginx -s stop
    ##优雅的停止,Nginx在退出前完成已经接受的连接请求。
    nginx -s quit
    

    Nginx重启

    ##在centos7+ 重启nginx服务
    systemctl restart nginx
    #centos6+ 上重启nginx服务
    service nginx restart
    #使用nginx命令停止,推荐这个
    nginx -s reload
    

    四种解决Nginx出现403 forbidden 报错的方法

    一、由于启动用户和nginx工作用户不一致所致

    1.1查看nginx的启动用户

    ps aux | grep "nginx: worker process" | awk '{print $1}'
    

    1.2将nginx.config的user改为和启动用户一致

    vim conf/nginx.conf
    
    二、缺少index.html或者index.php文件,就是配置文件中index index.html index.htm这行中的指定的文件
      server {
        listen       80;
        server_name localhost;
        index index.php index.html;
        root /data/www/;
      }
    

    如果在/data/www/下面没有index.php,index.html文件的时候,直接会报403 forbidden

    三、权限问题,如果nginx没有web目录的操作权限,也会出现403错误

    解决办法:修改web目录的读写权限,或者是把nginx的启动用户改成目录的所属用户,重启Nginx即可解决

    chmod -R 777 /data
    chmod -R 777 /data/www/
    
    四、SELinux设置为开启状态(enabled)的原因

    查看当前selinux的状态

    /usr/sbin/sestatus
    

    将SELINUX=enforcing 修改为 SELINUX=disabled 状态

    vim /etc/selinux/config
    
    #SELINUX=enforcing
    SELINUX=disabled
    

    重启生效。reboot

    reboot
    

    SELinux作为Linux的安全防护插件,在普通机器和其他生产环境有额外的系统做安全防护,所以这里关闭即可

    配置web服务器

    location /path/ {
        # 相对匹配,文件路径等于 root + location,如访问 http://ip/path/ 对应的文件目录是/root/software/autotpsite/dist/path/
     root   /root/software/autotpsite/dist;  
        # 绝对匹配,文件路径等于alias对应目录与location无关, 目录必须以/结尾 与root二选一 ,如访问 http://ip/path/ 对应的文件目录 /root/software/autotpsite/dist/
     # alias   /root/software/autotpsite/dist/; 
    }
    

    正向代理和反向代理介绍

    正向代理:

    正向代理服务是由客户端设立的。
    客户端了解代理服务器和目标服务器都是谁。
    帮助咱们实现突破访问权限,提高访问的速度,对目标服务器隐藏客户端的ip地址。


    image.png
    反向代理:

    反向代理服务器是配置在服务端的。
    客户端是不知道访问的到底是哪一台服务器。
    达到负载均衡,并且可以隐藏服务器真正的ip地址。


    image.png

    部署反向代理

    反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址

    核心配置:

    ### 省略了http和server块,这里加到server块里面就可以
    location /api/ {
       include       uwsgi_params;
       uwsgi_pass     127.0.0.1:8081; # 此方式需要 uwsgi采用socket连接方式
    }
    #location /jira {
    #   include       uwsgi_params;
    #   uwsgi_pass     127.0.0.1:8081;
    #}
    location / {
       alias     /root/software/autotpsite/dist/;
    }
    

    或者使用正则的方式匹配URL

    location / {
       alias     /root/software/autotpsite/dist/;
    }
    location ~/(api/|jira/) {
       include       uwsgi_params;
       uwsgi_pass     127.0.0.1:8081;
     # proxy_pass   http://127.0.0.1:8081;   # 通用配置方式
    }
    

    uWSGI服务配置

    [uwsgi]
    # 配置文件处于项目根目录,因此设置为相对路径即可,复用性更高
    chdir = ./              
    module = autotpsite.wsgi:application
    # Nginx使用uwsgi_pass做方向代理时 需要设置成socket
    socket = 0.0.0.0:8081
    #http-socket = 0.0.0.0:8081   #对应nginx的uwsgi模式
    #http = 0.0.0.0:8081     #对应nginx的uwsgi模式
    master = true
    pidfile = uwsgi8081.pid
    daemonize = uwsgi_server.log
    # 只记录错误信息
    disable-logging = true
    # 新增配置--允许多线程
    enable-threads = true
    # 设置请求头最大字节数,用于socket模式
    buffer-size = 40960
    

    location指令说明:
    功能:用于匹配URL
    语法如下:

    1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
    2、~:用于表示 uri 包含正则表达式,并且区分大小写。
    3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
    4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
    

    如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

    部署负载均衡

    在nginx中配置负载均衡也是十分容易的,同时还支持了多种负载均衡策略供我们灵活选择。

    http {
    ###此处省略一大堆没有改的配置
       ##自定义我们的服务列表
       upstream myserver{
           server 127.0.0.1:8081;
           server 192.168.2.5:8081;
       }
       server {
           listen       80 ; ##设置我们nginx监听端口为8888
           server_name myserve;
           # Load configuration files for the default server block.
           include /etc/nginx/default.d/*.conf;
           location / {
               alias   /root/software/autotpsite/dist/;
           }
           location ~/(api/|jira/) {
               proxy_pass   http://myserver; # 核心配置在这里
               proxy_connect_timeout 10;   # 超时时间,单位秒
           }
           error_page 404 /404.html;
               location = /40x.html {
           }
           error_page 500 502 503 504 /50x.html;
               location = /50x.html {
           }
       }
    }
    

    uWSGI配置:

    [uwsgi]
    chdir = /root/software/autotpsite/
    module = autotpsite.wsgi:application
    http-socket = 0.0.0.0:8081
    master = true
    pidfile = /root/software/autotpsite/uwsgi8081.pid
    daemonize = /root/software/autotpsite/uwsgi_server.log
    # 只记录错误信息
    disable-logging = true
    

    nginx提供了三种不同的负载均衡策略供我们灵活选择,分别是:

    轮询(默认方式):

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
    用法:啥也不加,上文实例就是默认的方式,就是默认的

    权重(weight):

    weight 代表权重,默认为 1,权重越高被分配的客户端越多,权重越大,能力越大,责任越大,处理的请求就越多。
    用法:

    upstream myserver{
       server 127.0.0.1:8081 weight =1;
       server 192.168.2.5:8081 weight=2;
    }
    
    ip_hash:

    每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
    用法:

     upstream myserver{
           ip_hash;#可与weight配合使用
           server 127.0.0.1:8081 weight =1;
           server 192.168.2.5:8081 weight =2;
         }
    
    image.png

    Nginx动静分离

    Nginx的并发能力公式:
    worker_processes * worker_connections / 4 | 2 = Nginx最终的并发能力
    动态资源需要/4,静态资源需要/2.
    Nginx通过动静分离,来提升Nginx的并发能力,更快的给用户响应。

    image.png

    上图是动态资源的请求工程 四个连接数 ,咱们把静态资源放在nginx 上面 就只需要两个连接数, 同时也减轻了后面服务器的压力 , 如下图 静态资源直接放在nginx

    image.png
    动态资源代理

    使用proxy_pass动态代理

    # 配置如下
    location / {
      proxy_pass 路径;
    }
    
    静态资源代理

    为了验证效果,把应用中的静态资源都拷贝到 /opt/docker_nginx/statics/ 目录下
    这个目录通过数据卷映射到了nginx内部的 /usr/share/nginx/statics 目录
    我们通过location 指定了特性类型的静态资源访问这个路径。

    所以,本质上静态资源会到 /opt/docker_nginx/statics/ 目录加载。
    我们把要验证的静态资源,比如汤姆猫图片,美女图片【命名为tomcat.png】,放到这个目录。

    image.png

    配置文件:

    # 修改配置文件
    upstream emp {
      ip_hash;
      server 192.168.174.128:8081;
      server 192.168.174.128:8080;
    }
    
    server{
        listen 80;
        server_name localhost;
        
        location ~* \.(gif|jpg|png|js|css|html)$ {
            # 匹配以gif|jpg|png|js|css|html为结尾的路径 静态资源
            root /usr/share/nginx/statics;
        }
        
        location / {
            proxy_pass http://emp/;
        }
    
    }
    

    vim docker-compose.yml

    version: '3.1'
    services:
      nginx:
        restart: always
        image: daocloud.io/library/nginx:latest
        container_name: nginx
        ports:
          - 80:80
        volumes:
          - /opt/docker_nginx/conf.d/:/etc/nginx/conf.d
          - /opt/docker_nginx/statics/:/usr/share/nginx/statics
    

    我们当前的所有静态资源文件,比如js/css/images/html都放在了 /opt/docker_nginx/statics 目录下如果遇到访问静态资源403无权限查看的问题,原因是nginx访问时是通过nginx用户,而statics 静态文件夹是root用户创建的,其他用户没有访问权限,需要添加访问权限

    chmod -R 777 /opt/docker_nginx/statics/
    

    动态资源从tomcat获取,静态资源从/opt/docker_nginx/statics/目录获取 ==> Nginx动静分离

    相关文章

      网友评论

          本文标题:Nginx

          本文链接:https://www.haomeiwen.com/subject/gxdggdtx.html