Nginx

作者: 请叫我平爷 | 来源:发表于2022-02-25 10:06 被阅读0次

nginx简介

  • Nginx 是一个高性能的http和反向代理服务器,特点是占有内存少,并发能力强。
  • Nginx 是一款轻量级的web服务器,同时还支持CGI协议的动态语言,不支持java,Java程序只能通过与tomcat配合完成。Nginx转为性能优化开发,能经受高负载的考验

正向代理

在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问

反向代理

客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器ip地址。

负载均衡

  • 客户端发送多个请求到服务器,服务器处理请求,有一些需要与数据库进行交互,服务器处理完毕,再将结果返回给客户端。

  • 单个服务器解决不了,我们增加服务器数量,然后将请求分发到各个服务器上,将原来的请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们说的负载均衡

  • 动静分离:加快网站的解析速度,把动态网页和静态网页由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力

安装

  1. ssh连接,下载 nginx
  2. nginx相关依赖
    1. pcre
    2. openssl
    3. zlib
    4. 安装nginx

服务器防火墙命令

# 查看开发的端口号
firewall-cmd --list-all
# 设置开发的端口号
firewall-cmd --add-service=http -permanent
sudo firewall-cmd --add-port=80/tcp --permanent
# 重启防火墙
firewall-cmd --reload

nginx 操作命令

使用nginx操作命令前提条件,必须进入nginx的目录

# 查看版本号
./nginx -v
# 启动nginx
./nginx
# 关闭nginx
./nginx -s stop
# 重新加载nginx
./nginx -s reload

nginx 配置文件

XXX/nginx/conf/nginx.conf文件

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

###### 以上都是全局块
###### worker_processes 数值越大,nginx的并发能力越强
###### error_log nginx的错误日志存放的位置

events {
    worker_connections  1024;
}

###### event 块
###### worker_connections 数值越大,并发能力越强

http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;

    keepalive_timeout  65;


    include /etc/nginx/conf.d/*.conf;
}

###### http块
###### include 代表引入一个外部文件 ->/mime.types 中放着大量的媒体类型
###### include /etc/nginx/conf.d/*.conf -> 引入了conf.d目录下的以.conf为结尾的配置文件

/etc/nginx/conf.d/*.conf 文件

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
###### location 块
###### root:将接收到的请求更具/usr/share/nginx/html去查找静态资源
###### index:默认去上述的路径中找到index.html或者index.htm

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

###### server块
###### listem:代表nginx监听的端口号
###### localhost:代表nginx接受请求的ip

优先级

`location=` > `location /xxx/yyy/zzz` > `location ^` > `location ~,~* ` > `location 起始路径` > `location /`
  1. 匹配

    location = / {
            # 精准匹配,主机名后面不能带任何的字符串
        }
    
  2. 通用匹配

    location /xxx{
     # 匹配所有以/xxx开头的路径  
    }
    
  3. 正则匹配

    location ~/xxx{
     # 匹配所有以/xxx开头的路径
    }
    
  4. 匹配开头的路径

    location ^~/images/{
     # 匹配所有以/images开头的路径
    }
    
  5. 匹配开头的路径

    location ^* \.(gif|jpg|png){
     # 匹配以gif或者jpg或者png为结尾的路径
    }
    

全局块

  1. 配置文件开始到events块之间的内容
  2. 主要设置一些影响nginx服务器整体运行的配置指令,包括运行nginx服务器的用户、允许生成worker process数,进程PID存放路径、日志存放路径和类似以及配置文件的引入。
  3. 比如:worker_processes 1; nginx服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量越多,但是会受到硬件、软件等设备的制约

event 块

  1. 设计的指令影响nginx服务器与用户的网络连接
  2. 比如:work_connections 1024; nginx支持的最大连接数为1024

http 块

nginx配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,包括http全局块、server块

http全局块

包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等

全局server块

监听配置和名称或ip配置。

location块

一个server块可以配置多个location块

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

nginx配置实例

负载均衡

http{
    ...
    upstream myserver{
        ip_hash;
        server 115.28.52.63:8080 weight=1;
        server 115.28.52.63:8180 weight=1;
    }
    ...
    server{
        local / {
        ...
            proxy_pass http://myserver;
            proxy_connect_timeout 10;
        }
        ...
    }
}

策略

  1. 轮询(默认):请求接口按时间顺序逐一分配到不同的后端服务器,如果后端服务down,自动剔除

    upstream 名字 {
     server ip:port;
     server ip:port;
     ... 
    }
    server {
     listen 80;
     server_name localhost;
     
     location / {
         proxy_pass http://upstream的名字/;
     }
    }
    
  1. weight:权重,默认为1,权重越高被分配的客户端越多

    upstream 名字 {
     server ip:port weight=权重比例;
     server ip:port weight=权重比例;
     ... 
    }
    server {
     listen 80;
     server_name localhost;
     
     location / {
         proxy_pass http://upstream的名字/;
     }
    }
    
  1. ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题

    upstream 名字 {
     ip_hash
     server ip:port;
     server ip:port;
     ... 
    }
    server {
     listen 80;
     server_name localhost;
     
     location / {
         proxy_pass http://upstream的名字/;
     }
    }
    
  2. fari(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配

    upstream server_pool{
        server 192.168.5.21:80;
        server 192.168.5.22:80;
        fair;
    }
    

动静分离

nginx 的并发能力公式

    worker_processes*worker_connection/4|2=Nginx最终的并发能力

动态资源需要/4,静态资源需要/2
nginx通过动静分离,来提升Nginx的并发能力,更快的给用户响应

  • 静态资源代理
location / {
    root 静态资源路径;
    index 默认访问路径下的什么资源;
    autoindex on: # 代表展示静态资源的全部内容,以列表的形式展开
}
  • 动态资源代理
location / {
    proxy_pass 路径;
}

docker下安装Nginx

# 下载nginx镜像
docker pull nginx

# 初始化容器
# http的80端口
# https的443端口
# html 静态文件放置的地方,index.html可以直接访问
# nginx.conf 默认的配置文件,一般不改,一般修改default.conf
# default.conf 配置文件一般修改这里
# logs 日志文件存放位置
# ssl 加密文件放置位置
docker run --detach \
--name nginx \
-p 443:443 \
-p 80:80 \
-v /home/mi/docker/nginx/html:/usr/share/nginx/html:rw \
-v /home/mi/docker/nginx/nginx.conf:/etc/nginx/nginx.conf/:rw \
-v /home/mi/docker/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf:rw \
-v /home/mi/docker/nginx/logs:/var/log/nginx/:rw \
-v /home/mi/docker/nginx/ssl:/ssl/:rw \
-d nginx

nginx.conf

#运行nginx的用户
user  root;
#启动进程设置成和CPU数量相等
worker_processes  1;

#全局错误日志及PID文件的位置
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

#工作模式及连接数上限
events {
        #单个后台work进程最大并发数设置为1024
    worker_connections  1024;
}


http {
        #设定mime类型
    include       /etc/nginx/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  /var/log/nginx/access.log  main;
    client_max_body_size 10m;
    sendfile        on;
    #tcp_nopush     on;

        #设置连接超时的事件
    keepalive_timeout  65;

        #开启GZIP压缩
    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

nginx配置https

https证书文件的生成

centos 通过docker安装nginx,并通过https访问

# 去到nginx/ssl文件下
# 生成私钥
openssl genrsa -des3 -out server.key 2048
# 创建签名请求的证书(CSR),生成证书颁发机构,用于颁发公钥
openssl req -new -key server.key -out server.csr
# 去除密码
openssl rsa -in server.key -out unserver.key
# 配置nginx最后标记证书使用上述私钥和CSR
openssl x509 -req -days 3650 -in server.csr -signkey unserver.key -out server.crt
# 备份原server.key,将第之前生成的unserver.key重命名为server.key。
mv server.key server.key_bak
mv unserver.key server.key
# 当前文件夹下存在的文件
# server.crt、server.csr、server.key、server.key_bak

nginx配置

conf/default.conf文件

10.50.101.94 为当前IP地址,http转化成https

server {      #监听443端口
    listen    443 ssl;
    server_name  localhost;             #域名

    # 增加ssl
    ssl on;        #如果强制HTTPs访问,这行要打开
    ssl_certificate /ssl/server.crt;   #域名申请的ssl证书的nginx的crt文件存储路径
    ssl_certificate_key /ssl/server.key;      #域名申请的ssl证书的nginx的key文件存储路径

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

     # 指定密码为openssl支持的格式
     ssl_protocols  SSLv2 SSLv3 TLSv1.2;

     ssl_ciphers  HIGH:!aNULL:!MD5;  # 密码加密方式
     ssl_prefer_server_ciphers  on;   # 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码

     # 定义首页索引目录和名称        
     location / {
       root   /usr/share/nginx/html;
       index  index.html index.htm;
     }
     location /tomcat {
            proxy_pass http://10.50.101.94:8080;  #这里是需要代理的地址
            index  index.html index.htm index.jsp;
      }

    #重定向错误页面到 /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
server{   #监听80端口
    listen 80;
        server_name localhost; 
        rewrite ^(.*) https://$host$1 permanent;      #所有到达此处的连接转为https
}

相关文章

网友评论

      本文标题:Nginx

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