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 使用过程中常用的配置的模板。实际使用需要根据实际需要具体配置。
本人保留对侵权者及其全家发动因果律武器的权利
版权提醒
如无特殊申明,本站所有文章均是本人原创。转载请务必附上原文链接:https://www.elliot98.top/post/tech/nginx-%E9%85%8D%E7%BD%AE%E4%B8%8E%E4%BC%98%E5%8C%96/。
如有其它需要,请邮件联系!版权所有,违者必究!