Nginx

nginx功能:

静态的 web 资源服务器 html,图片, js, css, txt等静态资源

http/https 协议的反向代理

结合 FastCGI /uWSGI /SCGl 等协议反向代理动态资源请求

tcp/udp协议的请求转发(反向代理)

#编译安装Nginx
yum -y install gcc pcre-devel openssl-devel zlib-devel

tar xf nginx-1.18.0.tar.gz

cd nginx-1.18.0/

useradd -r -s /sbin/nologin nginx

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

make && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

nginx -v
#nginx正常配置
user nginx nginx;
worker_processes  auto;
worker_rlimit_nofile 51200;
events
    {   
        use epoll;
        worker_connections 51200;
        multi_accept off;
        accept_mutex off;
    }


http {
    include       mime.types;
    default_type  application/octet-stream;

    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 50m;

    sendfile on;
    sendfile_max_chunk 512k;
    tcp_nopush on;

    keepalive_timeout  65;

    tcp_nodelay on;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 256k;

    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
    gzip_vary on;
    gzip_proxied   expired no-cache no-store private auth;

    gzip_disable   "MSIE [1-6]\.";

    server_tokens off;
    access_log off;

server {
        listen  80 default_server reuseport;
        server_name  _;

#        location / {                                     #访问路径
#           root /home/jjy/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;
        }

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

        location /nginx_status
        {
            stub_status on;
            access_log   off;
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }
        location ~ ^/(images|img|javascript|js|css|flash|media|static)/
        {
            root /home/jjy/html/;
            autoindex   on;
            access_log  off;
            expires     30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /.well-known {
            allow all;
}

        location ~ /\.
        {
            deny all;
        }

        access_log /home/nginxlog/access.log;
}


include vhost/*.conf;      #可以创建vhost文件写入.conf
}

代理

server {
        listen          80;
        server_name             jjy.com;
        keepalive_timeout       60;

        proxy_set_header        Host $host;
        proxy_set_header        X-Forwarded-For $remote_addr;
        proxy_hide_header       Etag;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';

        #proxy_next_upstream    error timeout http_500 http_503;

        location / {
            proxy_pass  http://192.168.11.11:8080;
        }

}

地址重写

server {
        listen          80;
        server_name             crm.dcmstest.mid.henglu-sh.com;
        keepalive_timeout       60;

        proxy_set_header        Host $host;
        proxy_set_header        X-Forwarded-For $remote_addr;
        proxy_hide_header       Etag;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';

        #proxy_next_upstream    error timeout http_500 http_503;

        location /jj/asd/ {
            proxy_pass  http://192.168.11.13:1111;
            rewrite ^/jj/asd/(.*) /$1 break;
        }


}

轮询

#http字段中添加
     upstream register-center {
        server 192.168.11.11:8080;
        server 192.168.11.11:8081;
    }

server {
        listen  80 default_server reuseport;
        server_name  _;

        location /register-center {
                proxy_pass      http://register-center;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   #加这行可以在范文日志中查看到源ip
        }

如果访问js文件访问不到可使用

server {
    listen       80;
    listen  [::]:80;
    server_name  jjy.com;

    root /home/jjy/;

    location / {
        if ($request_filename ~* .*\.(?:htm|html)$){
            add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
        }
        index  index.html index.htm;
        try_files $uri /index.html;
    }

    error_page   500 502 503 504  /50x.html;

}

跨域问题

location / {
         if ($request_method = 'OPTIONS') {
         add_header 'Access-Control-Allow-Origin' '*' always;
         add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE' always;
         add_header 'Access-Control-Allow-Headers' '*' always;
         add_header 'Access-Control-Max-Age' 1728000 always;
         add_header 'Content-Length' 0;
         add_header 'Content-Type' 'text/plain; charset=utf-8';
         return 204;
        }
         if ($request_method ~* '(GET|POST|DELETE|PUT)') {
         add_header 'Access-Control-Allow-Origin' '*' always;
        }
        proxy_pass         http://127.0.0.1:1111;
}

添加密码访问

yum install -y httpd-tools

mkdir -p /usr/local/nginx/src/
htpasswd -c /usr/local/nginx/src/passwd jjy
New password:               ##输入密码

#可以查看当前生成内容
cat /usr/local/nginx/src/passwd



#修改nginx配置文件
server {
listen 80;
..............
auth_basic "Please input password";
auth_basic_user_file /usr/local/nginx/src/passwd;
location /{
............
}

nginx -s reload

Nginx优化

访问状态统计

Nginx 内置了 HTTP_STUB_STATUS 状态统计模块, 用来反馈当前的 Web访问情况。配置编译参数时可添加–with-http_stub_status_module 来启用此模块支持

修改 nginx.conf 配置文件, 指定访问位置并添加 stub_status 配置代码

server {

location / {

root html;
    index index.html index.php;
    }
location /status { #访问位置为/status
    stub_status on; #打开状态统计功能
    access_log off; #关闭此位置的日志记录
    }
}

配置完成后登录web查看访问状态: 192.168.11.11/status

基于客户端的访问控制规则

deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。

allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。

规则从上往下执行,如匹配则停止,不再往下匹配。

示例:

vim /usr/local/nginx/conf/nginx.conf

server {

location / { #在此配置字段添加

deny 192.168.11.1; //客户端 IP

allow all;

}

隐藏版本号

vim /usr/local/nginx/conf/nginx.conf

http {

server_tokens off; #关闭版本号

}

修改用户组

主进程由 root 创建, 子进程由指定的用户与组创建。 Nginx默认使用 nobody 用户帐号与组帐号, 一般也要进行修改

vim /usr/local/nginx/conf/nginx.conf

user nginx nginx; //修改用户为 nginx ,组为 nginx

配置网页缓存

修改 Nginx 的配置文件, 在新 location 段加入 expires 参数, 指定缓存的时间, 1d表示一天。

vim /usr/local/nginx/conf/nginx.conf

添加 location

location ~ .(gif|jpg|jepg|png|bmp|ico)$ {

root html; #t下

expires 1d; #指定缓存时间,r下

}

日志切割

Nginx 没有类似 Apache 的 cronlog 日志分割处理功能, 但是可以通过Nginx 的信号控制功能脚本来实现日志的自动切割, 并将脚本加入到Linux 的计划任务中, 让脚本在每天的固定时间执行, 便可实现日志切割功能。

vim /opt/jjy.sh

#!/bin/bash

d=$(date -d “-1 day” “+%Y%m%d”)

logs_path=”/var/log/nginx”

pid_path=”/usr/local/nginx/logs/nginx.pid”

[ -d $logs_path ] || mkdir -p $logs_path

mv /usr/local/nginx/logs/access.log

${logs_path}/test.com-access.log-$d

#移动并重命名日志文件

kill -USR1 $(cat $pid_path)

#重建新日志文件

find $logs_path -mtime +30 | xargs rm -f

#删除 30 天之前的日志文件

chmod +x /opt/fenge.sh

配置计划任务

crontab -e

5 0 * * * /opt/fenge.sh &>/dev/null

6.设置连接超时

在企业网站中, 为了避免同一个客户长时间占用连接, 造成资源浪费, 可设置相应的连接超时参数, 实现控制连接访问时间。可以修改配置文件nginx.conf, 设置 keepalive_timeout 超时时间。

vim /usr/local/nginx/conf/nginx.conf

http {

keepalive_timeout 65 180;

#默认是 65 秒,设置超时是 180 秒

client_header_timeout 80;

#等待客户端发送请求头的超时时间

client_body_timeout 80;

#请求体读超时时间

}

配置网页压缩

Nginx 的 ngx_http_gzip_module 压缩模块提供了对文件内容压缩的功能,允许 Nginx服务器将输出内容发送到客户端之前进行压缩, 以节约网站的带宽, 提升用户的访问体验。

gzip on:开启 gzip 压缩输出;
gzip_min_length 1k: 用于设置允许压缩的页面最小字节数;
gzip_buffers 4 16k: 表示申请 4 个单位为 16k 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果;
gzip_http_version 1.0: 用于设置识别 http 协议版本,默认是 1.1,目前大部分浏览器已经支持 gzip 解压,但处理最慢,也比较消耗服务器CPU 资源;
gzip_comp_level 2: 用来指定 gzip 压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理速度最慢,使用默认即可;
gzip_types text/plain: 压缩类型,是对哪些网页文档启用压缩功能;
gzip_vary on: 选项可以让前端的缓存服务器缓存经过 gzip 压缩的页面。

vim /usr/local/nginx/conf/nginx.conf
gzip on;
gzip_buffers 4 64k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_min_length 1k;
gzip_vary on;
gzip_types text/*;

配置防盗链

vim /usr/local/nginx/conf/nginx.conf

location ~* .(jpg|gif|swf)$ {

valid_referers none blocked *.jjy.com jjy.com; #t下

if ($invalid_referer) { #v下

rewrite ^/ http://www.aaa.com/error.ico; #$下

}

}

~* .(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg或.gif 或.swf 结尾的文件

valid_referers: 设置信任的网站,可以正常使用图片。

none :浏览器中 referer 为空的情况,就是直接在浏览器访问图片。

blocked :referer 不为空的情况 ,但是值被代理或防火墙删除了,这些值不以 http:// 或https:// 开头。

后面的网址或者域名:referer 中包含相关字符串的网址。

If 语句:如果链接的来源域名不在 valid_referers 所列出的列表中,$invalid_referer 为1,则执行后面的操作,即进行重写或返回 403 页面