Tag Archive: nginx

六月 7th, 2018

首先,你得有台云主机Vps。国内的话有阿里云、腾讯云这些。由于一些不可描述的原因,我选择的是部署在香港的 VPS,懂的都懂,其实我这台 VPS 主要是服务于 SS。当然一台买了这个 VPS 只拿来做 SS 服务有点浪费啊,而且部署在 github page 上的静态博客访问其实挺慢的,然后因为不想备案的原因,还无法用到国内大厂的 CDN 加速服务,于是萌生了干脆把博客静态指向到 VPS 的 IP 算了。

然后你还得买个域名,这总不能用 IP 来访问吧,太low。

安装 Nginx

在这里就不累赘了

配置 Nginx

配置文件在 /etc/nginx/nginx.conf

其中配置了两个 server,一个 80 端口的是 HTTP,一个 443 端口的是 HTTPS,这里强制让 80 端口重定向到了 HTTPS。

user root;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable “msie6”;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
#include /etc/nginx/conf.d/*.conf;
#include /etc/nginx/sites-enabled/*;
server {
listen 80;
server_name www.anany.vip anany.vip;
return 301 https://$server_name$request_uri;
}
server{
server_name www.anany.vip anany.vip;
listen 443;
location / {
root /root/blog/pages;
index index.html;
}
ssl on;
ssl_certificate /etc/nginx/anany.vip_bundle.crt;
ssl_certificate_key /etc/nginx/anany.vip.key;
}
}
十月 30th, 2017

1  概述


本文将介绍ngx_http_upstream_module模块和ngx_stream_core_module模块这两个模块实现nginx的调度功能。nginx可以通过proxy功能,实现将不同内容的访问调度到对应的机器上。实现了应用级的调度,相关内容见博客《Nginx  之  实现代理功能》


2  ngx_http_upstream_module模块


该模块用于将多个服务器定义成服务器组,而由proxy_pass,fastcgi_pass等指令进行引用.注意,如果nginx上有设置了proxy_cache.那么访问的资源如果在nginx上已经有缓存了,将不会把请求转发给后台的服务器,直接把将缓存返回给客户端,就不会有调度的执行,可能同一访问的得到的结果是相同的。

.1、upstream 

upstream  name { … }

定义后端服务器组,会引入一个新的上下文,默认调度算法是wrr

Context: http

1
2
3
4
5
upstream httpdsrvs{
server ...
server...
...
}

.2、server

server  address [parameters];

在upstream上下文中server成员,以及相关的参数;Context:upstream

address的表示格式:

unix:/PATH/TO/SOME_SOCK_FILE

IP[:PORT]

HOSTNAME[:PORT]

parameters:

weight=number 权重,默认为1

max_conns连接后端报务器最大并发活动连接数,1.11.5后支持

max_fails=number失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用,默认为1

fail_timeout=time后端服务器标记为不可用状态的连接超时时长,默认10s

backup将服务器标记为“备用”,即所有服务器均不可用时才启用,相当于是sorry server,提示用户,注意,这里backup不要用80端口,用其他的虚拟主机来充当sorry server,如再开一个端口8000

down标记为“不可用”,配合ip_hash使用,实现灰度发布,灰度发布,指分批进行发布上线。

.3、ip_hash

源地址hash调度方法

根据源地址进行调度,同一个源的客户端调度到同一台主机

.4、least_conn

最少连接调度算法,当server拥有不同的权重时其为wlc,当所有后端主机连接数相同时,则使用wrr,适用于长连接

.5、hash 

hash   key [consistent]基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者组合

作用:将请求分类,同一类请求将发往同一个upstream server,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器(如varnish)时使用

hash $request_uri  consistent; #其中,consistent一致性的hash

hash $remote_addr;

.6、keepalive 连接数N;

keepalive n;

为每个worker进程保留的空闲的长连接数量,可节约nginx端口,并减少连接管理的消耗

.7、health_check 

health_check [parameters];

健康状态检测机制;只能用于location上下文

常用参数:

interval=time检测的频率,默认为5秒

fails=number:判定服务器不可用的失败检测次数;默认为1次

passes=number:判定服务器可用的失败检测次数;默认为1次

uri=uri:做健康状态检测测试的目标uri;默认为/

match=NAME:健康状态检测的结果评估调用此处指定的match配置块

注意:仅对nginxplus有效,nginxplus为商业版,需要付费

.8  match

match name { … }

对backendserver做健康状态检测时,定义其结果判断机制;只能用于http上下文

.常用的参数:

status  code[ code …]: 期望的响应状态码

headerHEADER[operator value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较

body:期望响应报文的主体部分应该有的内容

注意:仅对nginx plus有效

例子

http配置段如下

1
2
3
4
5
6
7
8
9
10
11
12
13
vim  /etc/nginx/nginx.conf
http {
......
    upstream websrvs {
        server 172.18.50.61:80 weight=1;
        #server 172.18.50.61:80 weight=1 down;
        server 172.18.50.65:80 weight=2;
        server 127.0.0.1:8000 backup;
        #ip_hash;
        #least_conn;
        #hash $request_uri;
            
}

server配置段如下

1
2
3
    location / { 
        proxy_pass http://websrvs;
   }

3  ngx_stream_core_module模块

实现代理基于TCP,UDP (1.9.13),UNIX-domain sockets的数据流。工作于传输层的反向代理或调度器,这个是和http配置段平行的配置。

.1  proxy_pass

proxy_pass  address;指定后端服务器地址

.2  proxy_timeout

proxy_timeout  timeout;无数据传输时,保持连接状态的超时时长,默认为10m

.3 proxy_connect_timeout

proxy_connect_timeout  time;设置nginx与被代理的服务器尝试建立连接的超时时长,默认为60s

4  语法格式

.4.1、stream{ … }

定义stream相关的服务;Context:main

1
2
3
4
5
6
7
8
9
10
11
stream {
upstream telnetsrvs{
server 192.168.22.2:23; 
server 192.168.22.3:23; 
least_conn;
}
server {
listen 10.1.0.6:23;
proxy_pass  telnetsrvs;
}
}

.4.2、listen

1
listen address:port [ssl] [udp][proxy_protocol]  [backlog=number] [bind][ipv6only=on|off] [reuseport] [so_keepalive=on|off [keepidle]:[keepintvl]:[keepcnt]];

5  示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim  /etc/nginx/nginx.conf
stream {
upstream telnetsrvs {
    server 172.18.50.61:23;
    server 172.18.50.75:23;
    least_conn;
        }
server {
    listen  2323; #注意,这里的端口不能是代理服务器上已经使用的端口,如23,否则将不会调度
proxy_pass telnetsrvs;
proxy_timeout 60s;
proxy_connect_timeout10s;
        }
}

TAGS:
八月 31st, 2017

安装 macOS 10.13 之后发现 nginx 产生了 502 错误,具体解决方式记录如下:

打开 nginx error log

注:
此处 nginx 使用的是 brew 安装的 nginx ,使用其他工具或不同时间安装的 nginx ,在查看 nginx error log 时具体操作可能不同。

我的nginx默认并没有打开 error log,编辑 nginx.conf,打开error log

error_log  logs/error.log;

此时,运行一下sudo nginx 会在/usr/local/Cellar/nginx/1.12.0_1/logs 下产生error.log 文件,

打开 error log 发现错误信息如下:

[error] 1676#0: *1 kevent() reported that connect() failed (61: Connection refused) while connecting to upstream, client: 127.0.0.1, server: www, request: “GET / HTTP/1.1”, upstream: “fastcgi://127.0.0.1:9000”, host: “www

检查php-fpm

运行sudo php-fpm 报错如下:

[30-Aug-2017 14:33:37] ERROR: failed to open configuration file ‘/private/etc/php-fpm.conf’: No such file or directory (2)

[30-Aug-2017 14:33:37] ERROR: failed to load configuration file ‘/private/etc/php-fpm.conf’

[30-Aug-2017 14:33:37] ERROR: FPM initialization failed

确定原因为php-fpm 配置文件丢失

在/private/etc/ 找到了php-fpm 的默认配置文件/private/etc/php-fpm.comf.default ;

复制,新建一份配置文件:

sudo cp /private/etc/php-fpm.comf.default /private/etc/php-fpm.conf

  • 1

再次运行sudo php-fpm 报错如下

/private/etc/php-fpm.conf

[30-Aug-2017 15:19:50] WARNING: Nothing matches the include pattern ‘/private/etc/php-fpm.d/*.conf’ from /private/etc/php-fpm.conf at line 125.

[30-Aug-2017 15:19:50] ERROR: failed to open error_log (/usr/var/log/php-fpm.log): No such file or directory (2)

[30-Aug-2017 15:19:50] ERROR: failed to post process the configuration

[30-Aug-2017 15:19:50] ERROR: FPM initialization failed

进入/private/etc/php-fpm.d ,复制新建一份配置文件:

sudo cp /private/etc/php-fpm.d/www.conf.default /private/etc/php-fpm.d/www.conf

修改 php-fpm log 默认保存位置

编辑sudo vim /private/etc/php-fpm.conf

error_log = /usr/local/var/log/php-fpm.log

再次执行sudo php-fpm ,无错误提示。

重新启动 nginx:

sudo nginx -s stopsudo nginx

发现502错误 已解决

 

TAGS: , ,
八月 27th, 2017

关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的彻底的防盗链!

一般,我们做好防盗链之后其他网站盗链的本站图片就会全部失效无法显示,但是您如果通过浏览器直接输入图片地址,仍然会显示图片,仍然可以右键图片另存为下载文件!

依然可以下载?这样就不是彻底的防盗了!那么,nginx应该怎么样彻底地实现真正意义上的防盗链呢?

首先,我们来看下nginx如何设置防盗链

如果您使用的是默认站点,也就是说,您的站点可以直接输入服务器IP访问的,使用root登录,修改 /usr/local/nginx/conf/nginx.conf 这个配置文件。

如果您新建了站点,那么修改/usr/local/nginx/conf/vhost/你的域名.conf 这个配置文件,找到:

1
2
3
4
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
 expires      30d;
}

把这一段删掉,修改成:

1
2
3
4
5
6
7
8
location ~* \.(gif|jpg|png|jpeg)$ {
    expires     30d;
        valid_referers none blocke *.hugao8.com www.hugao8.com m.hugao8.com *.baidu.com *.google.com;
    if ($invalid_referer) {
    rewrite ^/ http://ww4.sinaimg.cn/bmiddle/051bbed1gw1egjc4xl7srj20cm08aaa6.jpg;
    #return 404;
    }
}

第一行: location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

其中“gif|jpg|jpeg|png|bmp|swf”设置防盗链文件类型,自行修改,每个后缀用“|”符号分开!

第三行:valid_referers none blocked *.it300.com it300.com;

就是白名单,允许文件链出的域名白名单,自行修改成您的域名!*.it300.com这个指的是子域名,域名与域名之间使用空格隔开!

第五行:rewrite ^/ http://www.it300.com/static/images/404.jpg;

这个图片是盗链返回的图片,也就是替换盗链网站所有盗链的图片。这个图片要放在没有设置防盗链的网站上,因为防盗链的作用,这个图片如果也放在防盗链网站上就会被当作防盗链显示不出来了,盗链者的网站所盗链图片会显示X符号。

这样设置差不多就可以起到防盗链作用了,上面说了,这样并不是彻底地实现真正意义上的防盗链!

我们来看第三行:valid_referers none blocked *.it300.com it300.com;

valid_referers 里多了“none blocked”

我们把“none blocked”删掉,改成

valid_referers  *.it300.com it300.com;

 

nginx彻底地实现真正意义上的防盗链完整的代码应该是这样的:

1
2
3
4
5
6
7
8
location ~* \.(gif|jpg|png|jpeg)$ {
    expires     30d;
    valid_referers *.hugao8.com www.hugao8.com m.hugao8.com *.baidu.com *.google.com;
    if ($invalid_referer) {
    rewrite ^/ http://ww4.sinaimg.cn/bmiddle/051bbed1gw1egjc4xl7srj20cm08aaa6.jpg;
    #return 404;
    }
}

这样您在浏览器直接输入图片地址就不会再显示图片出来了,也不可能会再右键另存什么的。

第五行:rewrite ^/ http://www.it300.com/static/images/404.jpg;

这个是给图片防盗链设置的防盗链返回图片,如果我们是文件需要防盗链下载,把第五行:

rewrite ^/ http://www.it300.com/static/images/404.jpg;

改成一个链接,可以是您主站的链接,比如把第五行改成:

rewrite ^/ http://www.it300.com;

这样,当别人输入文件下载地址,由于防盗链下载的作用就会跳转到您设置的这个链接!

最后,配置文件设置完成别忘记重启nginx生效!

TAGS: ,
七月 30th, 2017
做运维的朋友经常会有一些烦恼,比如网站总是被人抄袭,比如网站总是被人引用上面的图片,虽然一张图两张图,并不耗费很多流量,但一旦引用的人多了,这个还是比较废流量的。

防盗链就是禁止其他网站引用自己网站资源而做的一系列设置,优点就不需要说了,绝多数就是防止资源浪费,特别是有宽带、流量限制的空间如果不做一些 限制可能就光引用自己网站图片、视频等等资源可能会消耗很大一部分流量。本文就简单的说一下在nginx服务器上如何做防盗链设置。

第1步:下载nginx网站配置文件。

有些网友可能是直接到服务器中使用vi或ee编辑器,另外网站配置有些可能是在nginx.conf文件中或是在vhost目录下,具体要看nginx.conf文件是如何配置的了。

第2步:添加以下代码,并保存。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
access_log off;
valid_referers none blocked  *.85v5.com *.91aiche.cn *.juuzhong.com;
if ($invalid_referer){
rewrite ^/ http://centoscn.com/images/logo.gif;
}
}

第3步:重启Nginx
把保存网站配置文件上传并覆盖,到终端执行/etc/init.d/nginx reload重新启动nginx即可生效。

配置解释
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
#在客户浏览器缓存30天
access_log off;
#以上扩展名文件(gif|jpg|jpeg|png|bmp|swf)不写入日志文件中。
valid_referers none blocked  *.85v5.com *.91aiche.cn *.juuzhong.com;
#valid_referers none blocked允许访问的域名站点,后台就是跟着域名多个域名空格隔开。
#none 匹配没有Refer的访问,简单的说就是直接用URL访问这些扩展名的资源。
#blocked 支持域名前缀。
#除了允许直接访问的域名外,其他域名直接访问就直接显示下面的这种图片。
if ($invalid_referer){
rewrite ^/ http://centoscn.com/images/logo.gif;
}
}
这样设置过后,别人想要引用你网站里面的图片时候,就会发现,引用出来的图片都不是想要的了。

TAGS: ,
十二月 19th, 2016

关于Nginx

Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

CentOS 7 条件

教程中的步骤需要root用户权限。

1.添加Nginx到YUM源

添加CentOS 7 Nginx yum资源库,打开终端,使用以下命令:

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

2.安装Nginx

在你的CentOS 7 服务器中使用yum命令从Nginx源服务器中获取来安装Nginx:

sudo yum install -y nginx

Nginx将完成安装在你的CentOS 7 服务器中。

3.启动Nginx

刚安装的Nginx不会自行启动。运行Nginx:

sudo systemctl start nginx.service

如果一切进展顺利的话,现在你可以通过你的域名或IP来访问你的Web页面来预览一下Nginx的默认页面;

nginx_default

如果看到这个页面,那么说明你的CentOS 7 中 web服务器已经正确安装。

CentOS 7 开机启动Nginx

sudo systemctl enable nginx.service

更多systemctl命令可查看《systemctl命令用法

Nginx配置信息

网站文件存放默认目录

/usr/share/nginx/html

网站默认站点配置

/etc/nginx/conf.d/default.conf

自定义Nginx站点配置文件存放目录

/etc/nginx/conf.d/

Nginx全局配置

/etc/nginx/nginx.conf

在这里你可以改变设置用户运行Nginx守护程序进程一样,和工作进程的数量得到了Nginx正在运行,等等。

Linux查看公网IP

您可以运行以下命令来显示你的服务器的公共IP地址:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
原文链接:http://www.9696e.com/archives/1404
十一月 16th, 2016

背景介绍

wKioL1grLJ_SbkTPAACI6-JB-zA816.png

前面介绍了LAMP架构下各个组件的编译安装,此时在httpd服务器上创建一个www.123.com的虚拟主机

wKioL1grLJ_wLqNxAABtH9_LOnc794.png

在php服务器上创建相同的根目录,并目录下创建一个index.php文件

# mkdir -p /usr/local/apache/docs/123.com

# vim /usr/local/apache/docs/123.com/index.php

spacer.gifwKiom1grLKDQ70kbAAAGuKNZT-c678.png

再使用172.16.10.40/24的客户端安装apache服务,并修改/etc/hosts文件,指定www.abc.com的IP地址为172.16.10.10/24后,通过ab工具假设50个用户和500个请求的情况下,得出每秒响应19.72个请求,为了优化性能,就需要用到xcache工具

# ab -c 50 -n 500 http://www.123.com/index.php

wKioL1grLKCx7M5-AABsuP2IHWk305.png

xcache介绍

xcache是一个开源的opcode缓存器/优化器, 这意味着他能够提高服务器上的PHP性能。他通过把编译PHP后的数据缓冲到共享内存从而避免重复的编译过程, 能够直接使用缓冲区已编译的代码从而提高速度,降低服务器负载

安装xcache

xcache作为php的扩展模块,没有自己的configure脚本,所以需要使用已安装的php程序目录中的phpize,phpize是php一个专门的模块,用来编译php的额外扩展功能

1.解压xcache,并在xcache目录下运行phpize

# tar -xf xcache-3.2.0.tar.bz2 -C /usr/local/src

# cd /usr/local/src/xcache-3.2.0/

# /usr/local/php/bin/phpize

wKiom1grLKDBVqvRAAAqyiw1tH8416.png

2.运行phpize后,当前目录下会生成一个configure脚本,编译安装

# ./configure –enable-xcache –with-php-config=/usr/local/php/bin/php-config

# make && make install

安装完成后,它会安装一个php扩展模块,并显示安装目录

wKiom1grLKGT9ubWAAAkl58--ps238.png

在该目录下能看到xcache.so文件

wKioL1grLKGBCH08AAAcduLX85M737.png

3.在源码包内找到xcache的配置文件,整合php和xcache

# cp xcache.ini /etc/php.d/

# vim /etc/php.d/xcache.ini

wKiom1grLKSQNDqKAAAluI-p6JM218.png

4.重启httpd服务,再打开页面会看到xcache已经被加载

wKioL1grLKTR4wMtAAAMoeAl8j8241.png

效果测试

再使用ab工具模拟50用户,500请求测试响应速度,可以看到每秒的请求响应速度提升到了87.73,至此测试完成

# ab -c 50 -n 500 http://www.123.com/index.php

wKiom1grLKWixANbAABtpDbL-80549.png

TAGS: ,
十月 3rd, 2016

这篇教程说明你应该怎样配置 nginx、设置 HTTP 头部过期时间,用 Cache-Control 中的 max-age 标记为静态文件(比如图片、 CSS 和 Javascript 文件)设置一个时间,这样用户的浏览器就会缓存这些文件。这样能节省带宽,并且在访问你的网站时会显得更快些(如果用户第二次访问你的网站,将会使用浏览器缓存中的静态文件)。

1、准备事项

我想你需要一个正常工作的 nginx 软件,就像这篇教程里展示的:在 Ubuntu 16.04 LTS 上安装 Nginx,PHP 7 和 MySQL 5.7 (LEMP)。

2 配置 nginx

可以参考 expires 指令手册来设置 HTTP 头部过期时间,这个标记可以放在 http {}server {}location {} 等语句块或者 location {} 语句块中的条件语句中。一般会在 location 语句块中用 expires 指令控制你的静态文件,就像下面一样:

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

在上面的例子中,所有后缀名是 .jpg.jpeg.png.gif.ico.css.js 的文件会在浏览器访问该文件之后的 365 天后过期。因此你要确保 location {} 语句块仅仅包含能被浏览器缓存的静态文件。

然后重启 nginx 进程:

  1. /etc/init.d/nginx reload

你可以在 expires 指令中使用以下的时间设置:

  • offExpiresCache-Control 头部不能被更改。
  • epochExpires 头部设置成 1970 年 1 月 1 日 00:00:01。
  • max 设置 Expires 头部为 2037 年 12 月 31 日 23:59:59,设置 Cache-Control 的最大存活时间为 10 年
  • 没有 @ 前缀的时间意味着这是一个与浏览器访问时间有关的过期时间。可以指定一个负值的时间,就会把 Cache-Control 头部设置成 no-cache。例如:expires 10d 或者 expires 14w3d
  • @ 前缀的时间指定在一天中的某个时间过期,格式是 Hh 或者 Hh:Mm,H 的范围是 0 到 24,M 的范围是 0 到 59,例如:expires @15:34

你可以用以下的时间单位:

  • ms: 毫秒
  • s: 秒
  • m: 分钟
  • h: 小时
  • d: 天
  • w: 星期
  • M: 月 (30 天)
  • y: 年 (365 天)

例如:1h30m 表示一小时三十分钟,1y6M 表示一年六个月。

注意,要是你用一个在将来很久才会过期的头部,当组件修改时你就要改变组件的文件名。因此给文件指定版本是一个不错的方法。例如,如果你有个 javascript.js 文件 并且你要修改它,你可以在修改的文件名字后面添加一个版本号。这样浏览器就要下载这个文件,如果你没有更改文件名,浏览器将从缓存里面加载(旧的)文件。

除了把基于浏览器访问时间设置 Expires 头部(比如 expires 10d)之外,也可以通过在时间前面的 modified 关键字,将 Expires 头部的基准设为文件修改的时间(请注意这仅仅对存储在硬盘的实际文件有效)。

  1. expires modified 10d;

3 测试

要测试你的配置是否有效,可以用火狐浏览器的开发者工具中的网络分析功能,然后用火狐访问一个静态文件(比如一张图片)。在输出的头部信息里,应该能看到 Expires 头部和有 max-age 标记的 Cache-Control 头部(max-age 标记包含了一个以秒为单位的值,比如 31536000 就是指今后的一年)

4 链接

nginx 的 Http 头部模块(HttpHeadersModule): http://wiki.nginx.org/HttpHeadersModule

TAGS: ,
九月 5th, 2016

一、安装前的准备工作

1、yum update #更新系统

2、yum install gcc gcc-c++ autoconf automake cmake bison m4 libxml2 libxml2-devel libcurl-devel libjpeg-devel libpng-devel libicu-devel #安装php、MySQL、Nngix所依赖的包

3、下载以下包 #我把所有源文件都下载在root目录,读者可自行修改源文件存放目录

3.1 libmcrypt-2.5.8.tar.gz

3.2 mcrypt-2.6.8.tar.gz

3.3 mhash-0.9.9.9.tar.gz

3.4 zlib-1.2.8.tar.gz

解压并安装如:

1
2
3
4
#tar -zvxf libmcrypt-2.5.8.tar.gz
#cd libmcrypt-2.5.8
#./configure
#make && make insatll

4、在安装软件时如果提示有什么依赖包没有安装的可以再执行yum install * -y (*表示相关包)

二、编译安装Nginx

1、去官网http://nginx.org/en/download.html下载最nginx-1.10.1.tar.gz的稳定版本

2、编译步骤如下

1、通过winSCP上传nginx-1.10.1.tar.gz到/root目录下

1.1 groupadd -r nginx #新建nginx组

1.2 useradd -r -g nginx -s /bin/false nginx #新建无登录权限的nginx用户

1.3 id nginx #查看nginx组及用户

2、tar -zvxf nginx-1.10.1.tar.gz

3、cd nginx-1.10.1

4、可通过./configure –help查看编译配置参数,也可参考http://nginx.org/en/docs/configure.html,下列参数要写在一行中

1
2
3
4
5
6
7
./configure
    --prefix=/usr/local/nginx
    --modules-path=/usr/local/nginx/modules
    --with-http_ssl_module
    --pid-path=/usr/local/nginx/nginx.pid
    --user=nginx
    --group=nginx

5、make && make install #编译并安装

6、启动nginx

6.1 cd /usr/local/nginx

6.2 sbin/nginx #启动,可使用sbin/nginx -?查看nginx相关操作命令

7、在/usr/lib/systemd/system目录下新建nginx.service文件,这样就可以通过systemctl stop|start|reload nginx.service来操作nginx,也可参考https://www.nginx.com/resources/wiki/start /topics/examples/systemd/,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
   Description=The NGINX HTTP and reverse proxy server
   After=syslog.target network.target remote-fs.target nss-lookup.target
   [Service]
   Type=forking
   PIDFile=/usr/local/nginx/nginx.pid
   ExecStartPre=/usr/local/nginx/sbin/nginx -t
   ExecStart=/usr/local/nginx/sbin/nginx
   ExecReload=/usr/local/nginx/sbin/nginx -s reload
   ExecStop=/usr/local/nginx/sbin/nginx -s stop
   PrivateTmp=true
   [Install]
   WantedBy=multi-user.target

三、编译安装MySQL

1、去官网http://dev.mysql.com/Downloads/MySQL-5.7/mysql-boost-5.7.14.tar.gz下载带boost的5.7.14版本

2、编译步骤如下

1、用winSCP上传mysql-boost-5.7.14.tar.gz到/root目录下

2、groupadd mysql

3、useradd -r -g mysql -s /bin/false mysql

4、用cmake编译mysql, 相关参数可以参考https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html,下列参数要写在一行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cmake
    -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
    -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock
    -DSYSCONFDIR=/usr/local/mysql/etc
    -DSYSTEMD_PID_DIR=/usr/local/mysql
    -DDEFAULT_CHARSET=utf8
    -DDEFAULT_COLLATION=utf8_general_ci
    -DWITH_INNOBASE_STORAGE_ENGINE=1
    -DWITH_ARCHIVE_STORAGE_ENGINE=1
    -DWITH_BLACKHOLE_STORAGE_ENGINE=1
    -DWITH_PERFSCHEMA_STORAGE_ENGINE=1
    -DMYSQL_DATADIR=/usr/local/mysql/data
    -DWITH_BOOST=boost
    -DWITH_SYSTEMD=1

5、make && make install

6、配置mysql并初始化数据库

6.1 cd /usr/local/mysql #进入编译目录

6.2 chown -R mysql . #修改目录所有者

6.3 chgrp -R mysql . #修改目录组

6.4 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld #配置mysqld服务

6.5 cp /usr/local/mysql/support-files/my-default.cnf /usr/local/mysql/my.cnf #配置my.cnf

6.5.1 复制以下内容到my.cnf文件中的[mysqld]下

1
2
3
4
5
6
user = mysql
        basedir = /usr/local/mysql
        datadir = /usr/local/mysql/data
        port = 3306
        server_id = /usr/local/mysql/mysqld.pid
        socket = /usr/local/mysql/mysql.sock

6.5 chkconfig mysqld on #设置mysqld开机自启

6.6 bin/mysqld –initialize-insecure –user=mysql –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data #初始化数据库

6.7 bin/mysqld –user=mysql & #启动mysql, 如果报Please read “Security” section of the manual to find out how to run mysqld as root!,就在my.cnf中加入user=root, 表示以root用户启动

7、修改root用户登录密码并允许root用户远程登录

7.1 mysql -u root –skip-password

7.2 ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘123456’;

7.3 允许root用户远程登录

7.3.1 use mysql;

7.3.2 update user set host=’%’ where user=’root’ and host=’localhost’; #允许       (update user set host=’localhost’ where user=’root’; #禁用)

7.3.3 flush privileges;

7.3.4 service mysqld restart

8、解决service mysqld start|stop报MySQL server PID file could not be found!或者Couldn’t find MySQL server (/usr/local/mysql/bin/mysqld_safe), 其实可通过阅读此文件解决相关错误

8.1 chmod 777 /usr/local/mysql #因我设置mysqld.pid文件保存在/usr/local/mysql目录,所以保证其有可写权限

8.2 通过winSCP修改/etc/init.d/mysqld文件

8.2.1 basedir=/usr/local/mysql #手动指定

8.2.2 datadir=/usr/local/mysql/data #手动指定

8.2.3 mysqld_pid_file_path=/usr/local/mysql/mysqld.pid #手动指定

8.2.4 把此文件中所有未注释的含有mysqld_safe的字符替换成mysqld

四、编译安装php

1、去官网http://php.net/downloads.php下载php7.0.10版本

2、编译步骤如下

1、用winSCP上传php-7.0.10.tar.gz到/root目录下

2、tar -zvxf php-7.0.10.tar.gz #解压

3、配置编译php参数, 可使用./configure –help命令查看所有编译配置项目, 下列参数要写在一行中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
./configure
   --prefix=/usr/local/php
   --exec-prefix=/usr/local/php
   --datadir=/usr/local/php
   --with-config-file-path=/usr/local/php/etc
   --with-mysqli=mysqlnd
   --with-pdo-mysql=mysqlnd
   --with-fpm-user=nginx
   --with-fpm-group=nginx
   --with-gd
   --with-iconv
   --enable-mbstring
   --enable-fpm
   --enable-mysqlnd

4、make && make install #编译并安装

5、cd /usr/local/php #进入编译目录

6、修改相关配置文件

6.1 cp /usr/local/php/etc/php.ini.default /usr/local/php/etc/php.ini #php.ini中相关配置依项目需要自行修改,配置nginx支持php参考http://php.net/manual/zh /install.unix.nginx.php

6.2 cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf #去掉[global]项下pid前的;

6.3 cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf #大致在23、24行修改user和group如:user = nginx,group = nginx

7、chmod 777 /usr/local/php/var/run #默认PID文件是写在/usr/local/php/var/run这个目录中,所以修改目录权限

8、sbin/php-fpm #启动php, 可通过sbin/php-fpm -h 查看相关操作命令列表

9、在/usr/lib/systemd/system目录下新建php-fpm.service文件,这样就可以通过systemctl stop|start|reload php-fpm.service来操作php-fpm,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
   Description=The PHP FastCGI Process Manager
   After=syslog.target network.target
   Before=nginx.service
   [Service]
   Type=forking
   PIDFile=/usr/local/php/var/run/php-fpm.pid
   ExecStart=/usr/local/php/sbin/php-fpm
   ExecStop=/bin/kill -QUIT `cat /usr/local/php/var/run/php-fpm.pid`
   ExecReload=/bin/kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
   PrivateTmp=true
   [Install]
   WantedBy=multi-user.target

五、至此在我的VirturBox中CentOS7.2下成功搭建了LNMP环境

TAGS: , , ,
八月 30th, 2016

一.软件介绍(apache  lighttpd  nginx)

1. lighttpd

Lighttpd 是一个具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。lighttpd是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能。
Lighttpd使用fastcgi方式运行php,它会使用很少的PHP进程响应很大的并发量。
Fastcgi的优点在于:

·从稳定性上看, fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑.

·从安全性上看, fastcgi和宿主的server完全独立, fastcgi怎么down也不会把server搞垮,

·从 性能上看, fastcgi把动态逻辑的处理从server中分离出来, 大负荷的IO处理还是留给宿主server, 这样宿主server可以一心一意作IO,对于一个普通的动态网页来说, 逻辑处理可能只有一小部分, 大量的图片等静态IO处理完全不需要逻辑程序的参与(注1)

·从扩展性上讲, fastcgi是一个中立的技术标准, 完全可以支持任何语言写的处理程序(php,java,python…)

2.apache

apache是世界排名第一的web服务器, 根据netcraft(www.netsraft.co.uk)所作的调查,世界上百分之五十以上的web服务器在使用apache.

1995 年4月, 最早的apache(0.6.2版)由apache group公布发行. apache group 是一个完全通过internet进行运作的非盈利机构, 由它来决定apache web服务器的标准发行版中应该包含哪些内容. 准许任何人修改隐错, 提供新的特征和将它移植到新的平台上, 以及其它的工作. 当新的代码被提交给apache group时, 该团体审核它的具体内容, 进行测试, 如果认为满意, 该代码就会被集成到apache的主要发行版中.

apache 的特性:

1) 几乎可以运行在所有的计算机平台上.

2) 支持最新的http/1.1协议

3) 简单而且强有力的基于文件的配置(httpd.conf).

4) 支持通用网关接口(cgi)

5) 支持虚拟主机.

6) 支持http认证.

7) 集成perl.

8) 集成的代理服务器

9) 可以通过web浏览器监视服务器的状态, 可以自定义日志.

10) 支持服务器端包含命令(ssi).

11) 支持安全socket层(ssl).

12) 具有用户会话过程的跟踪能力.

13) 支持fastcgi

14) 支持java servlets

3.nginx

Nginx 是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发.

Nginx 以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡。其拥有匹配 Lighttpd的性能,同时还没有Lighttpd的内存泄漏问题,而且Lighttpd的mod_proxy也有一些问题并且很久没有更新。但是 Nginx并不支持cgi方式运行,原因是可以减少因此带来的一些程序上的漏洞。所以必须使用FastCGI方式来执行PHP程序。

nginx做为HTTP服务器,有以下几项基本特性:

处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.

无缓存的反向代理加速,简单的负载均衡和容错.

FastCGI,简单的负载均衡和容错.

模块化的结构。包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter。
如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待。

Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率。它支持内核Poll模型,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。

Nginx 具有很高的稳定性。其它HTTP服务器,当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启 服务器。例如当前apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存 占用率非常低。nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对nginx来说基本上是毫无用处 的。就稳定性而言,nginx比lighthttpd更胜一筹。

Nginx支持热部署。它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。

二.3种WEB服务器的比较:

server Apache Nginx Lighttpd
Proxy代理 非常好 非常好 一般
Rewriter 非常好 一般
Fcgi 不好 非常好
热部署 不支持 支持 不支持
系统压力比较 很大 很小 比较小
稳定性 非常好 不好
安全性 一般 一般
技术支持 非常好 很少 一般
静态文件处理 一般 非常好
Vhosts虚拟主机 支持 不支持 支持
反向代理 一般 非常好 一般
Session sticky 支持 不支持 不支持

注:在相对比较大 的网站,节约下来的服务器成本无疑是客观的。而有些小型网站往往服务器不多,如果采用 Apache 这类传统 Web 服务器,似乎也还能撑过去。但有其很明显的弊端: Apache 在处理流量爆发的时候(比如爬虫或者是 Digg 效应) 很容易过载,这样的情况下采用 Nginx 最为合适。

建议方案:

Apache 后台服务器(主要处理php及一些功能请求 如:中文url)

Nginx  前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求)

Lighttpd 图片服务器

总体来说,随着nginx功能得完善将使他成为今后web server得主流。