Nginx配置优化

Stella981
• 阅读 914

一、配置Nginx隐藏版本号

  1修改源码包 ,必须在安装之前(测试命令curl -I http://192.168.200.102)

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

useradd -M -s /sbin/nologin nginx

tar xf nginx-1.16.1.tar.gz -C /usr/src/

cd /usr/src/nginx-1.16.1/

vim src/core/nginx.h

#define NGINX_VERSION "1.16.1"  (修改版本号)
#define NGINX_VER "nginx/" NGINX_VERSION  (修改服务名)

2修改配置文件(已安装nginx)

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

在http内添加一条,隐藏版本号

server_tokens off;

(在源码包已经隐藏版本号的情情况下,再修改主配置文件,会显示服务名,但不显示服务版本号)

如果php配置文件中配置了fastcgi_param SERVER_SOFTWARE选项,则编辑php-fpm配置文件,将fastcgi_param SERVER_SOFTWARE对应值修改为fastcgi_param SERVER_SOFTWARE nginx;(除了隐藏nginx的版本以外,php的版本也要隐藏)

二、修改Nginx用户与组

1编译安装时指定

useradd -M -s /sbin/nologin nginx

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install

2修改配置文件

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

user  nginx nginx;  (修改用户和[组]组可以省略)

killall -HUP nginx

三、配置Nginx网页缓存时间

一般针对静态网页进行设置,对动态网页不用设置缓存时间,因为动态网页在服务器上不是完整的存在

设置方法:可修改配置文件,在http段、或server段、或location段加入对特定内容的过期参数

编辑主配置文件,添加以下内容

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

location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
expires 1d;
}
location ~ .*\.(js|css)$ {
expires 1h;
}

killall -HUP nginx

四、实现Nginx的日志切割

日志存放位置/usr/local/nginx/logs/access.log

vim /opt/cut_nginx_log.sh

#!/bin/bash

# cut_nginx_log.sh

datetime=$(date -d "-1 day" "+%Y%m%d")      (变量为前一天的完整时间)

log_path="/usr/local/nginx/logs"          (定义日志存放位置变量)

pid_path="/usr/local/nginx/logs/nginx.pid"      (定义PID文件变量)

[ -d $log_path/backup ] || mkdir -p $log_path/backup  (如果P没有backup这个文件,则创建)

if [ -f $pid_path ]                    (如果Nginx在运行,有PID文件)

then

mv $log_path/access.log $log_path/backup/access.log-$datetime    (移动现有日志文件到backup内,叫做access.log-一天前的日期)

kill -USR1 $(cat $pid_path)                        (重新生成新的空白日志文件)

find $log_path/backup -mtime +30 | xargs rm -f              (寻找backup内30天修改过的文件删除)

else

echo "Error,Nginx is not working!" | tee -a /var/log/messages        (输出Error,Nginx is not working!并且写入系统日志messages内)

fi

chmod +x /opt/cut_nginx_log.sh

设计周期性计划任务

crontab -e

0  0  *  *  *  /opt/cut_nginx_log.sh

五、配置Nginx实现连接超时

 修改主配置文件 vim /usr/local/nginx/conf/nginx.conf

在http内添加

keepalive_timeout  65;  (设置连接保持超时时间,一般可只设置该参数,默认为65秒,可根据网站的情况设置,或者关闭,可在http段、server段、或者location段设置。)

 client_header_timeout 60;  (指定等待客户端发送请求头的超时时间。)

client_body_timeout 60;    (设置请求体读取超时时间。)

killall -HUP nginx

六、更改Nginx运行进程数

修改配置文件的worker_processes参数,一般设置为CPU的个数或者核数(也可两倍)

1 全局配置 (在括号之外的内容)

user nginx [nginx]; 运行用户(nginx组可以不用写)

worker_processes 2;  指定工作进程数量 (一般都是按照核心数指定一比一)

worker_cpu_affinity 01 10;  (指定CUP分配。如果四核0001 0010 0100 1000)

worker_rlimit_nofile 102400;  (指定Nginx一个进程打开的最多文件数目,理论值应该是最多打开文件数【ulimit -n查看,修改:ulimit -n 新值】【ulimit -u 最大用户进程数,修改:ulimit -u 新值】这两个值最好一样,现在是临时修改,永久修改把这两条命令放在/etc/profile内)

error_log logs/error.log;  (错误日志存放位置)

pid logs/nginx.pid;  (进程PID存放位置)

2 I/O事键 (events括号内的内容)

use epoll;  (使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能)

worker_connections 1024;  (工作连接数量,一般工作中配置为4096。单个工作进程并发数量,服务器总并发数量为工作进程数X工作连接数) 

killall -HUP nginx

七、配置Nginx实现网页压缩功能

在http内添加

Nginx的ngx_http_gzip_module压缩模块提供了对文件内容压缩的功能,允许nginx服务器将输出内容发送到客户端之前进行压缩

修改主配置文件 vim /usr/local/nginx/conf/nginx.conf

gzip  on;    (开启gzip压缩输出)

gzip_min_length 1k;    (用于设置允许压缩的页面最小字节数【大于1K文件要压缩】)

gzip_buffers 4 16k;    (表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来储存gzip压缩结果)

gzip_http_version 1.1;    (设置识别http协议版本,默认是1.1)

gzip_comp_level 2;    (gzip压缩比,1-9等级)

gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss;    (压缩类型,是就对哪些网页文档启用压缩功能)

#gzip_vary on;    (选项可以让前端的缓存服务器经过gzip压缩的页面)

 killall -HUP nginx

八、配置Nginx实现防盗链功能

资源主机设置防盗链

 配置说明:

valid_referers 设置信任网站

none 浏览器中referer(Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理)为空的情况,就直接在浏览器访问图片

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

 修改主配置文件 vim /usr/local/nginx/conf/nginx.conf

在server内添加

 location ~* \.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ {   (匹配以这些格式结尾的)

valid_referers none blocked *.source.com source.com;    (设置信任的网站)

if ($invalid_referer) {                    (判断除了信任以外的)

rewrite ^/ http://www.source.com/error.jpg;          (转到一个错误图片上)

#return 403;

}

}

killall -HUP nginx

九、对FPM模块进行参数优化

pm    (使用哪种方式启动fpm进程,可以说static和daynamic,前者将产生固定数量的fpm进程,后者以动态的方式产生fpm进程)

pm._max_children  (static放手机下开启的fpm进程数)

pm.start_servers    (动态方式下初始的fpm进程数量)

pm.min_spare_servers  (动态方式下最最小的fpm空闲进程数)

pm.max_spare_servers    (动态方式下最大的fpm空闲进程数)  

vim /usr/local/php5/etc/php-fpm.conf

pm = dynamic

pm.start_servers = 5

pm.min_spare_servers = 2

pm.max_spare_servers = 8

十、Nginx为目录添加访问控制

用户访问控制:使用apache的htpasswd创建密码文件

yum -y install httpd-tools  (安装httpd-tools)

htpasswd -c /usr/local/nginx/.htpasswd laowang  (指定一个保存用户和密码的位置 。-c是创建,如果创建一次之后,以后不可以再加-c,会覆盖原文件)

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

location /status {

stub_status on;
access_log off;  
auth_basic "NginxStatus";     (basic为认证类型,一种为摘要认证,另一种为基本【基准认证】认证,basic为基本认证,摘要 认证很多浏览器不支持) 
auth_basic_user_file /usr/local/nginx/.htpasswd;  (指定认证文件名)
}

killall -HUP nginx

客户端地址访问控制:

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

在上一条location里添加

allow IP;  (允许IP)

deny IP;  (拒绝IP)

也可添加网段短格式,192.168.200.0/24

十一、自定义错误页面

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

在server内添加

error_page 403 404              /404.html;

location = /404.html {

root html;

}

建立错误 页面文件(根据要求定义页面内容)

vim  /usr/local/nginx/html/404.html

killall -HUP nginx

十二、自动索引

cd /usr/local/nginx/html/  (进入nginx网页存放目录)

mkdir  123/abc{1..10} -p  (在文件夹内创建abc1-10个文件夹)

touch 123/abc1/1.txt    (建立测试文件)

编辑主配置文件

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

在server内添加

location /123 {

autoindex on;

}

killall -HUP nginx

当访问123的时候会显示目录,点击可以下载目录内内容

十三、通过UA实现手机端和电脑端的分离

实现nginx区分pc和手机访问不同的网站,是两套网站,移动和PC各一套,两套网站需要单独维护

一套PC版放在/usr/loca/nginx/html/web,一套移动版放在/usr/local/nginx/htnl/mobile

1移动端访问,实现不同的客户端访问不同内容(判断 $http_user_agent 【有浏览器和客户端相关信息】变量

cd /usr/local/nginx/html  (进入网页存放目录)

mkdir web mobile      (建立两个文件夹)

vim web/index.html      (建立pc端访问页面)

vim mobile/index.html    (建立手机端访问页面)

vim /usr/local/nginx/conf/nginx.conf  (修改主配置文件)

location / {

root /usr/local/nginx/html/web;  (默认PC端访问内容

if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )

{

root /usr/local/nginx/html/mobile;  ( 如果是手机移动端访问内容

}

index index.html index.htm;

}

killall -HUP nginx

2不同浏览器访问到不同的页面

mkdir firefox msie

vim firefox/index.html

vim msie/index.html

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

location / {

if ($http_user_agent ~ Firefox) {    (如果浏览器匹配Firefox访问firefox)

root /usr/local/nginx/html/firefox;

}

if ($http_user_agent ~ MSIE) {    (如果浏览器匹配MISE访问msie)

root /usr/local/nginx/html/msie;

}

index  index.html index.htm;

}

killall -HUP nginx

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这