高性能的http服务器/反向代理服务器。官方测试支持5万并发,CPU、内存等消耗较低且运行稳定
使用场景
- Http服务器。
 Nginx可以单独提供Http服务,做为静态网页的服务器。
- 虚拟主机。
 可以在一台服务器虚拟出多个网站。
- 反向代理与负载均衡。
 Nginx做反向代理,可以使多个服务器之间分担负载,不会造成某台服务器负载高宕机或者某台服务器十分闲置。
Linux环境安装Nginx
官方网站
- 安装依赖包
# SSL功能需要openssl库,直接通过yum安装: 
yum install openssl
# gzip模块需要zlib库,直接通过yum安装: 
yum install zlib
# rewrite模块需要pcre库,直接通过yum安装: 
yum install pcre
或者直接安装以上三个依赖,命令:
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

 
-  创建一个用于存放 Nginx的文件夹 
-  下载 Nginx的tar包到自己的文件夹。
 命令:wget http://nginx.org/download/nginx-1.22.0.tar.gz
 提示:wget: command not found
 解决:yum -y install wget
  
  
-  解压 tar包。
 命令:tar -xvf nginx-1.22.0.tar.gz nginx
  
-  安装模块。 
 进入Nginx目录,执行命令:
 ./configure
 报错:./configure: error: C compiler cc is not found
 解决:yum -y install gcc gcc-c++ autoconf automake make
 报错:./configure: error: the HTTP gzip module requires the zlib library. You can either disable the module by using --without-http_gzip_module option, or install the zlib library into the system, or build the zlib library statically from the source with nginx by using --with-zlib=<path> option.
 解决:yum install -y zlib-devel
  
-  安装 Nginx
 命令:make install
  
-  安装完成 
Nginx常用命令
进入Nginx安装目录下的sbin目录
-  启动 
 命令:./nginx
  
-  查看是否启动 
 命令:ps ef | grep nginx
  
-  关闭 
 命令:nginx -s stop或者nginx -s quit
-  重启,重新加载配置文件 
 命令:nginx -s reload
-  修改 conf下监听端口为81
防火墙配置
-  查看所有打开的端口 
 命令:firewall-cmd --zone=public --list-ports
  
-  开放指定端口号 
 命令:firewall-cmd --zone=public --add-port=81/tcp --permanent
  
-  重新载入 
 命令:firewall-cmd --reload
  
Nginx无法重启
描述:Restarting nginx daemon: nginxnginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory) nginx not running
解决:Nginx -c参数指定配置文件解决
 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 
Nginx访问
【IP + 端口号 80默认不显示】
 
Nginx基本配置说明
- main:全局设置。影响其他部分所有设置。
- server:主机服务相关设置,主要用于指定虚拟主机域名、IP和端口号等。
- location:URL匹配特定位置后的设置,反向代理、内容篡改的相关设置。
- upstream:上游服务器设置和负载均衡相关设置。
Nginx常用功能配置
反向代理
 
server {
    listen 80;
    server_name wh.test.com;
    location /api {
        # 反向代理的地址
        # 所有 /api 的接口访问都代理到 7075 端口
            例如:wh.test.com/api/login.do -> http://localhost:7050/login.do
        proxy_pass http://localhost:7075/;
    }
}
访问控制:黑名单
 
server {
    location / {
        # 屏蔽单个ip访问
        deny 172.16.60.220;
        
        # 屏蔽所有ip
        deny all;
        
        # 允许ip访问
        allow 172.16.60.220;
    }
}

 
负载均衡:轮询
 
每次请求会按时间顺序逐一分配到不同的服务器,如果有服务宕机,Nginx会剔除掉宕机服务器,继续分配请求。
如果其中一台服务器压力太大,出现延迟,会影响所有的这台服务器下的用户请求。
http {  
    upstream test.com {  
        server 192.168.10.1:8081;  
        server 192.168.10.2:8082;  
        server 192.168.10.3:8083;  
    }  
    server {  
        location /test {  
            proxy_pass  http://test.com/;  
        }  
    }  
}
负载均衡:权重
 
理想状态下,10次请求中有6次请求了8081,1次请求了8082,3次请求了8083
http {  
    upstream test.com {  
        server 192.168.10.1:8081 weight=6;  
        server 192.168.10.2:8082 weight=1;  
        server 192.168.10.3:8083 weight=3;  
    }  
    server {  
        location /test {  
            proxy_pass  http://test.com/;  
        }  
    }  
}
负载均衡:Hash
 
计算方式:abs(客户端ip.hash())%服务器数量。
客户端的IP地址是唯一不变的。所以,通过hash算法计算出ip地址对应的哈希值,通过哈希码值对服务器数量进行一个求模式运算。这样就可以保持每个客户端访问的服务器是保持不变的。因为哈希算法散列的特点,也可以近似的当作平均分配。
http {  
    upstream test.com {  
        ip_hash;
        server 192.168.10.1:8081;  
        server 192.168.10.2:8082;  
        server 192.168.10.3:8083;  
    }  
    server {  
        location /test {  
            proxy_pass  http://test.com/;  
        }  
    }  
}
负载均衡:最小连接数
 
基于最小连接的负载均衡方式,
Nginx会将请求发送给当前处理请求数量最少的服务器上,用来分担各个服务器之间的压力。
http {  
    upstream test.com {  
        least_conn;
        server 192.168.10.1:8081;  
        server 192.168.10.2:8082;  
        server 192.168.10.3:8083;  
    }  
    server {  
        location /test {  
            proxy_pass  http://test.com/;  
        }  
    }  
}
gzip压缩
 
开启gzip压缩可以减少http传输过程中文件的大小。可以极大提高网站的访问速度。
gzip  on; # 开启gzip 压缩
gzip_types; # 要采用 gzip 压缩的 MIME 文件类型,其中 text/html 被系统强制启用
gzip_static on; # 默认 off,该模块启用后,Nginx 首先检查是否存在请求静态文件的 gz 结尾的文件,如果有则直接返回该 .gz 文件内容
gzip_proxied expired no-cache no-store private auth; # 默认 off,nginx 做为反向代理时启用,用于设置启用或禁用从代理服务器上收到相应内容 gzip 压缩
gzip_buffers 16 8k; # 获取多少内存用于缓存压缩结果,16 8k 表示以 8k*16 为单位获得
gzip_min_length 1k; # 允许压缩的页面最小字节数,页面字节数从 header 头中的 Content-Length 中进行获取。默认值是 0,不管页面多大都压缩。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大
gzip_comp_level 4; # gzip 压缩比,压缩级别是 1-9,1 压缩级别最低,9 最高,级别越高压缩率越大,压缩时间越长,建议 4-6
gzip_http_version 1.0; # 默认 1.1,启用 gzip 所需的 HTTP 最低版本
gzip_vary off; # 用于在响应消息头中添加 Vary:Accept-Encoding,使代理服务器根据请求头中的 Accept-Encoding 识别是否启用 gzip 压缩
gzip_disable "MSIE [1-6]\.";// 指定哪些不需要 gzip 压缩的浏览器
Http静态资源服务器
 
server {  
  listen       80;  
  server_name  localhost;  
  #后台管理
  location /handadmin{
      alias  /opt/home/handbook/dist/;
      index index.html;
  }  
}
动静分离
 
Nginx设置expires可以指定访问缓存。设置之后,用户在指定的时间都只会访问浏览器中的缓存,而不会去请求Nginx
# 静态请求
location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js) {  
    root /usr/local/dist;  
    expires 10h; # 设置过期时间为10小时  
}  
# 动态请求
location ~ \.(do) {  
    proxy_pass  127.0.0.1:8081;  
} 
图片防盗链
 
防止其他网站利用外链访问服务器图片
server {  
    listen 8081;  
    server_name  localhost;  
    # 图片防盗链  
    location ~* \.(gif|jpg|jpeg|png|bmp|swf) {  
        valid_referers none blocked server_names ~\.google\. ~\.baidu\. *.qq.com;  
        # 只允许本机 IP 外链引用,将百度和谷歌也加入白名单有利于 SEO  
        if (invalid_referer){  
            return 403;  
        }  
    }  
} 
适配PC
 
根据用户请求的user-agent来判断返回PC还是H5
server {  
    listen 80;  
    server_name test.com;  
    location / {  
     root  /usr/local/app/pc; # pc 的 html 路径  
        if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {  
            root /usr/local/app/mobile; # mobile 的 html 路径  
        }  
        index index.html;  
    }  
} 
设置二级域名
 
server {  
    listen 80;  
    server_name admin.test.com; // 二级域名  
    location / {  
        root  /usr/local/app/admin; # 二级域名的 html 路径  
        index index.html;  
    }  
} 
配置Https
 
server{  
    listen 443 ssl http2; # 这里还启用了 http/2.0
    ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem; # 证书文件地址  
    ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem; # 私钥文件地址  
    server_name test.com www.test.com; # 证书绑定的域名  
}
配置Http转Https
 
server {  
    listen      80;  
    server_name  www.test.com;  
    # 单域名重定向  
    if (host = 'www.test.com'){  
        return 301 https://www.test1.com;  
    }  
    # 全局非 https 协议时重定向  
    if (scheme != 'https') {  
        return 301 https://server_name$request_uri;  
    }  
    # 或者全部重定向  
    return 301 https://server_name$request_uri;  
}
禁止指定user_agent
 
# http_user_agent 为浏览器标识  
# 禁止 user_agent 为baidu、360和sohu,~*表示不区分大小写匹配  
if (http_user_agent ~* 'baidu|360|sohu') {  
    return 404;
}  
# 禁止 Scrapy 等工具的抓取  
if (http_user_agent ~* (Scrapy|Curl|HttpClient)) {  
    return 403; 
}
#### 请求过滤
#### 根据请求类型过滤
# 非指定请求全返回 403  
if ( request_method !~ ^(GET|POST|HEAD) ) {  
    return 403;  
}  










![猫头虎分享已解决Bug || RuntimeError: size mismatch, m1: [32 x 100], m2: [500 x 10]](https://img-blog.csdnimg.cn/direct/aa86eef0d81e4f279688a772e92ea3bc.webp#pic_center)








