Nginx性能与安全优化以及常见问题记录

Nginx性能与安全优化以及常见问题记录

最近在学习Nginx,这里就把遇到过的问题和一些优化给记录下来。每次都积累一点,相信日后工作中肯定能很有用处吧。

1.源码编译安装 Nginx

#下载并解压源码包

wget http://nginx.org/download/nginx-1.12.2.tar.gz

tar xvf nginx-1.12.2.tar.gz  && cd  nginx-1.12.2

#安装编译环境

yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

# 添加Nginx组和用户

groupadd nginx && useradd nginx -g nginx -s /sbin/nologin -M

#配置

./configure –user=nginx  –group=nginx  –prefix=/usr/local/nginx  –with-http_ssl_module  –with-http_stub_status_module   –with-http_realip_module  –with-threads

#编译

make && make install

#验证nginx安装版本信息

/usr/local/nginx/sbin/nginx  -V

#将nginx添加到环境变量

vim /etc/profile

在最后添加
export PATH=/usr/local/nginx/sbin:$PATH

source /etc/profile

#在系统服务目录里创建nginx.service文件

vim /usr/lib/systemd/system/nginx.service

写入以下内容

[Unit]
Description=nginx
After=network.target
  
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
  
[Install]
WantedBy=multi-user.target

#参数解释如下

[Unit]:服务的说明
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3

#设置开机自启动

systemctl enable nginx.service

2.为yum安装的Nginx添加模块

Nginx一般都是编译安装,不过它本身也提供了通过yum安装的方式。因为我在阿里云服务器上一开始就是用yum的形式安装。虽然通过这一方式安装的Nginx已经可以通过系统服务的方式进行启动,相当便捷,可是之后我想要添加第三方模块却不知如何是好,看了网上的一些解决办法。

Nginx编译只生成一个二进制文件,所以获取yum安装的Nginx编译参数,之后使用同一版本的源代码进行编译,之后替换生成文件就可以了。

nginx -V         #就可以看到编译参数

 

可以看到我的版本是  1.12.2

就直接到官网去下载对应版本即可。

http://nginx.org/en/download.html

在获取同版本的nginx源码,同时也获得所需模块的源码后,在获得编译参数中加入–add-module=/path/to/module/source:

之后进行make即可。这一步千万不能 make install ;不然会把之前已经安装的nginx 覆盖掉。

编译完成之后先备份位于/usr/sbin/中的nginx文件,之后关闭nginx服务,替换文件,重启服务,一个添加了所需模块的nginx应该就能正常工作了。

3.nginx隐藏版本信息

那么如何优化呢?比如在nginx源码包解压的目录下

改源码隐藏软件名称和版本号,找到第13,14行将其修改

vim src/core/nginx.h

此时再编译安装重新启动。

make && make install

4.expires缓存调优

缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存30d,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的拓展名列出来!

Expires缓存配置在server字段里面

设置网页缓存(对静态资源过期时间设置)

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

在57行添加


location ~* .(ico|gif|bmp|jpg|jpeg|png|swf|js|css|mp3) {
  root  html;
  expires 30d;   }

expire功能优点

(1)expires可以降低所使用的带宽,节约成本

(2)同时提升用户访问体验

(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能。

5.nginx安装的时候可能出现的问题

在配置信息./configure –prefix=/usr/share/nginx 的时,出现错误:

/configure: error: the HTTP rewrite module requires the PCRE library.

解决方法:安装pcre

yum -y install pcre pcre-devel

-y 是跳过所有需要手动确认的环节

缺少ssl错误,错误信息如下:

./configure: error: the HTTP cache module requires md5 functions
from OpenSSL library.   You can either disable the module by using
–without-http-cache option, or install the OpenSSL library into the system,
or build the OpenSSL library statically from the source with nginx by using
–with-http_ssl_module –with-openssl=<path> options.

解决方法:安装openssl

yum -y install openssl openssl-devel

缺少编译器,错误信息如下:

./configure: error: C compiler cc is not found

解决方法:安装gcc-c++

yum -y install gcc-c++ autoconf automake

autoconf是自动配置,automake是自动编译
缺少zlib包,错误信息如下:

./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using –without-http_gzip_module
option, or install the zlib library into the system, or build the zlib
library
statically from the source with nginx by using –with-zlib=<path> option.

解决方法:安装zlib

yum install -y zlib-devel

确实libxml2,错误信息如下:

./configure: error: the HTTP XSLT module requires the libxml2/libxslt
libraries. You can either do not enable the module or install the libraries.

解决方法:

yum -y install libxml2 libxml2-dev
yum -y install libxslt-devel

http_image_filter_module是nginx提供的集成图片处理模块,需要gd-devel的支持,错误信息如下:

./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.

解决方法:

yum -y install gd-devel

缺少ExtUtils,错误信息如下:

./configure: error: perl module ExtUtils::Embed is required

解决方法:

yum -y install perl-devel perl-ExtUtils-Embed

缺少GeoIP,错误信息如下:

./configure: error: the GeoIP module requires the GeoIP library.
You can either do not enable the module or install the library.

解决方法:

yum -y install GeoIP GeoIP-devel GeoIP-data

反正就是缺什么就安装什么。

zgao

如果有什么技术上的问题,可以加我的qq 1761321396 一起交流。