东东东 陈煜东的博客

标签存档: nginx

nginx启用gzip压缩

网站的访问量如果越来越高,那么就需要考虑带宽的问题了,因为流量会提升一些费用成本,没有经过压缩的文本也会影响网页的加载速度。当然我目前对这个考虑还是远了,因为流量对我来说还没感受到那么大的问题。只是考虑用户提升访问速度。

当然了gzip压缩在当前HTTP传输来说还是主流的,所有的服务器应该都能启用gzip压缩才对。

对于Nginx来启用gzip很简单。打开nginx.conf配置进行编辑:

http {   #在http里面进行设置

    #开启gzip压缩
    gzip  on;

    #启用gzip压缩最小长度必须大于1kB,否则不启用压缩
    gzip_min_length 1k;

    # gzip压缩的缓冲区
    gzip_buffers 4 16k;

    # gzip压缩的等级,0-9之间,数字越大,压缩率越高,但是cpu消耗也大。
    gzip_comp_level 9;

    # 启用gzip的文件类型,一般text、css、json、javascript、xml进行压缩,image最好不要压缩了吧?
    gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    # 和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持。
    # 因此,为避免浪费不支持的也压缩,需要根据客户端的HTTP头来判断,是否需要压缩。
    gzip_vary on;

    # 好吧,IE6对gzip压缩不太好,但是应该要淘汰IE6了吧,你的受众是IE6用户,那么你也太没有魅力了。
    #gzip_disable "MSIE [1-6]\.";
}

推荐一个:http://gtmetrix.com/可以对页面访问速度进行一个打分,类似google page speed。

参考文章

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: nginx启用gzip压缩 – https://www.chenyudong.com/archives/nginx-enable-gzip.html

分类: 网站建设

Nginx上搭建WordPress及配置 完美迁移

昨天晚上20点,空间的带宽达到上限了,本来1个月才2G的流量,现在20天就跑5G,23点才发现网站不能访问。赶紧将www.daoiqi.com域名解析转成日本的Linode服务器上,但是博客却还没有迁移,因为要在Nginx上搭建WordPress比较麻烦,需要配置一些东西。

今天趁着零碎的时间,终于把博客给迁移到Nginx上了。这篇文章是参考http://codex.wordpress.org/Nginx,官网给出的配置,我这里没办法使用,但是我已经解决了。

第一步:上传代码

将代码上传到服务器,目录/data/www/chenyudong.com/wwwroot

第二步:设置Nginx.conf

修改nginx.conf文件,它可能在/etc/nginx/nginx.conf或者/usr/local/nginx/conf/nginx.conf下,看你的具体情况。本文假定在/usr/local/nginx/conf/nginx.conf目录下。

# Generic startup file.
user {user} {group};

#ususally equal to number of CPU's you have. run command "grep processor /proc/cpuinfo | wc -l" to find it
worker_processes  2;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

# Keeps the logs free of messages about not being able to bind().
#daemon     off;

events {
    worker_connections  1024;
}

http {
#   rewrite_log on;

    include mime.types;
    default_type       application/octet-stream;
    access_log         /var/log/nginx/access.log;
    sendfile           on;
#   tcp_nopush         on;
    keepalive_timeout  3;
#   tcp_nodelay        on;
#   gzip               on;
        #php max upload limit cannot be larger than this
    client_max_body_size 13m;
    index              index.php index.html index.htm;

    # Upstream to abstract backend connection(s) for PHP.
    upstream php {
        #this should match value of "listen" directive in php-fpm pool
        #server unix:/tmp/php-fpm.sock;
        server 127.0.0.1:9000;
    }

    include sites-enabled/*;
}

对着你的Nginx.conf的配置,参考一下这个配置

  • 其中33~37行,这个是php-fpm的一些设置,php-fpm是运行php用的一个cgi,一般都用这个;
  • 第39行,这个是为了添加多个站点使用的,以后新增站点就不用修改nginx.conf,直接在sites-enabled目录下添加一个nginx的配置即可

我的机器上,只有监听127.0.0.1:9000端口进行php的处理,没有/tmp/php-fpm.sock这个sock,所以我将上面的一行给注释了。如果没有注意到,这里会出现403 Forbidden的错误。

每个站点的设置

你肯定是有多个站点的吧,不可能装一个nginx就跑一个网站。新建一个文件/usr/local/nginx/conf/sites-enabled/chenyudong.conf。注意文件的位置,是在conf/sites-enabled目录下面。

# Redirect everything to the main site. We use a separate server statement and NOT an if statement - see http://wiki.nginx.org/IfIsEvil
server {
        server_name  _;
        rewrite ^ $scheme://mysite.com$request_uri redirect;
}

server {
    server_name www.chenyudong.com;
    root /data/www/chenyudong.com/wwwroot;

    include global/restrictions.conf;

    # Additional rules go here.

    # Only include one of the files below.
    include global/wordpress.conf;
#   include global/wordpress-ms-subdir.conf;
#   include global/wordpress-ms-subdomain.conf;
}

我们注意到11行include了一个文件,17行include了一个文件。这两个文件因为比较具有通用性,所以将其单独提取出来,方便以后多个站点进行include,减少重复的编写。

第三步:编写restrictions.conf

新建一个文件夹/usr/local/nginx/conf/global/,并在这个目录下新建一个文件restrictions.conf,绝对路径为/usr/local/nginx/conf/global/restrictions.conf。

这个配置是给限制一些文件的访问的。

# Global restrictions configuration file.
# Designed to be included in any server {} block.</p>
location = /favicon.ico {
    log_not_found off;
    access_log off;
}

location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~ /\. {
    deny all;
}

# Deny access to any files with a .php extension in the uploads directory
# Works in sub-directory installs and also in multisite network
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
}

文件说明:

  • 比如favicon.ico这个文件,一个网站的icon,就不用访问日志了,打出来也是浪费。robots.txt这个文件是给搜索引擎看得,也没必要打log
  • .开头的隐藏文件也禁止访问,这里面有重要的信息,比如 .htaccess, .htpasswd, .DS_Store (Mac).
  • uploads或者files下的php禁止访问,通常这个目录的意义是用户上传的一些文件,为了保证安全,防止用户上传可运行的脚本,禁止其访问。

通用的WordPress设置,配置文件

# WordPress single blog rules.
# Designed to be included in any server {} block.

# This order might seem weird - this is attempted to match last if rules below fail.
# http://wiki.nginx.org/HttpCoreModule
location / {
    index        index.php index.html index.htm;
    try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Directives to send expires headers and turn off 404 error logging.
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
       access_log off; log_not_found off; expires max;
}

# Uncomment one of the lines below for the appropriate caching plugin (if used).
#include global/wordpress-wp-super-cache.conf;
#include global/wordpress-w3-total-cache.conf;

# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ \.php$ {
    # Zero-day exploit defense.
    # http://forum.nginx.org/read.php?2,88845,page=3
    # Won't work properly (404 error) if the file is not stored on this server, which is entirely possible with php-fpm/php-fcgi.
    # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on another machine.  And then cross your fingers that you won't get hacked.
    try_files $uri =404;

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#   fastcgi_intercept_errors on;
    fastcgi_pass php;
}

注意到第7行,指明默认的首页的文件名是什么。我之前没有这一样,在nginx.conf里,也没有为站点做设置,结果访问http://www.chenyudong.com/index.html跳转到了http://www.chenyudong.com/,但是因为没有指定index的文件,导致又一个403 Forbidden错误。

第8行,try_files这个命令相当于做一个url重写,可以利用它来做一个伪静态。try_files $uri $uri/ /index.php?$args,$uri是nginx的一个变量,他的意义是先查看一下uri这个文件是不是存在,存在就返回,不存在就检查uri/这个目录看是否存在,存在返回,不存在查看index.php?$args这个是不是存在,如果不存在就返回默认的错误码,一般是404错误。

确认是否需要更改数据库密码

从其他的地方迁移过来,检查一下是否需要更改数据库的用户名和密码,在文件/wp-config.php,可以更改博客的数据库用户名和密码。

重启nginx

重启一下nginx,准确的说应该是重新读取一下配置。/usr/local/nginx/sbin/nginx -s reload

访问一下http://www.chenyudong.com/就可以了,而且原有的重写规则还是可以用的。

参考文章:http://codex.wordpress.org/Nginx

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Nginx上搭建WordPress及配置 完美迁移 – https://www.chenyudong.com/archives/nginx-support-wordpress-and-configure.html

分类: wordpress, 网站建设

codeigniter在nginx安装配置及URL重写

codeigniter(CI)是一个轻量型的PHP优秀框架,但是它是在apache服务器下开发的,在nginx下需要特别的配置才可以使用。

codeigniter修改

application/config/config.php进行修改,大约在48行左右。

$config['uri_protocol'] = "PATH_INFO";

修改nginx配置

对nginx的进行配置,nginx.conf

server {
        listen       80;
        listen [::]:80 ipv6only=on;
        server_name  www.example.com;

        root   /data/www/www.example.com;
        index index.php  index.html index.htm;

        location / {
                # 这里使用try_files进行url重写,不用rewrite了。
                try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php($|/) {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info ^(.+\.php)(.*)$;
            fastcgi_param   PATH_INFO $fastcgi_path_info;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        location ~ /\.ht {
                deny  all;
        }
}

要特别注意19行的include fastcgi_params;,如果没有这一行,那么你的PHP程序会无法运行的。我被这个坑了很多次了。

访问url

在CI框架下,有一个默认的controller,叫welcome。原先在没有nginx的rewrite前,我们需要通过这样的方式访问http://www.example.com/index.php/welcome/index。现在我们可以http://www.example.com/welcome/index这样访问URL了。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: codeigniter在nginx安装配置及URL重写 – https://www.chenyudong.com/archives/codeigniter-in-nginx-and-url-rewrite.html

分类: 网络

nginx多个站点

在Nginx中配置多个站点可以在一个服务器上运行多个网站,但是又不想直接修改nginx.conf文件,就在文件夹下新建一个文件夹vhost,以后只要在这里面添加站点就行。

修改/etc/nginx/nginx.conf文件。

http {

    include vhost/*.conf;
}

在vhost文件夹中新增站点test.conf

server { # simple load balancing
    listen          80;
    server_name     www.example.com;
    #access_log      /data/www/www.access.log main;

    listen          443;
    ssl             on;
    ssl_certificate           /etc/ssl/www.crt;
    ssl_certificate_key       /etc/ssl/www.private.pem;

    location / {
        #try_files $uri $uri/ /index.php?uri=$uri&$args;
        root /data/www/;
        index index.html index.htm index.php;
    }

    error_page 404 /404.php;

    location ~ ^.+\.php {
        root /data/home/www/wwwroot;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

要特别注意include fastcgi_params;,这个,我很多次因为缺少这一行,导致我的php程序就是无法运行。我看了php-fpm、nginx的log,都没有看出来。最后还是对比了其他可以运行的php网站配置,才发现一行少了,切忌切忌。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: nginx多个站点 – https://www.chenyudong.com/archives/nginx-include-multiple-server.html

分类: 网站建设

nginx 反向代理 proxy

上次说了,有个需求,是使用nginx做反向代理用的。可以看看具体的nginx的安装。另外还有一篇介绍Squid的正向代理

基本的nginx反向代理设置

要配置一下nginx,进入到${nginx}/conf/nginx.conf,增加一个服务器。

增加一条server记录

server {
        listen 80;  # 端口
        server_name testproxy; # 域名

        location / {
                proxy_pass http://www.chenyudong.com/;  # 需要访问的网站
                proxy_redirect off;                 # 重定向关闭
                proxy_set_header Host $host;        # 设置一下访问头
        }
    }

注意:通过上面的方法,只是服务器简单的将文件下载下来,然后就未加工的提交给用户了。也就是里面的链接是不会出现替换的,原来是什么就该是什么。

那么要替换某些URL要怎么做的?

替换网页里某些关键字或链接

如果需要替换关键字或者链接,该怎么办呢?

我们需要重新编译一下nginx,对,重新编译。在编译的时候添加参数--with-http_sub_module。也就是编译的命令./configure --with-http_sub_module。然后的安装过程见这篇文章。

接下来需要修改一下${nginx}/conf/nginx.conf配置。

server {
        listen 80;  # 端口
        server_name testproxy; # 域名

        ##将页面出现的www.baidu.com改成google.com
        sub_filter 'www.baidu.com' 'google.com';

        ## off:在符合的地方,替换所有出现的地方。默认为on:只替换第一个出现的地方
        sub_filter_once off;

        location / {
                proxy_pass http://www.google.com/;  # 需要访问的网站
                proxy_redirect off;                 # 重定向关闭
                proxy_set_header Host $host;        # 设置一下访问头
        }
    }

需要关心用于的真实IP了

说明:这个用户的真实IP指的是,直接和我们服务器连接的那个IP,用户可以躲在代理后面,这种情况获取不到用户真实IP,想要获得,成本很高,还不一定能获得到。下文说的都是基于这个前提条件的。

以上配置,是多么美好啊,应该能正常工作了。但是还是有些不足,就是我们对用户真实IP的获取上,已经无法通过_SERVER['REMOTE_ADDR']获取,因为这个获取的值是前台的nginx的IP。

nginx反向代理

nginx反向代理

对于我们backend nginx代理,只能看到所有的请求是来自front nginx的,所以PHP程序想要获得用户的真实IP,需要做一些设置。

## front nginx 设置
server {
    listen          80;
    server_name     server.com;
    #access_log      /data/home/log/server.access.log main;

    location / {
        proxy_pass http://www.chenyudong.com/;
        proxy_redirect off;
        proxy_set_header X-real-ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

从HTTP_X_REAL_IP获取

通过增加HTTP_X_REAL_IPHTTP_X_FORWARDED_FOR这两个变量,让后端的backend nginx从这里获取用户的真实IP。

设置用户真实IP头的结果

设置用户真实IP头的结果

我们可以看到,PHP中的HTTP_X_REAL_IPHTTP_X_FORWARDED_FOR已经获取到用户的真实IP了。

这还不够完美,这需要我们的程序重新使用_SERVER["HTTP_X_REAL_IP"]这样来取值。但是程序不是从头写起的,大家都在使用_SERVER['REMOTE_ADDR']获取,要替换,工程浩大,不适宜。那么就只能在程序的入口做个变量的替换了。

<?php
    _SERVER['REMOTE_ADDR'] = _SERVER["HTTP_X_REAL_IP"];
....
?>

来个狠的,就要从REMOTE_ADDR获取

如果你觉得上面还是不太爽,我就是从那里取值。

在上面front nginx的配置基础上不变。这次我们对backend nginx做配置:

 location ~ ^.+\.php {
          fastcgi_pass 127.0.0.1:9000;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
          fastcgi_param REMOTE_ADDR $HTTP_X_REAL_IP;
  }

就是高亮的第六行,添加fastcgi_param REMOTE_ADDR $HTTP_X_REAL_IP;,把REMOTE_ADDR这个变量在这里就给他替换了。看看替换的结果:

替换REMOTE_ADDR变量

替换REMOTE_ADDR变量

经过这么一折腾,我们的PHP就可以和以前一样工作了。

这样就好了吗?

如果你觉得这样,就可以了,那就错了。虽然我们的PHP正确获得了用户的IP,但是nginx要打access的log,看看他的log,你会发现请求的IP还是front nginx的那个IP。

要解决这个问题,我们就要再修改一把。并且这个解决方案比上一步来的更好一些。完全可以替换上一部的方案。

前端的front nginx的配置和前面一样。

## front nginx 设置
server {
    listen          80;
    server_name     server.com;
    #access_log      /data/home/log/server.access.log main;

    location / {
        proxy_pass http://www.chenyudong.com/;
        proxy_redirect off;
        proxy_set_header X-real-ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

后台的backend nginx要使用set_real_ip_fromreal_ip_header这两个指令,这两个是在nginx的HttpRealipModule中,这个模块默认不被编译,因此需要在编译是添加--with-http_realip_module参数

## 源码编译增加参数
./configure --with-http_realip_module

## yum 安装默认是有安装的,可以
nginx -V ##查看一下编译的参数

后端的backend nginx配置

## backend nginx
location ~ ^.+\.php {
          fastcgi_pass 127.0.0.1:9000;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
          set_real_ip_from   10.221.0.197;
          #set_real_ip_from   100.100.0.0/16;
          #set_real_ip_from  2001:0db8::/32;
          real_ip_header     X-Real-IP;
}

第7行,set_real_ip_from定义了一个信任的IP地址,从这个信任的IP发送的可以替换用户的IP地址。如果值是unix,所有来自UNIX域的sockets都被信任。

IPv6 addresses are supported starting from versions 1.3.0 and 1.2.1.

第10行,real_ip_header定义了一个请求头,用于替换用户的真实IP。

这样的配置,我们的_SERVER['REMOTE_ADDR']还是用户的真实IP,而不是front nginx的IP。并且log里面的IP也是用户的真实IP。还等什么,赶快试一试吧。

参考资料:

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: nginx 反向代理 proxy – https://www.chenyudong.com/archives/nginx-reverse-proxy.html

分类: 网站建设

nginx编译安装教程

有个需求,要是用nginx的反向代理功能。以前有使用过lnmp,但是这些还用不上,就先自己安装一个单独的nginx服务器就好了。 下载nginx 首先从http://wiki.nginx.org/InstallChs下载源代码。我下载的是http://nginx.org/download/nginx-1.0.2.tar.gz wget http://nginx.org/download/nginx-1.0.2.tar.gz 解压缩安装

tar -zxvf nginx-1.0.2.tar.gz
./configure

出现问题。说

checking for PCRE library … not found checking for PCRE library in /usr/local/ … not found checking for PCRE library in /usr/include/pcre/ … not found checking for PCRE library in /usr/pkg/ … not found checking for PCRE library in /opt/local/ … not found ./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by using –without-http_rewrite_module option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using –with-pcre=<path> option.

运行yum命令

yum install pcre-devel

也可以参考安装教程http://www.asep.us/2011/05/30/nginx-instalation-pcre-library-not-found/ 出现gzip 类库

./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.

yum安装

yum install zlib zlib-devel

或者自己编译安装,下载地址:http://zlib.net/zlib-1.2.7.tar.gz 继续安装

你可能还会使用openssl组件,

yum install openssl openssl-devel
./configure --with-http_ssl_module --with-ipv6
make
make install

启动nginx /usr/local/nginx/sbin/nginx 关闭nginx /usr/local/nginx/sbin/nginx -s stop 几个常用的命令

  Nginx -s stop         快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。(quick exit)
  Nginx -s quit         平稳关闭Nginx,保存相关信息,有安排的结束web服务。(graceful exit)
  Nginx -s reload       因改变了Nginx相关配置,需要重新加载配置而重载。(changing configuration,start a new worker,quitting an old worker gracefully.)
  Nginx -s reopen       重新打开日志文件。(reopenging log files)

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: nginx编译安装教程 – https://www.chenyudong.com/archives/nginx-install.html

分类: 网站建设

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑