使用nginx配置http代理

环境

centos 6.5

有网络连接的正常环境

安装nginx

这里使用nginx官方的yum安装(推荐),其它方式安装类似。

rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

详细参考nginx官方yum源说明 http://nginx.org/en/linux_packages.html#stable

配置ngix

nginx官方出二进制rpm包,其配置沿用redhat/centos的习惯,很清晰明了,配置文件位于 /etc/nginx 目录下,文件如下

[root@iZ11du3hojgZ ~]# ls -lh /etc/nginx/
total 36K
drwxr-xr-x 2 root root 4.0K Nov 30 14:13 conf.d
-rw-r--r-- 1 root root  964 Apr 21  2015 fastcgi_params
-rw-r--r-- 1 root root 2.8K Apr 21  2015 koi-utf
-rw-r--r-- 1 root root 2.2K Apr 21  2015 koi-win
-rw-r--r-- 1 root root 3.9K Apr 21  2015 mime.types
-rw-r--r-- 1 root root  643 Apr 21  2015 nginx.conf
-rw-r--r-- 1 root root  596 Apr 21  2015 scgi_params
-rw-r--r-- 1 root root  623 Apr 21  2015 uwsgi_params
-rw-r--r-- 1 root root 3.6K Apr 21  2015 win-utf

其中主配置文件是 /etc/nginx/nginx.conf,站点配置位于conf.d/ 子目录,每个站点一个文件(默认只有一个default.conf)

直接在default.conf配置文件上修改(改之前可以做个备份,如果就地备份在/etc/nginx/conf.d/目录里,文件名后缀不要是 .conf,否则会被nginx当配置文件加载)

设置站点监听及dns服务器

server{...}节点里,

  1. 修改listen指令,改一下端口,并增加 default 参数,设置成默认nginx站点
  2. 增加resolver 指令,设置域名解析服务器。这里使用dnspod的公共dns服务器如果;国外服务器可以使用google的8.8.8.8等。

location{...}子节点里,

  1. 注释掉root及index两行,当然删除也可以。
  2. 添加一系列proxy_xxx指令。最主要是proxy_pass及proxy_set_header 设置Host头两项,其它是一些参数优化。

设置允许使用代理服务的ip地址。虽然这一步不是必须,但强烈建议配置,避免代理服务器被别人冒用,带宽是宝贵的。不要以为你没公开代理就没人知道,要知道互联网上有无数个代理扫描时刻在偷偷运行着!

 

  1. 设置allow地址白名单。
  2. deny all禁止掉其它所有地址。

 

全部相关配置如下:

server {
    listen       8080 default;
    server_name  localhost;
    resolver 119.29.29.29;
    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;
    .....[略]
    location / {
        #root   /usr/share/nginx/html;
        #index  index.html index.htm;
        proxy_pass $scheme://$host$request_uri;
        proxy_set_header Host $http_host;

        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout 30;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 301 1h;
        proxy_cache_valid any 1m;
    }
    .....[略]
    allow 100.200.100.0/24;
    deny all;
}

已知缺陷

不支持https,虽然配置文件里proxy_pass指令使用了可以支持非http协议的通用的形式。事实上这里直接写成http://也是可以的。

参考

nginx proxy模块文档

nginx http access模块文档

centos服务器安装后一系列配置参考(centos 6.x)

iptables

centos 6.x的iptables默认配置文件,开启必要的ssh,icmp/ping,不接受其它连接,有需要开放的端口再做手工开启;这是科学的。

不过,似乎,有些vps等环境下默认是空的,即接受任意连接;甚至没有安装iptables。这时,建议自行yum安装,并使用如下的默认配置文件,写入到 /etc/sysconfig/iptables,然后重启iptables。

# Generated by iptables-save v1.4.7 on Sat Dec 17 10:11:38 2011
# Manual customization of this file is not recommended.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

注意:默认拒绝FORWARD转发,果真有需要请自行开放。

sshd: 端口

ssh的服务器端,重要性不需多讲。

其主配置文件 /etc/ssh/sshd_config  (注意不是 /etc/ssh/ssh_config),下面sshd相关配置都在该文件上修改

改一下监听端口,虽然刻意扫描你,还是没的跑,但起码隐藏了一点点。大概13行,Port指令,默认是注释掉的,取消注释,将其后端口号22改成你想要改的,下面以12345为例。注意不要超过65535,不要使用其它已监听端口

Port 12345

[至关重要] iptables里打开相关端口,不要断开当前连接、重启sshd 服务,保存iptables配置到磁盘(以备下次开机时自动生效)

# iptables -I INPUT 4 -m state --state NEW -p tcp --dport 12345 -j ACCEPT
# /etc/init.d/sshd restart
# /etc/init.d/iptables save

再开一个ssh客户端测试连接,确保改后的端口可以连接。(即使已改过端口,当前连接也还是会保持的)

指定自定义端口的ssh连接: ssh -p 12345  username@your.host.ip

sshd: 用户白名单

限制一下允许通过ssh远程登录的用户名(白名单),可以在文件结尾增加如下一行

AllowUsers user1 user2 user3

其中的user1 user2 user3 是允许通过ssh远程登录的用户,多个用户使用空格分隔。当然,你要事先创建这些普通用户,不然下次就连不上了。

sshd: 禁止root用户直接通过ssh登录

被暴力破解root密码是一件经常遇到的事情,所以严重推荐禁止掉,尤其是使用默认22端口时。增加下一行配置

PermitRootLogin no

日期时间的自动同步

首先确保rdate已安装,使用美国授时中心服务器,加入到crontab,每周日同步一次

# crontab -e
* * * * 0 rdate -s time.nist.gov

详细可参考 linux下日期时间自动同步设置(rdate,ntpdate两种方法)

yum源

epel

似乎centos 6.x的某一个版本起,其官方yum默认包含了epel-release的yum源,直接安装即可。

yum install epel-release

nginx

如果使用nginx的话,可以使用nginx的官方yum源。当然里面只有nginx,没有别的包,所以不会破坏centos原装包的依赖关系。

rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

详细参考nginx官方yum源说明 http://nginx.org/en/linux_packages.html#stable

selinux

这货很强悍,然而有时也很麻烦,尤其是不够熟的时候,可以考虑关闭,配置在文件 /etc/sysconfig/selinux

SELINUX=disabled
或
SELINUX=permissive

apache/httpd

取消默认欢迎页,/etc/httpd/conf.d/welcome.conf 注释掉相关配置行,但不建议删除该文件。因为yum update更新后,这个文件可能被自动恢复。

添加文件 /etc/httpd/conf.d/vhost.conf, 配置虚拟站点,但建议第一个设置成空站点。因为第一个VirtualHost是默认站点,没有匹配的host主机名,都会被apache丢给默认站点。

NameVirtualHost *:80
<VirtualHost *:80>
        ServerName default.host.com
        DocumentRoot "/var/www/html/default/html/"
        <Directory "/var/www/html/default/html/">
                AllowOverride None
                Order allow,deny
                Allow from all
        </Directory>
        <IfModule mod_php5.c>
        php_admin_value open_basedir "/tmp/:/var/www/html/default/html"
        </IfModule>
</VirtualHost>

<VirtualHost *:80>
        ServerName www.vhost1.com
        DocumentRoot "/var/www/html/vhost1.com/www/"
        <Directory "/var/www/html/vhost1.com/www/">
                AllowOverride All
                Order allow,deny
                Allow from all
        </Directory>
        <IfModule mod_php5.c>
        php_admin_value open_basedir "/tmp/:/var/lib/php/session:/var/www/html/vhost1.com/"
        </IfModule>
</VirtualHost>

启用http压缩,gzip压缩是否有必要启用,观点并不一致(CentOS默认配置是不启用的),如需启用,确认一下 apache主配置文件中(大约1011行)已经启用了mod_deflate.so模块,新增文件 /etc/httpd/conf.d/http_gzip.conf ,内容如下

<ifmodule mod_deflate.c>
#压缩率, 6是建议值
DeflateCompressionLevel 6
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE image/svg+xml
</ifmodule>

禁止添加默认页面编码的http头,大概 759行

AddDefaultCharset UTF-8

最好注释掉,让浏览器自行选择编码,而不是弄巧成拙的强制UTF-8编码,造成非UTF-8页面全部乱码掉

MySQL-Server

配置参考 一份生产环境下MySQL服务配置优化参考样本 (请按硬件及负载酌情修改)

备份脚本,加入到crontab中,定时执行。注意其中备份存储目录、待备份数据库列表、及备份用户账号密码

#!/bin/bash
# Program:
#      auto backup mysql database
# History:
# 2012/05/14    fengyqf First release
#backup folder, with the last slash "/"
backup_folder="/home/user/backup/mysql/"
filename=`date +_%Y%m%d_%N`

for db in db1 db2 db3
do
mysqldump -hlocalhost --opt -e --max_allowed_packet=1048576 --net_buffer_length=16384 -uroot -pYourMysqlRootPassword $db |gzip > $backup_folder$db$filename.sql.gz
done

其它置参考

ulimit, 文件描述符 http://www.path8.net/tn/archives/2024

sysctl, 内核优化 #TODO#

 

磁盘空间爆掉时nginx报错 An error occurred

nginx报错了,消息如下错误如下nginx_Error_disk_empty

An error occurred.

Sorry, the page you are looking for is currently unavailable.
Please try again later.

If you are the system administrator of this resource then you should check the error log for details.

Faithfully yours, nginx.

1分钟前还是好的,至少wordpress后台可以正常打开,突然就成这样子了。静态页面还正常,就ssh上,检查php-fpm进程是正常的,没有僵局。算了,杀死,连nginx一起杀死,虽然这是很不优雅的行为,所不齿的行为。然而结果是没用。随手查了下df -h ,分区满了,怪不得,查了下,删除几个备份文件,然后一切恢复正常了。空间不够,还是个问题,要进一步清理了。

手把手教你在centos下编译安装配置高性能web服务器环境nginx+php(fast-cgi)+mysql等/适合小内存vps使用

本文为实战操作过程的全程记录,采用一台新创建的linode vps(512M内存)环境,操作系统采用centos 6.2,以从源码编译的方式安装配置nginx, php(fast-cgi模式)web环境。

我们的目标:配置一台高性能、安全的web服务器。

继续阅读

nginx 1.2.0启用gzip http压缩手记

本站的web在vps上的nginx里跑,之前为简单其见,没有配置http gzip压缩支持,但vps有时网络抽风而速度很慢,于是想起来配置gzip压缩支持。

网上有很多nginx启用gzip压缩的文章,但还是上官方看文档是最权威准确的。这两个页面:

http://wiki.nginx.org/HttpGzipModule
http://wiki.nginx.org/NginxHttpGzipStaticModule

nginx官方文档很易懂,先给一个典型的配置实例,下面再详讲每条指令,感觉相当亲切。

查看ngix编译参考,是否启用了gzip模块,运行命令:

/path/to/binary/nginx -V
(我的nginx在PATH目录里,故命令中可以省略nginx所在的目录),写为nginx -t 即可,下文从略写

注意其中是否 --with-http_gzip_static_module,如果没有,那就自己编译一次吧,下面是我的配置参数,供参考。最后的--add-module=../nginx-lib/nginx-upload-progress-module-v0.9.0/是nginx上传进度模块,nginx第三方模块,源码放置在../nginx-lib/nginx-upload-progress-module-v0.9.0目录,如果你没有下载过该模块,去掉它就可以了。

nginx version: nginx/1.2.0
configure arguments: --prefix=/usr/local/nginx --sbin-path=/usr/local/sbin/nginx --conf-path=/usr/local/conf/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --with-http_stub_status_module --with-http_gzip_static_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-http_random_index_module --with-cpu-opt=pentium4 --add-module=../nginx-lib/nginx-upload-progress-module-v0.9.0/

修改nginx配置文件,nginx配置文件目录参看nginx配置参数里的--conf-path。按我的配置,修改/usr/local/conf/nginx/nginx.conf,在http节点加入gzip配置即可。

    gzip_static on;
    gzip_http_version 1.1;
    gzip_proxied expired no-cache no-store private auth;
    gzip_disable "MSIE [1-6]\.";
    gzip_vary on;

    gzip on;
    gzip_min_length 1000;
    gzip_types text/plain application/xml text/css text/javascript text/xml;

测试配置是否有语法错误

nginx -t

输出消息

nginx: the configuration file /usr/local/conf/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/conf/nginx/nginx.conf test is successful

确认无误,重新加载nginx配置

nginx -s reload

检测gzip压缩是否正常工作,使用live http headers ——firefox的一款插件,看http头是是否有这样一行:Content-Encoding: gzip

也可以使用firefox的firebug插件 的“网络”功能看,或者使用第三方的在线检测工具,如http://tool.chinaz.com/Gzips/

centos 6 下编译安装 nginx

下载nginx源码包,可以到nginx官方的下载文件归档里 http://nginx.org/download/ 下载

下载pcre源码,并编译安装,从pcre官方下载  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.zip

解压缩 unzip pcre-8.21.zip

进入源码目录 cd pcre-8.21/

./configure

make

make install

全部使用默认,不必要指定目录,这样包容易被找到。

安装nginx

这里使用nginx 1.0.8为例。

下载源码包  wget http://nginx.org/download/nginx-1.0.8.tar.gz

解压缩 tar xvf nginx-1.0.8.tar.gz

进入源码目录 cd nginx-1.0.8/

查看配置参数 ./configure --help (此步可以省略)

简单配置 ./configure
(注:centos 6 默认安装pcre包的,但是其安装位置并不为nginx识别,而且即使手工指定好像也不行,编译过程中会提示找不到文件;所以才需要先安装pcre包)

不指定任何配置选项,应该可以成功通过,得到如下的消息

Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + md5: using system crypto library
  + sha1: using system crypto library
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

然后就是 make

应该不会出问题,接着make install 就安装好了。

先测试一下是否可以运行,执行 /usr/local/nginx/sbin/nginx 没有消息提示,通过浏览器打开nginx所在的ip地址,应该可以看到

 

Welcome to nginx!

 

这样的一个简单页面,证明nginx可以工作。

接下来的工作就是配置nginx了,其配置文件为/usr/local/nginx/conf/nginx.conf

nginx下为wordpress配置重写规则/rewrite

nginx不能支持.htaccess的rewrite规则,所以使用nginx作web服务器,配置wordpress固定链接会比较麻烦一点,要自己写规则到nginx配置文件里。网上也看到一些配置规则,不过觉得怪怪的。

发现nginx官方网站上有个页面,关于wordpress重写规则的,http://wiki.nginx.org/WordPress里面有“cool”的规则,本站的nginx配置如下,其中一行 try_files $uri $uri/ /index.php; 就是这行,应该比网上有些文章里的规则更cool。

    server {
        server_name  blog.path8.net;
        root /var/www/vhost/blog;
        access_log  logs/vhost-blog.path8.net.log  main;

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

        location / {
                index  index.html index.htm index.php;
                # from nginx.org rewrite rule
                # This is cool because no php is touched for static 
 try_files $uri $uri/ /index.php;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/vhost/blog$fastcgi_script_name;
            include        fastcgi_params;
        }
    }