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
反正就是缺什么就安装什么。
赞赏微信赞赏支付宝赞赏
发表评论