Tag Archive: nginx

8月 30th, 2022

严格来说,Apache和nginx应该叫HTTPServer,tomcat是ApplicationServer,是Servet/JSO应用的容器。hostease香港服务器商分享三者的区别:

Nginx和tomcat的区别。

nginx通常用作静态内容服务和代理服务器,直接转发给后面的应用服务器(tomcat、django等)。),tomcat更多地用于制作应用容器,让javawebapp浸泡在里面。

客户端通过HTTPServer访问存储在服务器上的资源(HTML文件、图片文件等)。),HTTPServer只是通过HTTP协议将服务器上的文件如实传输给客户端。

应用服务器通常运行在HTTPServer背后,执行应用程序,将动态内容转换为静态内容,并通过HTTPServer分发给客户端。推荐阅读:《解决SSH登录用户执行的命令部分环境变量参数不生效的问题》

Nginx和Apache的区别。

Apache是一个同步多进程模型,可以连接到一个过程,而nginx是一步,多个连接(万级)可以对应一个过程。

nginx轻量级,抗并发,处理静态文件。

Apache超稳定,对PHP的支持相对简单,nginx还需要与其他后端配合使用,在处理动态请求方面具有优势。

建议使用前端nginx抗并发,后端apache集群配合更好。

Tomcat和Apache的区别。

Apache由C语言实现,支持各种特性和模块来扩展核心功能;Tomcat由Java编写,更好地支持Servlet和JSP。推荐阅读:《Linux环境下测试VPS上传/下载网速的几种方法》

Apache也是普通服务器,只支持html静态普通网页。但是PHP可以通过插件支持。Tomcat是jsp/servlet容器,还支持HTML、JSP、ASP、PHP、CGI等。CGI需要一些手动调试,但很容易。

Apache侧重于httpserver,tomcat侧重于servlet引擎。如果以standalone的形式运行,tomcat和apache在功能上支持JSP,但对静态网页并不理想。推荐相关阅读:《linux如何添加path linux可执行文件添加到PATH环境变量的方法》

6月 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;
}
}
10月 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:
8月 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: , ,
8月 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: ,
7月 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: ,
12月 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
11月 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: ,
10月 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: ,
9月 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: , , ,