Nginx 参数优化、http强制跳转以及负载平衡

2019-03-25 564 Words Web Nginx

Nginx 参数优化、http强制跳转以及负载平衡

Nginx 作为一个非常好用的 web 服务器,被广泛运用在服务器部署的最前端或者是高可用集群下的 Keeplived 等之后,用作静态文件服务器,反向代理等。

Nginx 安装、常用命令以及配置文件

一般使用软件包管理安装较为方便,安装完成之后,启动服务以及开机自启:

yum install -y nginx
systemctl enable nginx
systemctl start nginx

其主要配置文件主要在 /etc/nginx 中。 在这个配置文件中,通常会导入 /etc/nginx/conf.d/ 或者 /etc/nginx/site-enable/ 文件夹下的子配置文件。

在修改配置之后,通常使用下面命令来检查配置文件以及使其生效:

nginx -t # 检查配置文件
nginx -s reload # 重新载入配置文件

另外可以使用 -v 参数来查看 Nginx 版本。以及 -V 来获取更多版本信息(包括编译的模块等)。

全局配置

Nginx 的全局配置有如下重点参数:

user nginx; # 当前用户,最好不要使用 root
worker_processes auto; # 工作进程数,可配置为 CPU 逻辑核数
pid /run/nginx.pid; # pid 文件位置

之后是 event 域。这里指定了 Nginx 事件驱动模型,常用 epoll 。每个进程的最大连接数为 1024 一般无需修改。

events {
use epool;
worker_connections 1024;
}


HTTP/HTTPS 配置

在 http 配置块中是配置文件的主体。其中有如下参数:

access_log  /var/log/nginx/access.log  main;

error_log /var/log/nginx/error.log;

这里是两个总日志文件的位置以及日志记录的级别。各个子站也可以单独配置自己的日志位置。

sendfile            on;

tcp_nopush          on;

tcp_nodelay         on;

keepalive_timeout   65;

types_hash_max_size 2048;





include             /etc/nginx/mime.types;

default_type        application/octet-stream;

这里是一些常用配置,一般无需多做更改。其中 keepalive_timeout 是 keepalive 超时时间,可以改小为 15 或者 0。

gzip 用于对一些静态文件的压缩。可以极大的节省传输带宽,提高用户体验。其中压缩等级 gzip_comp_leve 越高,压缩率越大,传输的内容越小,CPU 负载越大。

gzip on;

gzip_comp_level 4;

gzip_min_length 1000;

gzip_proxied expired no-cache no-store private auth;

gzip_types text/plain application/x-javascript text/xml text/css application/xml;

下面一些配置限制了传输的包的头部和主题部分缓存的大小。其中 client_max_body_size 是最大包的长度,一般无需太大。

client_body_buffer_size 10k;

client_header_buffer_size 1k;

client_max_body_size 8M;

下面这个命令导入了各个站点配置文件。一般可以一个子站配置个文件。

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

站点配置模板

各个站点配置在应该写在 server 配置块中。最基本的配置如下:

实例一 ———— http 强制跳转 https

目前个人的项目已经全部迁移到 https 协议之下。

server {
listen 80 default_server;

listen \[::]:80 default_server;

server_name ertuil.top www.ertuil.top my.ertuil.top;



rewrite ^(.\*)$  https\://$host$1 permanent;
}

两个 listen 表示监听 IPv4 和 IPv6 的80端口,且当有多个子站点的时候,设置当前为默认。域名设置值为 `ertuil.top` 等,可以设置多个,包括 localhost 等。而后强制跳转到对应的 https url 下,实现强制跳转 https。

如果没有 IPv6 地址,可以不写第二句。

实例二 ———— Nginx 配置中默认的配置项

其中 location 匹配规则不详细赘述。

server {

    listen       80 ;

    listen       \[::]:80 ;

    server_name  \_;

    root         /usr/share/nginx/html;



    \# Load configuration files for the default server block.

    include /etc/nginx/default.d/\*.conf;



    location / {  # 最后匹配项

    }



    error_page 404 /404.html; # 404 错误页面

        location = /40x.html {

    }



    error_page 500 502 503 504 /50x.html;  # 50x 错误页面

        location = /50x.html {

    }

}

实例三 ———— https 静态网站。

https 下需要配置 ssl ,可以理解为证书的相关信息。具体配置例子为:

server {
listen 443 ssl http2 default_server;

listen \[::]:443 ssl http2 default_server;

server_name ertuil.top www.ertuil.top my.ertuil.top;



ssl on;

ssl_certificate fullchain.cer; # 公钥位置

ssl_certificate_key ertuil.top.key; # 私钥位置

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers on;

ssl_session_timeout 5m;



location / {

    root /opt/blog;

    try_files $uri $uri/ /index.html @router;

}



location @router {

    rewrite ^.\*$ /index.html last;

}
}

注意到 listen 后面有 http2 。表示当浏览器支持时,使用 http2 协议(注意,使用此选项需要 Nginx 有 http2 相关的模块,否则需要自行编译。)。https 比 http 配置多出了 ssl 相关的配置。主要是 `ssl_certificate` 和 `ssl_certificate_key` 需要指明秘钥对的存放位置。

静态文件代理采用下面两个 location 来配置。比如 root 指明网站文件的位置。重点需要指明其中 `try_files` 表示按照这个顺序来查找有没有这样的文件。主要用于服务 angular 、vuejs 等前端框架编译出来的静态页面(通常只有一个 index.html 作为入口),否则会出现异常的 404 。

实例四 ———— 动态网站负载

Nginx 通常无法直接负载由 Java, Python, PHP 等写成的动态网站,需要代理将请求发送给后端服务器,比如 tomcat, django 等。下面是一个最基本的反向代理配置:

server {
listen      443 ssl http2;

server_name  git.ertuil.top www.git.ertuil.top;



client_max_body_size 4G;

ssl on;

ssl_session_timeout 5m;

ssl_certificate fullchain.cer;

ssl_certificate_key ertuil.top.key;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers on;



location / {

    proxy_pass http\://127.0.0.1:3000; # 动态 WEB 服务器所在的 IP 地址和端口号

    proxy_http_version 1.1;

    proxy_set_header Upgrade $http_upgrade;

    proxy_set_header Connection keep-alive;

    proxy_set_header Host $host;

    proxy_cache_bypass $http_upgrade;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-Proto  $scheme;

}
}

以上配置就将动态请求转发给本机 127.0.0.1 上 3000 端口监听的后端服务器。

注意,通过不同域名的配置,可以实现反向代理,即通过域名的不同,分辨出子站的不同,nginx 会将请求发送给多个后端不同的 IP 和端口,实现多个站点的配置。

关于几个常用 location 块的配置

静态文件缓存

location ~\* \\.(html?|xml|json)$ {

    expires 1h; # 定义这些文件缓存的过期时间

}



location ~\* \\.(jpg|jpeg|png|gif|ico|css|js|ttf|woff2)$ {

    expires 1M;

    access_log off;

    add_header Cache-Control "public";

    proxy_ignore_headers "Set-Cookie";

}

关于动态代理

location / {

    try_files $uri @proxy_to_app;

}

location @proxy_to_app {

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header Host $http_host;

    proxy_redirect off;

    proxy_pass http\://127.0.0.1:8002;

}

关于 Nginx 文件管理服务器。

可在某些目录下配置 Nginx 文件服务器功能:

location ^~ /data/ {

    alias /opt/aria2/data/;

    autoindex on;

    autoindex_exact_size on;

    autoindex_localtime on;

}

关于负载平衡

为了实现一定程度的高可用和承载更大的负载,可以使用 Nginx 提供的 7 层负载平衡功能。具体需要 upstream 块。比如:

upstream server_1 {

    server 172.33.0.1 weight=2; # weight 权重,越大被使用频率越高

    server 172.33.0.2 weight=3 max_fails=2; # 最多失败次数,默认为 1

    server 172.33.0.3 weight=1 fail_timeout=15; # 如果访问失败,则 15 秒内不往这里发送请求。默认为 10 秒。

    server 172.33.0.6 weight=2 backup; # 备用

    server 172.33.0.6 weight=5 max_conns=1000; 最大连接数为 1000

}

之后在 server 域中可以当做转发的目的地址使用,比如:

location / {

    proxy_pass http\://server_1;

}

总结

以上就是我在 Nginx 使用过程中常用的配置的模板。实际使用需要根据实际需要具体配置。