nginx web优化
web服务器的优化
全局配置的优化
1.nginx 启动账户
- 以nginx用户身份启动,但是nginx作为系统账户,普通账户的身份启动。
- 启动账户改为公司规定的指定账户。
[root@nginx ~]# useradd nginx -s /sbin/nologin -u 2000
- user nginx;
2.工作进程与CPU绑定,取消工作进程在多CPU之间来回切换导致的不必要的内存和CPU开销.
- worker_processes 2;
- worker_cpu_affinity 0001 0010;
3.调整nice值,以让nginx尽可能获得更多的运行时间
- worker_priority 0;
- 此值一般不会调整,生产环境一般一个服务器只运行一个服务器(LAP一般还是部署在同一服务器上)
events
4.指定Nginx使用的事件模型 epoll
- use epoll;
5.允许一个工作进程同一时刻可以接受多个用户的链接请求
- multi_accept on;
6.修改单个工作进程的最大连接数,nginx总连接数为工作进程数量*单个工作进程最大连接数,在反向代理情况下 1/2。
- worker_connections 65536;
http
7.开启文件零拷贝
- sendfile on; #此选项作为web服务一定开启(默认开启)
- 注:对于零拷贝的文件一定是nginx服务器自身产生的,并不是从后端服务器(PHP或Java)发过来的(比如文件是从Java服务器发送过来的,此文件是不生效的),文件一定是nginx自身产生的(无论文件是放置于本地磁盘还是后端服务器共享),只要是nginx本身产生的文件就能实现零拷贝。
8.是否启用响应报文合并及延迟发送,一般使用开启报文合并且不延迟发送数据。与sendfile连用
- tcp_nopush on;
- tcp_nodelay off;
9.是否开启文件压缩,一般开启。
- gzip on; 可节省公司的出口带宽。
10.设置会话保持时间,通常是60秒左右。
- keepalive_timeout 65 65;
11.隐藏nginx版本号
- ①server_tokens off;
- ②再server_tokens off;想将nginx也修改。修改nginx源码,将server自定义。
nginx的源码文件中修改:
[root@centos7-17 nginx-1.16.1]# vim src/http/ngx_http_header_filter_module.c
...
static u_char ngx_http_server_string[] = "Server: myweb" CRLF;
...
==>此处我将server自定义为myweb
然后重新编译安装nginx即可。
server
12.更改server_name和编码格式为utf-8、监听地址
- server_name 域名;
- charset utf-8;
- listen 80;
13.在定义访问日志格式和错误日志路径
- 一般使用定义json格式的日志,以便于日志收集和分析
14.自定义错误界面显示
- error_page 500 502 503 504 /50x.html; #定义错误页面
- error_page 404 /404.html;
15.可能设计安全原因拒绝访问某些文件
- 定义某种后缀名称的文件拒绝所有人访问或者某目录
- location ~ /.ht {
- deny all;
- }
16.实现动静分离
- 实现动静分离的方式:
①基于用户请求的URI或者后缀名实现动静分离
②通常会使用UTI来实现将JAVA的请求转发至JAVA服务器处理(访问一个路径的话,往后端服务器转发)
③通常会使用后缀名实现PHP的转发
具体实现方式:
①Java程序:定义一个location,如果访问比如:http://www.rootzcp.com/app1/ 、
location /app1{..}
访问app1目录下的均代表Java程序,往后的服务器Tomcat转发。
②PHP程序:
定义location ~* \.php${...}
以php结尾的文件为php程序,往后端php程序服务器转发
③静态资源:
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {.. }
以这些后缀结尾的为静态资源,在后端存储服务器去调用资源
17.https的实现
- 全栈https或者登录和交易安全隐私时实现https
server {
server_name server-name;
listen 443 ssl;
ssl_certificate /path/to/file;
ssl_certificate_key /path/to/file;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
}
- 基于虚拟主机头实现https(一个IP多域名https)
nginx支持SNI(Server Name Indication)功能,因此能实现同一个IP多域名的https,注:Apache不支持此功能
~]# nginx -V
TLS SNI support enabled
18.openssl版本升级
- openssl的版本可能不能满足要求,https的实现时可能需要将openssl版本升级,可将openssl作为nginx的第三方模块升级
--with-openssl=DIR(openssl 源码包所在路径)
加上这个openssl较新版本的选项,重新编译安装nginx
查看openssl版本:
nginx-1.16.1]# nginx -V
....
built with OpenSSL 1.1.1d 10 Sep 2019
....
19.nginx rewrite
- 优化主要将http重定向为https
# 全栈https
# if ( $scheme = http ) {
# rewrite / https://www.rootzcp.com permanent;
# }
# }
只要使用http 就将http重写为https
部分目录使用https:
location /login {
root /data/nginx/html/;
index index.html;
if ( $scheme = http ) {
rewrite / https://www.rootzcp.com/ permanent;
}
auth_basic "Login Authentication";
auth_basic_user_file /data/nginx/html/login/.htpasswd;
}
只要是访问http://www.rootzcp.com/login 此目录,重写为https
20.防盗链
①正常访问某个资源的方式:
- none:请求报文首部没有referer首部,比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
- blocked:请求报文有referer首部,但无有效值,比如为空。
- server_names:referer首部中包含本主机名及即nginx 监听的server_name。
- arbitrary_string:自定义指定字符串,但可使用*作通配符。
- regular expression:被指定的正则表达式模式匹配到的字符串,要使用开头,例如将这样的域名跳转过来的:.*.baidu.com。
②防盗链的作用:
- 主要是为了节省带宽
- 一般用于静态资源
location = /A.gif {
root /data/nginx/pic;
index index.html;
valid_referers none blocked server_names *.rootzcp.com *.google. *.baidu.com;
if ( $invalid_referer ) {
return 403;
}
}
==>使用referers防止盗链,只放行指定的referers。
21.错误资源重定向至首页(或者重定向至指定页面)
location / {
root html;
index index.html;
if ( !-f $request_filename ){
rewrite (.*) http://www.rootzcp.com/index.html;
}
}
==>注:rewrite (.*) http://www.rootzcp.com/index.html;这个重定向一定具体到某个资源
rewrite (.*) http://www.rootzcp.com 如果这样写将造成来回重定向,报错。