Nginx

Nginx

Nginx启动报错ngx_slab_alloc() failed: no memory

回复

运维 chris 回复了问题 1 人关注 1 个回复 3785 次浏览 2020-12-07 00:00 来自相关话题

nginx编译报错/bin/sh: line 2: ./configure: No such file or directory

运维 chris 回复了问题 2 人关注 1 个回复 7476 次浏览 2020-11-23 20:56 来自相关话题

Nginx如何自定义404页面

运维 空心菜 回复了问题 2 人关注 1 个回复 3636 次浏览 2018-08-10 16:08 来自相关话题

nginx无法启动error while loading shared libraries: libpcre.so.0

回复

运维 Ansible 回复了问题 1 人关注 1 个回复 10677 次浏览 2017-08-22 23:45 来自相关话题

Nginx的五种负载均衡策略

运维 chris 发表了文章 1 个评论 8782 次浏览 2017-07-03 23:36 来自相关话题

Nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个。   nginx的upstream目前支持的5种方式的分配 ...查看全部
Nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个。
 
nginx的upstream目前支持的5种方式的分配


1、轮询(默认)​


每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver { 
server 192.168.0.14;
server 192.168.0.15;
}


2、指定权重


指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
upstream backserver { 
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}


3、 ip_hash(ip绑定)


每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver { 
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}


4、fair(第三方)


按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver { 
server server1;
server server2;
fair;
}


5、url_hash(第三方)


按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 
upstream backserver { 
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
在需要使用负载均衡的server中增加 
proxy_pass http://backserver/; 

upstream backserver{
ip_hash;
server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载)
server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)
}
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 

fail_timeout:max_fails次失败后,暂停的时间

Centos6下安装PHP7和Nginx

运维 Geek小A 发表了文章 0 个评论 3633 次浏览 2017-06-15 22:29 来自相关话题

一、安装PHP PHP源码包下载地址: # wget http://cn2.php.net/distributions/php-5.6.22.tar.bz2 # wget http://cn2.php.net/ ...查看全部


一、安装PHP


PHP源码包下载地址:
# wget http://cn2.php.net/distributions/php-5.6.22.tar.bz2
# wget http://cn2.php.net/distributions/php-7.0.7.tar.bz2

更新yum源
这里将Centos的yum源更换为国内的阿里云源。yum安装正常的可以跳过本步骤, 阿里云Linux安装镜像源地址: http://mirrors.aliyun.com/  
 
1、备份你的原镜像文件,以免出错后可以恢复:
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/ 
# CentOS 5
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

# CentOS 6
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

# CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

3、生成缓存
yum clean all
yum makecache

安装依赖
yum install -y gcc gcc-c++ make cmake bison autoconf wget lrzsz
yum install -y libtool libtool-ltdl-devel
yum install -y freetype-devel libjpeg.x86_64 libjpeg-devel libpng-devel gd-devel
yum install -y python-devel patch sudo
yum install -y openssl* openssl openssl-devel ncurses-devel
yum install -y bzip* bzip2 unzip zlib-devel
yum install -y libevent*
yum install -y libxml* libxml2-devel
yum install -y libcurl* curl-devel
yum install -y readline-devel
需要编译libmcrypt、mhash、mcrypt库
tar zxvf /libmcrypt-2.5.8.tar.gz \
&& cd /libmcrypt-2.5.8 && ./configure && make && make install && cd - / && rm -rf /libmcrypt* \
&& tar zxvf /mhash-0.9.9.9.tar.gz && cd mhash-0.9.9.9 && ./configure && make && make install && cd - / && rm -rf /mhash* \
&& tar zxvf /mcrypt-2.6.8.tar.gz && cd mcrypt-2.6.8 && LD_LIBRARY_PATH=/usr/local/lib ./configure && make && make install && cd - / && rm -rf /mcrypt*

开始安装
使用./configure --help查看编译支持的选项。如果写了不支持的选项,如php7里不支持--with-mysql=mysqlnd会提示:
configure: WARNING: unrecognized options: --with-mysql
wget http://cn2.php.net/distributions/php-7.0.7.tar.bz2
tar jxvf php-7.0.7.tar.bz2
cd php-7.0.7

$ ./configure --prefix=/usr/local/php --with-config-file-scan-dir=/usr/local/php/etc/ --enable-inline-optimization --enable-opcache --enable-session --enable-fpm --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-pdo-sqlite --with-sqlite3 --with-gettext --enable-mbregex --enable-mbstring --enable-xml --with-iconv --with-mcrypt --with-mhash --with-openssl --enable-bcmath --enable-soap --with-xmlrpc --with-libxml-dir --enable-pcntl --enable-shmop --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-sockets --with-curl --with-curlwrappers --with-zlib --enable-zip --with-bz2 --with-gd --enable-gd-native-ttf --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-readline

$ make
$ make install
可选项:
--with-fpm-user=www --with-fpm-group=www
这里面开启了很多扩展。如果这时候忘了开启,以后还能加上吗?答案是可以的。以后只需要进入源码的ext目录,例如忘了pdo_mysql,进入ext/pdo_mysql,使用phpize工具,像安装普通扩展一样即可生成pdo_mysql.so。

关于:--enable-safe-mode
开启的话php可以执行一下系统函数,建议关闭(可搜索受此函数影响的php函数)
#如果只需要配置某一个目录可以执行则 设置为on并指定 safe_mode_exec_dir=string目录来执行系统函数。
#本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。
safe_mode = off
php7编译不用加这个配置。

编译比较耗内存和CPU。等待半小时左右,编译完成:
Build complete.
Don't forget to run 'make test'.

Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/
Installing PHP CLI binary: /usr/local/php/bin/
Installing PHP CLI man page: /usr/local/php/php/man/man1/
Installing PHP FPM binary: /usr/local/php/sbin/
Installing PHP FPM config: /usr/local/php/etc/
Installing PHP FPM man page: /usr/local/php/php/man/man8/
Installing PHP FPM status page: /usr/local/php/php/php/fpm/
Installing phpdbg binary: /usr/local/php/bin/
Installing phpdbg man page: /usr/local/php/php/man/man1/
Installing PHP CGI binary: /usr/local/php/bin/
Installing PHP CGI man page: /usr/local/php/php/man/man1/
Installing build environment: /usr/local/php/lib/php/build/
Installing header files: /usr/local/php/include/php/
Installing helper programs: /usr/local/php/bin/
program: phpize
program: php-config
Installing man pages: /usr/local/php/php/man/man1/
page: phpize.1
page: php-config.1
Installing PEAR environment: /usr/local/php/lib/php/
[PEAR] Archive_Tar - installed: 1.4.0
[PEAR] Console_Getopt - installed: 1.4.1
[PEAR] Structures_Graph- installed: 1.1.1
[PEAR] XML_Util - installed: 1.3.0
[PEAR] PEAR - installed: 1.10.1
Wrote PEAR system config file at: /usr/local/php/etc/pear.conf
You may want to add: /usr/local/php/lib/php to your php.ini include_path
/php-7.0.7/build/shtool install -c ext/phar/phar.phar /usr/local/php/bin
ln -s -f phar.phar /usr/local/php/bin/phar
Installing PDO headers: /usr/local/php/include/php/ext/pdo/

[root@e8ed9b00e80c php-7.0.7]# /usr/local/php/bin/php -m
[PHP Modules]
bcmath
bz2
Core
ctype
curl
date
dom
fileinfo
filter
gd
gettext
hash
iconv
json
libxml
mbstring
mcrypt
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
readline
Reflection
session
shmop
SimpleXML
soap
sockets
SPL
sqlite3
standard
sysvmsg
sysvsem
sysvshm
tokenizer
xml
xmlreader
xmlrpc
xmlwriter
zip
zlib

[Zend Modules]

配置文件
需要从安装包里复制php.ini、php-fpm.conf到安装目录:
$ cp php-7.0.7/php.ini* /usr/local/php/etc/

$ cd /usr/local/php/etc/

$ cp php.ini-production php.ini
$ cp php-fpm.conf.default php-fpm.conf

$ cp php-fpm.d/www.conf.default php-fpm.d/www.conf

$ ls
pear.conf php-fpm.conf.default php.ini-development php.ini-production

 配置php.ini
# 不显示错误,默认
display_errors = Off

# 在关闭display_errors后开启PHP错误日志(路径在php-fpm.conf中配置),默认
log_errors = On

# 字符集,默认
default_charset = "UTF-8"

# 文件上传大小,默认
upload_max_filesize = 2M

# 设置PHP的扩展库路径,,默认被注释了。
extension_dir = "/usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/"
# 如果不设置extension_dir,也可以直接写绝对位置:
# extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/redis.so


# 设置PHP的时区
date.timezone = PRC

# 开启opcache,默认是0
[opcache]
; Determines if Zend OPCache is enabled
opcache.enable=1

配置php-fpm.conf​
; 去掉里分号,方便以后重启。建议修改
; Default Value: none
; 下面的值最终目录是/usr/local/php/var/run/php-fpm.pid
; 开启后可以平滑重启php-fpm
pid = run/php-fpm.pid

; 设置错误日志的路径,可以默认值
; Note: the default prefix is /usr/local/php/var
; Default Value: log/php-fpm.log, 即/usr/local/php/var/log/php-fpm.log
error_log = /var/log/php-fpm/error.log

; Log等级,可以默认值
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
log_level = notice

; 后台运行,默认yes,可以默认值
; Default Value: yes
;daemonize = yes

; 引入www.conf文件中的配置,可以默认值
include=/usr/local/php/etc/php-fpm.d/*.conf

配置www.conf(在php-fpm.d目录下)
www.conf这是php-fpm进程服务的扩展配置文件:
; 设置用户和用户组,默认都是nobody。可以默认值
user = nginx
group = nginx

; 设置PHP监听
; 下面是默认值,不建议使用。可以默认值
; listen = 127.0.0.1:9000
; 根据nginx.conf中的配置fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
listen = /var/run/php-fpm/php-fpm.sock

######开启慢日志。可以默认值
slowlog = /var/log/php-fpm/$pool-slow.log
request_slowlog_timeout = 10s
保存配置文件后,检验配置是否正确的方法为:
/usr/local/php/sbin/php-fpm -t
如果出现诸如 test is successful 字样,说明配置没有问题。另外该命令也可以让我们知道php-fpm的配置文件在哪。
 
建立软连接:
ln -sf /usr/local/php/sbin/php-fpm /usr/bin/
ln -sf /usr/local/php/bin/php /usr/bin/
ln -sf /usr/local/php/bin/phpize /usr/bin/
ln -sf /usr/local/php/bin/php-config /usr/bin/
ln -sf /usr/local/php/bin/php-cig /usr/bin/
或者将php编译生成的bin目录添加到当前Linux系统的环境变量中:
echo -e '\nexport PATH=/usr/local/php/bin:/usr/local/php/sbin:$PATH\n' >> /etc/profile && source /etc/profile

启动php-fpm
/usr/local/php/sbin/php-fpm 
如果提示没有www用户(www.conf里填写了www而不是nobody),则新增:
useradd www
chown -R www:www /www
检测是否启动:
ps aux |grep php-fpm # 另外该命令也可以让我们知道fpm的配置文件在哪。
netstat -ant |grep 9000
查看php-fpm进程数:
ps aux | grep -c php-fpm
php-fpm操作汇总:
/usr/local/php/sbin/php-fpm         # php-fpm启动
kill -INT `cat /usr/local/php/var/run/php-fpm.pid` # php-fpm关闭
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` #php-fpm重启
重启方法二:
killall php-fpm
/usr/local/php/sbin/php-fpm &
如果无法平滑启动,那就终止进程id:
ps aux | grep php-fpm
kill -9 1210 #1210指php-fpm进程id


二、安装Nginx


安装包下载地址: http://nginx.org/download/nginx-1.11.1.tar.gz 
 
依赖:
# 为了支持rewrite功能,我们需要安装pcre
yum install pcre-devel

# 需要ssl的支持,如果不需要ssl支持,请跳过这一步
# yum install openssl*

# gzip 类库安装,按需安装
# yum install zlib zlib-devel
配置编译参数
$ tar -zxvf nginx-1.11.1.tar.gz
$ cd nginx-1.11.1
$ ./configure \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_sub_module \
--with-http_gzip_static_module \
--with-pcre
配置ok:
Configuration summary
+ using system PCRE library
+ using system OpenSSL library
+ md5: using OpenSSL library
+ sha1: using OpenSSL library
+ using system zlib library

nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
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"
编译安装nginx
make
make install
设置软连接:
ln -sf /usr/local/nginx/sbin/nginx /usr/sbin 
检测nginx:
nginx -t
显示:nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

成功了。我们重新配置下nginx.conf:
#user  nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

# 解决虚拟主机名字过长 http://www.jb51.net/article/26412.htm
server_names_hash_bucket_size 128;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

autoindex on;# 显示目录
autoindex_exact_size on;# 显示文件大小
autoindex_localtime on;# 显示文件时间

include vhosts/*.conf;

}
配置localhost:
vim ./vhosts/localhost.conf
server {
listen 80;
server_name localhost;

#charset utf-8;

#access_log logs/host.access.log main;

location / {
root /www/www/;
index index.php index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /www/www/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
启动nginx:
/usr/local/nginx/sbin/nginx

# 或者
nginx
重启:
/usr/local/nginx/sbin/nginx -s reload

# 或者
nginx -s reload
停止:
/usr/local/nginx/sbin/nginx -s stop

# 或者
nginx -s stop
如果提示80端口被占用了,可以使用ps aunx | grep 80查看。一般是apache占用了。可以使用:
chkconfig --list
chkconfig nginx on
service apache off
禁止apache启动并关闭apache服务。


三、安装扩展


1、安装swoole
Swoole: PHP的异步、并行、高性能网络通信引擎:http://www.swoole.com/  
wget https://github.com/swoole/swoole-src/archive/swoole-1.8.5-stable.zip
unzip swoole-1.8.5-stable.zip
cd swoole-1.8.5-stable
phpize
./configure
make && make install

2、安装redis
wget https://github.com/nicolasff/phpredis/archive/2.2.4.tar.gz
tar -zxvf 2.2.4
cd phpredis-2.2.4/
phpize
./configure
make && make install


四、信号管理


不重载配置启动新/旧工作进程
kill -HUP 旧/新版主进程号
从容关闭旧/新进程
kill -QUIT 旧/新主进程号
如果此时报错,提示还有进程没有结束就用下面命令先关闭旧/新工作进程,再关闭主进程号:
kill -TERM 旧/新工作进程号
升级、添加或删除模块时,我们需要停掉服务器
kill -USR2 旧版程序的主进程号或进程文件名

代理到底有几种功能模式?

运维 Ansible 发表了文章 0 个评论 3053 次浏览 2017-03-21 22:39 来自相关话题

通常我们都知道Nginx性能很高,尤其是作为一个代理服务器,因为它用的是epoll模型,就比如Python Django Web的性能不行,我们可能就会在前端加一个nginx代理,从而提高总体的处理性能问题,但是我们常说的代理,值的是什么类型的代理呢,你知道吗 ...查看全部
通常我们都知道Nginx性能很高,尤其是作为一个代理服务器,因为它用的是epoll模型,就比如Python Django Web的性能不行,我们可能就会在前端加一个nginx代理,从而提高总体的处理性能问题,但是我们常说的代理,值的是什么类型的代理呢,你知道吗?
 
代理服务技术是在互联网早期就出现被使用的。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。常用的代理技术分为正向代理、反向代理和透明代理。本文就是针对这三种代理来讲解一些基本原理和具体的适用范围和nginx的配置案例,便于大家更深入理解代理服务技术。
 


一、正向代理(Forward Proxy)


一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术。
 
正向代理(forward)是一个位于客户端 【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理,如下图所示:
ForwardAgent.png

从上面的概念中,我们看出,文中所谓的正向代理就是代理服务器【Z】替代访问方【用户A】去访问目标服务器【服务器B】。
 
这就是正向代理的意义所在。而为什么要用代理服务器【Z】去代替访问方【用户A】去访问服务器【B】呢?为什么不直接访问呢,这就要从场景和代理服务器使用的意义说起。
 
使用正向代理的意义和场景有如下几种:
 
1、用户访问本来无法访问的服务器B的资源
SpeedAccess.png

假设最初用户A要访问服务器B需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障,那么就无法访问服务器B了。但是如果用户A让代理服务器Z去代替自己访问服务器B,由于代理服务器Z没有在路由器R1或R2节点中,而是通过其它的路由节点访问服务器B,那么用户A就可以得到服务器B的数据了。

现实中的例子就是“翻墙”。不过自从VPN技术被广泛应用外,“翻墙”不但使用了传统的正向代理技术,有的还使用了VPN技术。
 
2、加速访问服务器B资源
这种说法目前不像以前那么流行了,主要是带宽流量的飞速发展。早期的正向代理中,很多人使用正向代理就是提速。
 
还是如图2假设用户A到服务器B,经过R1路由器和R2路由器,而R1到R2路由器的链路是一个低带宽链路。而用户A到代理服务器Z,从代理服务器Z到服务器B都是高带宽链路。那么很显然就可以加速访问服务器B了。
 
3、Cache作用
CacheFile.png

Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术。如上图所示,如果在用户A访问服务器B某数据F之前,已经有人通过代理服务器Z访问过服务器B上得数据F,那么代理服务器Z会把数据F保存一段时间,如果有人正好取该数据F,那么代理服务器Z不再访问服务器B,而把缓存的数据F直接发给用户A。这一技术在Cache中术语就叫Cache命中。如果有更多的像用户A的用户来访问代理服务器Z,那么这些用户都可以直接从代理服务器Z中取得数据F,而不用千里迢迢的去服务器B下载数据了。
 
4、客户端访问授权
这方面的内容现今使用的还是比较多的,例如一些公司采用ISA Server做为正向代理服务器来授权用户是否有权限访问互联网,如下图所示:
AccessAuth.png

如上图防火墙作为网关,用来过滤外网对其的访问。假设用户A和用户B都设置了代理服务器,用户A允许访问互联网,而用户B不允许访问互联网(这个在代理服务器Z上做限制)这样用户A因为授权,可以通过代理服务器访问到服务器B,而用户B因为没有被代理服务器Z授权,所以访问服务器B时,数据包会被直接丢弃。
 
5、隐藏访问者的行踪
如下图所示,我们可以看出服务器B并不知道访问自己的实际是用户A,因为代理服务器Z代替用户A去直接与服务器B进行交互。如果代理服务器Z被用户A完全控制(或不完全控制),会惯以“肉鸡”术语称呼。
Hidden.png

 
总结正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。
 
Nginx正向代理配置示例如下:
server{
resolver 8.8.8.8;
resolver_timeout 30s;
listen 82;
location / {
proxy_pass http://$http_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;
}
}
1、不能有hostname。 
2、必须有resolver, 即dns,即上面的8.8.8.8,超时时间(30秒)可选。 
3、配置正向代理参数,均是由 Nginx 变量组成。
proxy_pass $scheme://$host$request_uri;  
proxy_set_header Host $http_host;
4、配置缓存大小,关闭磁盘缓存读写减少I/O,以及代理连接超时时间。
proxy_buffers 256 4k;  
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
5、配置代理服务器 Http 状态缓存时间。  
proxy_cache_valid 200 302 10m;  
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
配置好后,重启nginx,以浏览器为例,要使用这个代理服务器,则只需将浏览器代理设置为http://+服务器ip地址+:+82(82是刚刚设置的端口号)即可使用了。


二、反向代理(reverse proxy)


反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
 
使用反向代理服务器的作用如下:
 
1、保护和隐藏原始资源服务器
RevProxy.png

用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。
 
2、负载均衡
LoadBlance.png

当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问资源服务器B的时候,让不同的代理服务器Z(x)去应答不同的用户,然后发送不同用户需要的资源。

当然反向代理服务器像正向代理服务器一样拥有Cache的作用,它可以缓存原始资源服务器B的资源,而不是每次都要向原始资源服务器组请求数据,特别是一些静态的数据,比如图片和文件,如果这些反向代理服务器能够做到和用户X来自同一个网络,那么用户X访问反向代理服务器X,就会得到很高质量的速度。这正是CDN技术的核心。如下图所示:
CdnProxy.png

我们并不是讲解CDN,所以去掉了CDN最关键的核心技术智能DNS。只是展示CDN技术实际上利用的正是反向代理原理这块。

反向代理结论与正向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

基本上,网上做正反向代理的程序很多,能做正向代理的软件大部分也可以做反向代理。开源软件中最流行的就是squid,既可以做正向代理,也有很多人用来做反向代理的前端服务器。另外MS ISA也可以用来在Windows平台下做正向代理。反向代理中最主要的实践就是WEB服务,近些年来最火的就是Nginx了。网上有人说Nginx不能做正向代理,其实是不对的。Nginx也可以做正向代理,不过用的人比较少了。
 
Nginx反向代理示例:
http {
# 省略了前面一般的配置,直接从负载均衡这里开始
# 设置地址池,后端3台服务器
upstream http_server_pool {
server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=30s;
server 192.168.1.3:8080 weight=3 max_fails=2 fail_timeout=30s;
server 192.168.1.4:8080 weight=4 max_fails=2 fail_timeout=30s;
}
# 一个虚拟主机,用来反向代理http_server_pool这组服务器
server {
listen 80;
# 外网访问的域名
server_name www.test.com;
location / {
# 后端服务器返回500 503 404错误,自动请求转发到upstream池中另一台服务器
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_pass http://http_server_pool;
proxy_set_header Host www.test.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log logs/www.test.com.access.log combined;
}
}
最简单的反向代理演示(在一台服务器上做代理服务器,将http请求转发到另一台IIS服务器上,通过二级域名形式访问。)编辑vim nginx.conf
server {
listen 80;
server_name test.zhoumengkang.com;
location / {
proxy_pass http://121.199.**.*:80;
}
}
参考:http://www.blogjava.net/xiaomage234/archive/2011/09/08/358247.html 
 


三、透明代理


如果把正向代理、反向代理和透明代理按照人类血缘关系来划分的话。那么正向代理和透明代理是很明显堂亲关系,而正向代理和反向代理就是表亲关系了 。

透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。

透明代理实践的例子就是时下很多公司使用的行为管理软件。如下图所示:
tmproxy.png

用户A和用户B并不知道行为管理设备充当透明代理行为,当用户A或用户B向服务器A或服务器B提交请求的时候,透明代理设备根据自身策略拦截并修改用户A或B的报文,并作为实际的请求方,向服务器A或B发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户A或B,如上图,如果透明代理设置不允许访问服务器B,那么用户A或者用户B就不会得到服务器B的数据。
 
Nginx透明代理配置示例:
# cat /etc/nginx/sites-enabled/proxy
server {
resolver 8.8.8.8;
access_log off;
listen [::]:8080;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
}
}

iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080
RAW Paste Data
# cat /etc/nginx/sites-enabled/proxy
server {
resolver 8.8.8.8;
access_log off;
listen [::]:8080;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
}
}

iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080
参考:
http://z00w00.blog.51cto.com/515114/1031287  
https://mengkang.net/78.html  

Nginx如何设置首页跳转到后端服务

运维 空心菜 回复了问题 2 人关注 2 个回复 4649 次浏览 2017-03-14 12:19 来自相关话题

Nginx location配置及rewrite规则写法总结

运维 Geek小A 发表了文章 1 个评论 2567 次浏览 2017-03-13 23:49 来自相关话题

location正则写法 简单示例如下: location = / { # 精确匹配 /,主机名后面不能带任何字符串 [ configuration A ] } ...查看全部
nginxre.png


location正则写法


简单示例如下
location = / {
# 精确匹配 /,主机名后面不能带任何字符串
[ configuration A ]
}

location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 ,比如我们代理的一个站点根
# 但是正则和最长字符串会优先匹配
[ configuration B ]
}

location /documents/ {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration C ]
}

location ~ /documents/Abc {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration CC ]
}

location ^~ /images/ {
# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
[ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
[ configuration E ]
}

location /images/ {
# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ configuration F ]
}

location /images/abc {
# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
[ configuration G ]
}

location ~ /images/abc/ {
# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ configuration H ]
}

location ~* /js/.*/\.js

  • =开头表示精确匹配 如A中只匹配根目录结尾的请求,后面不能带任何字符串。
  • ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
  • ~ 开头表示区分大小写的正则匹配;
  • ~* 开头表示不区分大小写的正则匹配
  • / 通用匹配, 如果没有其它匹配,任何请求都会匹配到
 匹配优先级:

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)

按照上面的location顺序,以下的匹配示例成立:
  • / -> config A  # 精确完全匹配,即使/index.html也匹配不了
  • /downloads/download.html -> config B   # 匹配B以后,往下没有任何匹配,采用B
  • /images/1.gif -> configuration D   # 匹配到F,往下匹配到D,停止往下
  • /images/abc/def -> config D   # 最长匹配到G,往下匹配D,停止往下,你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序
  • /documents/document.html -> config C    # 匹配到C,往下没有任何匹配,采用C
  • /documents/1.jpg -> configuration E   # 匹配到C,往下正则匹配到E
  • /documents/Abc.jpg -> config CC   # 最长匹配到C,往下正则顺序匹配到CC,不会往下到E
 

实际使用建议

 
所以实际使用中,个人觉得至少有三个匹配规则定义,如下:#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。#这里是直接转发给后端应用服务器了,也可以是一个静态首页# 第一个必选规则location = / {    proxy_pass http://tomcat:8080/index}# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用location ^~ /static/ {    root /webroot/static/;}location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {    root /webroot/res/;}#第三个规则就是通用规则,用来转发动态请求到后端应用服务器#非静态文件请求就默认是动态请求,自己根据实际把握#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了location / {    proxy_pass http://tomcat:8080/}
参考:http://tengine.taobao.org/book/chapter_02.html  http://nginx.org/en/docs/http/ngx_http_rewrite_module.html   

Rewrite规则

ewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。语法rewrite regex replacement [flag]; 如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。表明看rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:[list=1]
  • 执行server块的rewrite指令
  • 执行location匹配
  • 执行选定的location中的rewrite指令
  • 如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。  flag标志位
    • last : 相当于Apache的[L]标记,表示完成rewrite
    • break : 停止执行当前虚拟主机的后续rewrite指令集
    • redirect : 返回302临时重定向,地址栏会显示跳转后的地址
    • permanent : 返回301永久重定向,地址栏会显示跳转后的地址
      因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:[list=1]
  • last一般写在server和if中,而break一般使用在location中
  • last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
  • break和last都能组织继续执行后面的rewrite指令
  •   if指令与全局变量if判断指令语法为if(condition){...},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容:
    • 当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
    • 直接比较变量和内容时,使用=或!=
    • ~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配
    -f和!-f用来判断是否存在文件-d和!-d用来判断是否存在目录-e和!-e用来判断是否存在文件或目录-x和!-x用来判断文件是否可执行 示例:
    if ($http_user_agent ~ MSIE) {    rewrite ^(.*)$ /msie/$1 break;} //如果UA包含"MSIE",rewrite请求到/msid/目录下if ($http_cookie ~* "id=([^;]+)(?:;|$)") {    set $id $1; } //如果cookie匹配正则,设置变量$id等于正则引用部分if ($request_method = POST) {    return 405;} //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302if ($slow) {    limit_rate 10k;} //限速,$slow可以通过 set 指令设置if (!-f $request_filename){    break;    proxy_pass  http://127.0.0.1; } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查if ($args ~ post=140){    rewrite ^ http://example.com/ permanent;} //如果query string中包含"post=140",永久重定向到example.comlocation ~* \.(gif|jpg|png|swf|flv)$ {    valid_referers none blocked www.jefflei.com www.leizhenfang.com;    if ($invalid_referer) {        return 404;    } //防盗链}
     全局变量下面是可以用作if判断的全局变量:
    • $args : #这个变量等于请求行中的参数,同$query_string
    • $content_length : 请求头中的Content-length字段。
    • $content_type : 请求头中的Content-Type字段。
    • $document_root : 当前请求在root指令中指定的值。
    • $host : 请求主机头字段,否则为服务器名称。
    • $http_user_agent : 客户端agent信息
    • $http_cookie : 客户端cookie信息
    • $limit_rate : 这个变量可以限制连接速率。
    • $request_method : 客户端请求的动作,通常为GET或POST。
    • $remote_addr : 客户端的IP地址。
    • $remote_port : 客户端的端口。
    • $remote_user : 已经经过Auth Basic Module验证的用户名。
    • $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
    • $scheme : HTTP方法(如http,https)。
    • $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
    • $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
    • $server_name : 服务器名称。
    • $server_port : 请求到达服务器的端口号。
    • $request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
    • $uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
    • $document_uri : 与$uri相同。
     示例:http://localhost:88/test1/test2/test.php
    $host:localhost$server_port:88$request_uri:http://localhost:88/test1/test2/test.php$document_uri:/test1/test2/test.php$document_root:/var/www/html$request_filename:/var/www/html/test1/test2/test.php
    常用正则
    • . : 匹配除换行符以外的任意字符
    • ? : 重复0次或1次
    • + : 重复1次或更多次
    • * : 重复0次或更多次
    • \d :匹配数字
    • ^ : 匹配字符串的开始
    • $ : 匹配字符串的介绍
    • {n} : 重复n次
    • {n,} : 重复n次或更多次
    • [c] : 匹配单个字符c
    • [a-z] : 匹配a-z小写字母的任意一个

    小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
     
     
    rewrite实例
    示例1:
    http {
    # 定义image日志格式
    log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
    # 开启重写日志
    rewrite_log on;

    server {
    root /home/www;

    location / {
    # 重写规则信息
    error_log logs/rewrite.log notice;
    # 注意这里要用‘’单引号引起来,避免{}
    rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
    # 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行
    set $image_file $3;
    set $image_type $4;
    }

    location /data {
    # 指定针对图片的日志格式,来分析图片类型和大小
    access_log logs/images.log mian;
    root /data/images;
    # 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里
    try_files /$arg_file /image404.html;
    }
    location = /image404.html {
    # 图片不存在返回特定的信息
    return 404 "image not found\n";
    }
    }
    对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,于是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在则正常响应,如果不存在则重写tryfiles到新的image404 location,直接返回404状态码。
     
    示例2:
    rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;
    对形如/images/bla_500x400.jpg的文件请求,重写到/resizer/bla.jpg?width=500&height=400地址,并会继续尝试匹配location。

    一个IP的主机上配置Nginx的多个HTTPS虚拟主机

    运维 Ansible 发表了文章 0 个评论 3202 次浏览 2016-12-25 22:19 来自相关话题

    最近公司域名更变,同时,又要新旧域名同时运行。 那么,对于https的域名在同一个IP上如何同时存在多个虚拟主机呢?查看了下nginx手册,有这么一段内容,如下: 如果在同一个IP上配置多个HTTPS主机,会出现一个很普遍的问题:se ...查看全部
    最近公司域名更变,同时,又要新旧域名同时运行。 那么,对于https的域名在同一个IP上如何同时存在多个虚拟主机呢?查看了下nginx手册,有这么一段内容,如下:

    如果在同一个IP上配置多个HTTPS主机,会出现一个很普遍的问题:
    server {
    listen 443;
    server_name www.example.com;
    ssl on;
    ssl_certificate www.example.com.crt;
    ...
    }

    server {
    listen 443;
    server_name www.example.org;
    ssl on;
    ssl_certificate www.example.org.crt;
    ...
    }
    使用上面的配置,不论浏览器请求哪个主机,都只会收到默认主机www.example.com的证书。这是由SSL协议本身的行为引起的——先建立SSL连接,再发送HTTP请求,所以nginx建立SSL连接时不知道所请求主机的名字,因此,它只会返回默认主机的证书。

    最古老的也是最稳定的解决方法就是每个HTTPS主机使用不同的IP地址:
    server {
    listen 192.168.1.1:443;
    server_name www.example.com;
    ssl on;
    ssl_certificate www.example.com.crt;
    ...
    }

    server {
    listen 192.168.1.2:443;
    server_name www.example.org;
    ssl on;
    ssl_certificate www.example.org.crt;
    ...
    }
    那么,在同一个IP上,如何配置多个HTTPS主机呢?

    nginx支持TLS协议的SNI扩展(Server Name Indication,简单地说这个扩展使得在同一个IP上可以以不同的证书serv不同的域名)。不过,SNI扩展还必须有客户端的支持,另外本地的OpenSSL必须支持它。

    如果启用了SSL支持,nginx便会自动识别OpenSSL并启用SNI。是否启用SNI支持,是在编译时由当时的 ssl.h 决定的(SSL_CTRL_SET_TLSEXT_HOSTNAME),如果编译时使用的OpenSSL库支持SNI,则目标系统的OpenSSL库只要支持它就可以正常使用SNI了。

    nginx在默认情况下是TLS SNI support disabled。

    启用方法:
    需要重新编译nginx并启用TLS。步骤如下:
    # wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz
    # tar zxvf openssl-1.0.1e.tar.gz
    # ./configure --prefix=/usr/local/nginx --with-http_ssl_module \
    --with-openssl=./openssl-1.0.1e \
    --with-openssl-opt="enable-tlsext"
    # make
    # make install
    查看是否启用:
    # /usr/local/nginx/sbin/nginx -V
    TLS SNI support enabled
    这样就可以在 同一个IP上配置多个HTTPS主机了。

    实例如下:
    server  {
    listen 443;
    server_name www.baidu.com;
    index index.html index.htm index.php;
    root /data/wwwroot/baidu/webroot;
    ssl on;
    ssl_certificate "/usr/local/nginx/conf/ssl/www.baidu.com.public.cer";
    ssl_certificate_key "/usr/local/nginx/conf/ssl/www.baidu.com.private.key";
    ......
    }

    server {
    listen 443;
    server_name www.uko.com;
    index index.html index.htm index.php;
    root /data/wwwroot/www.uko.com/webroot;
    ssl on;
    ssl_certificate "/usr/local/nginx/conf/ssl/www.uko.com.public.cer";
    ssl_certificate_key "/usr/local/nginx/conf/ssl/www.uko.com.private.key";
    ......
    }
    分享阅读:http://www.ttlsa.com/web/multiple-https-host-nginx-with-a-ip-configuration/
    条新动态, 点击查看
    空心菜

    空心菜 回答了问题 • 2015-10-26 00:01 • 1 个回复 不感兴趣

    nginx rewrite规则怎么写

    赞同来自:

    rewrite ^/a/(+)/46.jpg?m=(.*)$ /a/$1/46_$2.jpg;  
    rewrite ^/a/(+)/46.jpg?m=(.*)$ /a/$1/46_$2.jpg;  
    chris

    chris 回答了问题 • 2016-04-09 23:53 • 1 个回复 不感兴趣

    Nginx代理本地web服务器怎么配置

    赞同来自:

    如下给一个简单的例子可以参考: server { listen 80; charset UTF-8; location / { proxy_pass http://127.... 显示全部 »
    如下给一个简单的例子可以参考: server { listen 80; charset UTF-8; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }然后执行如下命令检查语法: /nginx_install_dir/nginx/sbin/nginx -s reload

    Nginx启动报错ngx_slab_alloc() failed: no memory

    回复

    运维 chris 回复了问题 1 人关注 1 个回复 3785 次浏览 2020-12-07 00:00 来自相关话题

    nginx编译报错/bin/sh: line 2: ./configure: No such file or directory

    回复

    运维 chris 回复了问题 2 人关注 1 个回复 7476 次浏览 2020-11-23 20:56 来自相关话题

    Nginx如何自定义404页面

    回复

    运维 空心菜 回复了问题 2 人关注 1 个回复 3636 次浏览 2018-08-10 16:08 来自相关话题

    nginx无法启动error while loading shared libraries: libpcre.so.0

    回复

    运维 Ansible 回复了问题 1 人关注 1 个回复 10677 次浏览 2017-08-22 23:45 来自相关话题

    Nginx如何设置首页跳转到后端服务

    回复

    运维 空心菜 回复了问题 2 人关注 2 个回复 4649 次浏览 2017-03-14 12:19 来自相关话题

    Nginx代理本地web服务器怎么配置

    回复

    运维 chris 回复了问题 2 人关注 1 个回复 5119 次浏览 2016-04-09 23:53 来自相关话题

    nginx设置404页面不生效

    回复

    运维 being 回复了问题 2 人关注 1 个回复 4979 次浏览 2016-03-28 23:33 来自相关话题

    nginx: [warn] cloud not build optimal proxy_headers_hash

    回复

    运维 being 回复了问题 2 人关注 2 个回复 6771 次浏览 2016-01-21 22:36 来自相关话题

    nginx rewrite规则怎么写

    回复

    运维 空心菜 回复了问题 2 人关注 1 个回复 4063 次浏览 2015-10-26 00:01 来自相关话题

    nginx error_page 404

    回复

    运维 Ansible 回复了问题 2 人关注 1 个回复 4794 次浏览 2015-09-27 23:48 来自相关话题

    Nginx的五种负载均衡策略

    运维 chris 发表了文章 1 个评论 8782 次浏览 2017-07-03 23:36 来自相关话题

    Nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个。   nginx的upstream目前支持的5种方式的分配 ...查看全部
    Nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个。
     
    nginx的upstream目前支持的5种方式的分配


    1、轮询(默认)​


    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
    upstream backserver { 
    server 192.168.0.14;
    server 192.168.0.15;
    }


    2、指定权重


    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
    upstream backserver { 
    server 192.168.0.14 weight=10;
    server 192.168.0.15 weight=10;
    }


    3、 ip_hash(ip绑定)


    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
    upstream backserver { 
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
    }


    4、fair(第三方)


    按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    upstream backserver { 
    server server1;
    server server2;
    fair;
    }


    5、url_hash(第三方)


    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 
    upstream backserver { 
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
    }
    在需要使用负载均衡的server中增加 
    proxy_pass http://backserver/; 

    upstream backserver{
    ip_hash;
    server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载)
    server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
    server 127.0.0.1:6060;
    server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)
    }
    max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 

    fail_timeout:max_fails次失败后,暂停的时间

    Centos6下安装PHP7和Nginx

    运维 Geek小A 发表了文章 0 个评论 3633 次浏览 2017-06-15 22:29 来自相关话题

    一、安装PHP PHP源码包下载地址: # wget http://cn2.php.net/distributions/php-5.6.22.tar.bz2 # wget http://cn2.php.net/ ...查看全部


    一、安装PHP


    PHP源码包下载地址:
    # wget http://cn2.php.net/distributions/php-5.6.22.tar.bz2
    # wget http://cn2.php.net/distributions/php-7.0.7.tar.bz2

    更新yum源
    这里将Centos的yum源更换为国内的阿里云源。yum安装正常的可以跳过本步骤, 阿里云Linux安装镜像源地址: http://mirrors.aliyun.com/  
     
    1、备份你的原镜像文件,以免出错后可以恢复:
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

    2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/ 
    # CentOS 5
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

    # CentOS 6
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

    # CentOS 7
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

    3、生成缓存
    yum clean all
    yum makecache

    安装依赖
    yum install -y gcc gcc-c++ make cmake bison autoconf wget lrzsz
    yum install -y libtool libtool-ltdl-devel
    yum install -y freetype-devel libjpeg.x86_64 libjpeg-devel libpng-devel gd-devel
    yum install -y python-devel patch sudo
    yum install -y openssl* openssl openssl-devel ncurses-devel
    yum install -y bzip* bzip2 unzip zlib-devel
    yum install -y libevent*
    yum install -y libxml* libxml2-devel
    yum install -y libcurl* curl-devel
    yum install -y readline-devel
    需要编译libmcrypt、mhash、mcrypt库
    tar zxvf /libmcrypt-2.5.8.tar.gz \
    && cd /libmcrypt-2.5.8 && ./configure && make && make install && cd - / && rm -rf /libmcrypt* \
    && tar zxvf /mhash-0.9.9.9.tar.gz && cd mhash-0.9.9.9 && ./configure && make && make install && cd - / && rm -rf /mhash* \
    && tar zxvf /mcrypt-2.6.8.tar.gz && cd mcrypt-2.6.8 && LD_LIBRARY_PATH=/usr/local/lib ./configure && make && make install && cd - / && rm -rf /mcrypt*

    开始安装
    使用./configure --help查看编译支持的选项。如果写了不支持的选项,如php7里不支持--with-mysql=mysqlnd会提示:
    configure: WARNING: unrecognized options: --with-mysql
    wget http://cn2.php.net/distributions/php-7.0.7.tar.bz2
    tar jxvf php-7.0.7.tar.bz2
    cd php-7.0.7

    $ ./configure --prefix=/usr/local/php --with-config-file-scan-dir=/usr/local/php/etc/ --enable-inline-optimization --enable-opcache --enable-session --enable-fpm --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-pdo-sqlite --with-sqlite3 --with-gettext --enable-mbregex --enable-mbstring --enable-xml --with-iconv --with-mcrypt --with-mhash --with-openssl --enable-bcmath --enable-soap --with-xmlrpc --with-libxml-dir --enable-pcntl --enable-shmop --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-sockets --with-curl --with-curlwrappers --with-zlib --enable-zip --with-bz2 --with-gd --enable-gd-native-ttf --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-readline

    $ make
    $ make install
    可选项:
    --with-fpm-user=www --with-fpm-group=www
    这里面开启了很多扩展。如果这时候忘了开启,以后还能加上吗?答案是可以的。以后只需要进入源码的ext目录,例如忘了pdo_mysql,进入ext/pdo_mysql,使用phpize工具,像安装普通扩展一样即可生成pdo_mysql.so。

    关于:--enable-safe-mode
    开启的话php可以执行一下系统函数,建议关闭(可搜索受此函数影响的php函数)
    #如果只需要配置某一个目录可以执行则 设置为on并指定 safe_mode_exec_dir=string目录来执行系统函数。
    #本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。
    safe_mode = off
    php7编译不用加这个配置。

    编译比较耗内存和CPU。等待半小时左右,编译完成:
    Build complete.
    Don't forget to run 'make test'.

    Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/
    Installing PHP CLI binary: /usr/local/php/bin/
    Installing PHP CLI man page: /usr/local/php/php/man/man1/
    Installing PHP FPM binary: /usr/local/php/sbin/
    Installing PHP FPM config: /usr/local/php/etc/
    Installing PHP FPM man page: /usr/local/php/php/man/man8/
    Installing PHP FPM status page: /usr/local/php/php/php/fpm/
    Installing phpdbg binary: /usr/local/php/bin/
    Installing phpdbg man page: /usr/local/php/php/man/man1/
    Installing PHP CGI binary: /usr/local/php/bin/
    Installing PHP CGI man page: /usr/local/php/php/man/man1/
    Installing build environment: /usr/local/php/lib/php/build/
    Installing header files: /usr/local/php/include/php/
    Installing helper programs: /usr/local/php/bin/
    program: phpize
    program: php-config
    Installing man pages: /usr/local/php/php/man/man1/
    page: phpize.1
    page: php-config.1
    Installing PEAR environment: /usr/local/php/lib/php/
    [PEAR] Archive_Tar - installed: 1.4.0
    [PEAR] Console_Getopt - installed: 1.4.1
    [PEAR] Structures_Graph- installed: 1.1.1
    [PEAR] XML_Util - installed: 1.3.0
    [PEAR] PEAR - installed: 1.10.1
    Wrote PEAR system config file at: /usr/local/php/etc/pear.conf
    You may want to add: /usr/local/php/lib/php to your php.ini include_path
    /php-7.0.7/build/shtool install -c ext/phar/phar.phar /usr/local/php/bin
    ln -s -f phar.phar /usr/local/php/bin/phar
    Installing PDO headers: /usr/local/php/include/php/ext/pdo/

    [root@e8ed9b00e80c php-7.0.7]# /usr/local/php/bin/php -m
    [PHP Modules]
    bcmath
    bz2
    Core
    ctype
    curl
    date
    dom
    fileinfo
    filter
    gd
    gettext
    hash
    iconv
    json
    libxml
    mbstring
    mcrypt
    mysqli
    mysqlnd
    openssl
    pcntl
    pcre
    PDO
    pdo_mysql
    pdo_sqlite
    Phar
    posix
    readline
    Reflection
    session
    shmop
    SimpleXML
    soap
    sockets
    SPL
    sqlite3
    standard
    sysvmsg
    sysvsem
    sysvshm
    tokenizer
    xml
    xmlreader
    xmlrpc
    xmlwriter
    zip
    zlib

    [Zend Modules]

    配置文件
    需要从安装包里复制php.ini、php-fpm.conf到安装目录:
    $ cp php-7.0.7/php.ini* /usr/local/php/etc/

    $ cd /usr/local/php/etc/

    $ cp php.ini-production php.ini
    $ cp php-fpm.conf.default php-fpm.conf

    $ cp php-fpm.d/www.conf.default php-fpm.d/www.conf

    $ ls
    pear.conf php-fpm.conf.default php.ini-development php.ini-production

     配置php.ini
    # 不显示错误,默认
    display_errors = Off

    # 在关闭display_errors后开启PHP错误日志(路径在php-fpm.conf中配置),默认
    log_errors = On

    # 字符集,默认
    default_charset = "UTF-8"

    # 文件上传大小,默认
    upload_max_filesize = 2M

    # 设置PHP的扩展库路径,,默认被注释了。
    extension_dir = "/usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/"
    # 如果不设置extension_dir,也可以直接写绝对位置:
    # extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/redis.so


    # 设置PHP的时区
    date.timezone = PRC

    # 开启opcache,默认是0
    [opcache]
    ; Determines if Zend OPCache is enabled
    opcache.enable=1

    配置php-fpm.conf​
    ; 去掉里分号,方便以后重启。建议修改
    ; Default Value: none
    ; 下面的值最终目录是/usr/local/php/var/run/php-fpm.pid
    ; 开启后可以平滑重启php-fpm
    pid = run/php-fpm.pid

    ; 设置错误日志的路径,可以默认值
    ; Note: the default prefix is /usr/local/php/var
    ; Default Value: log/php-fpm.log, 即/usr/local/php/var/log/php-fpm.log
    error_log = /var/log/php-fpm/error.log

    ; Log等级,可以默认值
    ; Possible Values: alert, error, warning, notice, debug
    ; Default Value: notice
    log_level = notice

    ; 后台运行,默认yes,可以默认值
    ; Default Value: yes
    ;daemonize = yes

    ; 引入www.conf文件中的配置,可以默认值
    include=/usr/local/php/etc/php-fpm.d/*.conf

    配置www.conf(在php-fpm.d目录下)
    www.conf这是php-fpm进程服务的扩展配置文件:
    ; 设置用户和用户组,默认都是nobody。可以默认值
    user = nginx
    group = nginx

    ; 设置PHP监听
    ; 下面是默认值,不建议使用。可以默认值
    ; listen = 127.0.0.1:9000
    ; 根据nginx.conf中的配置fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    listen = /var/run/php-fpm/php-fpm.sock

    ######开启慢日志。可以默认值
    slowlog = /var/log/php-fpm/$pool-slow.log
    request_slowlog_timeout = 10s
    保存配置文件后,检验配置是否正确的方法为:
    /usr/local/php/sbin/php-fpm -t
    如果出现诸如 test is successful 字样,说明配置没有问题。另外该命令也可以让我们知道php-fpm的配置文件在哪。
     
    建立软连接:
    ln -sf /usr/local/php/sbin/php-fpm /usr/bin/
    ln -sf /usr/local/php/bin/php /usr/bin/
    ln -sf /usr/local/php/bin/phpize /usr/bin/
    ln -sf /usr/local/php/bin/php-config /usr/bin/
    ln -sf /usr/local/php/bin/php-cig /usr/bin/
    或者将php编译生成的bin目录添加到当前Linux系统的环境变量中:
    echo -e '\nexport PATH=/usr/local/php/bin:/usr/local/php/sbin:$PATH\n' >> /etc/profile && source /etc/profile

    启动php-fpm
    /usr/local/php/sbin/php-fpm 
    如果提示没有www用户(www.conf里填写了www而不是nobody),则新增:
    useradd www
    chown -R www:www /www
    检测是否启动:
    ps aux |grep php-fpm # 另外该命令也可以让我们知道fpm的配置文件在哪。
    netstat -ant |grep 9000
    查看php-fpm进程数:
    ps aux | grep -c php-fpm
    php-fpm操作汇总:
    /usr/local/php/sbin/php-fpm         # php-fpm启动
    kill -INT `cat /usr/local/php/var/run/php-fpm.pid` # php-fpm关闭
    kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` #php-fpm重启
    重启方法二:
    killall php-fpm
    /usr/local/php/sbin/php-fpm &
    如果无法平滑启动,那就终止进程id:
    ps aux | grep php-fpm
    kill -9 1210 #1210指php-fpm进程id


    二、安装Nginx


    安装包下载地址: http://nginx.org/download/nginx-1.11.1.tar.gz 
     
    依赖:
    # 为了支持rewrite功能,我们需要安装pcre
    yum install pcre-devel

    # 需要ssl的支持,如果不需要ssl支持,请跳过这一步
    # yum install openssl*

    # gzip 类库安装,按需安装
    # yum install zlib zlib-devel
    配置编译参数
    $ tar -zxvf nginx-1.11.1.tar.gz
    $ cd nginx-1.11.1
    $ ./configure \
    --prefix=/usr/local/nginx \
    --with-http_stub_status_module \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_sub_module \
    --with-http_gzip_static_module \
    --with-pcre
    配置ok:
    Configuration summary
    + using system PCRE library
    + using system OpenSSL library
    + md5: using OpenSSL library
    + sha1: using OpenSSL library
    + using system zlib library

    nginx path prefix: "/usr/local/nginx"
    nginx binary file: "/usr/local/nginx/sbin/nginx"
    nginx modules path: "/usr/local/nginx/modules"
    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"
    编译安装nginx
    make
    make install
    设置软连接:
    ln -sf /usr/local/nginx/sbin/nginx /usr/sbin 
    检测nginx:
    nginx -t
    显示:nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

    成功了。我们重新配置下nginx.conf:
    #user  nobody;
    worker_processes 1;

    #error_log logs/error.log;
    #error_log logs/error.log notice;
    #error_log logs/error.log info;

    #pid logs/nginx.pid;


    events {
    worker_connections 1024;
    }


    http {
    include mime.types;
    default_type application/octet-stream;

    # 解决虚拟主机名字过长 http://www.jb51.net/article/26412.htm
    server_names_hash_bucket_size 128;

    #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    # '$status $body_bytes_sent "$http_referer" '
    # '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log logs/access.log main;

    sendfile on;
    #tcp_nopush on;

    #keepalive_timeout 0;
    keepalive_timeout 65;

    #gzip on;

    autoindex on;# 显示目录
    autoindex_exact_size on;# 显示文件大小
    autoindex_localtime on;# 显示文件时间

    include vhosts/*.conf;

    }
    配置localhost:
    vim ./vhosts/localhost.conf
    server {
    listen 80;
    server_name localhost;

    #charset utf-8;

    #access_log logs/host.access.log main;

    location / {
    root /www/www/;
    index index.php index.html index.htm;
    }

    #error_page 404 /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    # proxy_pass http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
    root /www/www/;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }
    启动nginx:
    /usr/local/nginx/sbin/nginx

    # 或者
    nginx
    重启:
    /usr/local/nginx/sbin/nginx -s reload

    # 或者
    nginx -s reload
    停止:
    /usr/local/nginx/sbin/nginx -s stop

    # 或者
    nginx -s stop
    如果提示80端口被占用了,可以使用ps aunx | grep 80查看。一般是apache占用了。可以使用:
    chkconfig --list
    chkconfig nginx on
    service apache off
    禁止apache启动并关闭apache服务。


    三、安装扩展


    1、安装swoole
    Swoole: PHP的异步、并行、高性能网络通信引擎:http://www.swoole.com/  
    wget https://github.com/swoole/swoole-src/archive/swoole-1.8.5-stable.zip
    unzip swoole-1.8.5-stable.zip
    cd swoole-1.8.5-stable
    phpize
    ./configure
    make && make install

    2、安装redis
    wget https://github.com/nicolasff/phpredis/archive/2.2.4.tar.gz
    tar -zxvf 2.2.4
    cd phpredis-2.2.4/
    phpize
    ./configure
    make && make install


    四、信号管理


    不重载配置启动新/旧工作进程
    kill -HUP 旧/新版主进程号
    从容关闭旧/新进程
    kill -QUIT 旧/新主进程号
    如果此时报错,提示还有进程没有结束就用下面命令先关闭旧/新工作进程,再关闭主进程号:
    kill -TERM 旧/新工作进程号
    升级、添加或删除模块时,我们需要停掉服务器
    kill -USR2 旧版程序的主进程号或进程文件名

    代理到底有几种功能模式?

    运维 Ansible 发表了文章 0 个评论 3053 次浏览 2017-03-21 22:39 来自相关话题

    通常我们都知道Nginx性能很高,尤其是作为一个代理服务器,因为它用的是epoll模型,就比如Python Django Web的性能不行,我们可能就会在前端加一个nginx代理,从而提高总体的处理性能问题,但是我们常说的代理,值的是什么类型的代理呢,你知道吗 ...查看全部
    通常我们都知道Nginx性能很高,尤其是作为一个代理服务器,因为它用的是epoll模型,就比如Python Django Web的性能不行,我们可能就会在前端加一个nginx代理,从而提高总体的处理性能问题,但是我们常说的代理,值的是什么类型的代理呢,你知道吗?
     
    代理服务技术是在互联网早期就出现被使用的。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。常用的代理技术分为正向代理、反向代理和透明代理。本文就是针对这三种代理来讲解一些基本原理和具体的适用范围和nginx的配置案例,便于大家更深入理解代理服务技术。
     


    一、正向代理(Forward Proxy)


    一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术。
     
    正向代理(forward)是一个位于客户端 【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理,如下图所示:
    ForwardAgent.png

    从上面的概念中,我们看出,文中所谓的正向代理就是代理服务器【Z】替代访问方【用户A】去访问目标服务器【服务器B】。
     
    这就是正向代理的意义所在。而为什么要用代理服务器【Z】去代替访问方【用户A】去访问服务器【B】呢?为什么不直接访问呢,这就要从场景和代理服务器使用的意义说起。
     
    使用正向代理的意义和场景有如下几种:
     
    1、用户访问本来无法访问的服务器B的资源
    SpeedAccess.png

    假设最初用户A要访问服务器B需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障,那么就无法访问服务器B了。但是如果用户A让代理服务器Z去代替自己访问服务器B,由于代理服务器Z没有在路由器R1或R2节点中,而是通过其它的路由节点访问服务器B,那么用户A就可以得到服务器B的数据了。

    现实中的例子就是“翻墙”。不过自从VPN技术被广泛应用外,“翻墙”不但使用了传统的正向代理技术,有的还使用了VPN技术。
     
    2、加速访问服务器B资源
    这种说法目前不像以前那么流行了,主要是带宽流量的飞速发展。早期的正向代理中,很多人使用正向代理就是提速。
     
    还是如图2假设用户A到服务器B,经过R1路由器和R2路由器,而R1到R2路由器的链路是一个低带宽链路。而用户A到代理服务器Z,从代理服务器Z到服务器B都是高带宽链路。那么很显然就可以加速访问服务器B了。
     
    3、Cache作用
    CacheFile.png

    Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术。如上图所示,如果在用户A访问服务器B某数据F之前,已经有人通过代理服务器Z访问过服务器B上得数据F,那么代理服务器Z会把数据F保存一段时间,如果有人正好取该数据F,那么代理服务器Z不再访问服务器B,而把缓存的数据F直接发给用户A。这一技术在Cache中术语就叫Cache命中。如果有更多的像用户A的用户来访问代理服务器Z,那么这些用户都可以直接从代理服务器Z中取得数据F,而不用千里迢迢的去服务器B下载数据了。
     
    4、客户端访问授权
    这方面的内容现今使用的还是比较多的,例如一些公司采用ISA Server做为正向代理服务器来授权用户是否有权限访问互联网,如下图所示:
    AccessAuth.png

    如上图防火墙作为网关,用来过滤外网对其的访问。假设用户A和用户B都设置了代理服务器,用户A允许访问互联网,而用户B不允许访问互联网(这个在代理服务器Z上做限制)这样用户A因为授权,可以通过代理服务器访问到服务器B,而用户B因为没有被代理服务器Z授权,所以访问服务器B时,数据包会被直接丢弃。
     
    5、隐藏访问者的行踪
    如下图所示,我们可以看出服务器B并不知道访问自己的实际是用户A,因为代理服务器Z代替用户A去直接与服务器B进行交互。如果代理服务器Z被用户A完全控制(或不完全控制),会惯以“肉鸡”术语称呼。
    Hidden.png

     
    总结正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。
     
    Nginx正向代理配置示例如下:
    server{
    resolver 8.8.8.8;
    resolver_timeout 30s;
    listen 82;
    location / {
    proxy_pass http://$http_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;
    }
    }
    1、不能有hostname。 
    2、必须有resolver, 即dns,即上面的8.8.8.8,超时时间(30秒)可选。 
    3、配置正向代理参数,均是由 Nginx 变量组成。
    proxy_pass $scheme://$host$request_uri;  
    proxy_set_header Host $http_host;
    4、配置缓存大小,关闭磁盘缓存读写减少I/O,以及代理连接超时时间。
    proxy_buffers 256 4k;  
    proxy_max_temp_file_size 0;
    proxy_connect_timeout 30;
    5、配置代理服务器 Http 状态缓存时间。  
    proxy_cache_valid 200 302 10m;  
    proxy_cache_valid 301 1h;
    proxy_cache_valid any 1m;
    配置好后,重启nginx,以浏览器为例,要使用这个代理服务器,则只需将浏览器代理设置为http://+服务器ip地址+:+82(82是刚刚设置的端口号)即可使用了。


    二、反向代理(reverse proxy)


    反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
     
    使用反向代理服务器的作用如下:
     
    1、保护和隐藏原始资源服务器
    RevProxy.png

    用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。
     
    2、负载均衡
    LoadBlance.png

    当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问资源服务器B的时候,让不同的代理服务器Z(x)去应答不同的用户,然后发送不同用户需要的资源。

    当然反向代理服务器像正向代理服务器一样拥有Cache的作用,它可以缓存原始资源服务器B的资源,而不是每次都要向原始资源服务器组请求数据,特别是一些静态的数据,比如图片和文件,如果这些反向代理服务器能够做到和用户X来自同一个网络,那么用户X访问反向代理服务器X,就会得到很高质量的速度。这正是CDN技术的核心。如下图所示:
    CdnProxy.png

    我们并不是讲解CDN,所以去掉了CDN最关键的核心技术智能DNS。只是展示CDN技术实际上利用的正是反向代理原理这块。

    反向代理结论与正向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

    基本上,网上做正反向代理的程序很多,能做正向代理的软件大部分也可以做反向代理。开源软件中最流行的就是squid,既可以做正向代理,也有很多人用来做反向代理的前端服务器。另外MS ISA也可以用来在Windows平台下做正向代理。反向代理中最主要的实践就是WEB服务,近些年来最火的就是Nginx了。网上有人说Nginx不能做正向代理,其实是不对的。Nginx也可以做正向代理,不过用的人比较少了。
     
    Nginx反向代理示例:
    http {
    # 省略了前面一般的配置,直接从负载均衡这里开始
    # 设置地址池,后端3台服务器
    upstream http_server_pool {
    server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=30s;
    server 192.168.1.3:8080 weight=3 max_fails=2 fail_timeout=30s;
    server 192.168.1.4:8080 weight=4 max_fails=2 fail_timeout=30s;
    }
    # 一个虚拟主机,用来反向代理http_server_pool这组服务器
    server {
    listen 80;
    # 外网访问的域名
    server_name www.test.com;
    location / {
    # 后端服务器返回500 503 404错误,自动请求转发到upstream池中另一台服务器
    proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
    proxy_pass http://http_server_pool;
    proxy_set_header Host www.test.com;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    access_log logs/www.test.com.access.log combined;
    }
    }
    最简单的反向代理演示(在一台服务器上做代理服务器,将http请求转发到另一台IIS服务器上,通过二级域名形式访问。)编辑vim nginx.conf
    server {
    listen 80;
    server_name test.zhoumengkang.com;
    location / {
    proxy_pass http://121.199.**.*:80;
    }
    }
    参考:http://www.blogjava.net/xiaomage234/archive/2011/09/08/358247.html 
     


    三、透明代理


    如果把正向代理、反向代理和透明代理按照人类血缘关系来划分的话。那么正向代理和透明代理是很明显堂亲关系,而正向代理和反向代理就是表亲关系了 。

    透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。

    透明代理实践的例子就是时下很多公司使用的行为管理软件。如下图所示:
    tmproxy.png

    用户A和用户B并不知道行为管理设备充当透明代理行为,当用户A或用户B向服务器A或服务器B提交请求的时候,透明代理设备根据自身策略拦截并修改用户A或B的报文,并作为实际的请求方,向服务器A或B发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户A或B,如上图,如果透明代理设置不允许访问服务器B,那么用户A或者用户B就不会得到服务器B的数据。
     
    Nginx透明代理配置示例:
    # cat /etc/nginx/sites-enabled/proxy
    server {
    resolver 8.8.8.8;
    access_log off;
    listen [::]:8080;
    location / {
    proxy_pass $scheme://$host$request_uri;
    proxy_set_header Host $http_host;
    proxy_buffers 256 4k;
    proxy_max_temp_file_size 0k;
    }
    }

    iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080
    RAW Paste Data
    # cat /etc/nginx/sites-enabled/proxy
    server {
    resolver 8.8.8.8;
    access_log off;
    listen [::]:8080;
    location / {
    proxy_pass $scheme://$host$request_uri;
    proxy_set_header Host $http_host;
    proxy_buffers 256 4k;
    proxy_max_temp_file_size 0k;
    }
    }

    iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080
    参考:
    http://z00w00.blog.51cto.com/515114/1031287  
    https://mengkang.net/78.html  

    Nginx location配置及rewrite规则写法总结

    运维 Geek小A 发表了文章 1 个评论 2567 次浏览 2017-03-13 23:49 来自相关话题

    location正则写法 简单示例如下: location = / { # 精确匹配 /,主机名后面不能带任何字符串 [ configuration A ] } ...查看全部
    nginxre.png


    location正则写法


    简单示例如下
    location = / {
    # 精确匹配 /,主机名后面不能带任何字符串
    [ configuration A ]
    }

    location / {
    # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 ,比如我们代理的一个站点根
    # 但是正则和最长字符串会优先匹配
    [ configuration B ]
    }

    location /documents/ {
    # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
    # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
    [ configuration C ]
    }

    location ~ /documents/Abc {
    # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
    # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
    [ configuration CC ]
    }

    location ^~ /images/ {
    # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
    [ configuration D ]
    }

    location ~* \.(gif|jpg|jpeg)$ {
    # 匹配所有以 gif,jpg或jpeg 结尾的请求
    # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
    [ configuration E ]
    }

    location /images/ {
    # 字符匹配到 /images/,继续往下,会发现 ^~ 存在
    [ configuration F ]
    }

    location /images/abc {
    # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
    # F与G的放置顺序是没有关系的
    [ configuration G ]
    }

    location ~ /images/abc/ {
    # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
    [ configuration H ]
    }

    location ~* /js/.*/\.js

    • =开头表示精确匹配 如A中只匹配根目录结尾的请求,后面不能带任何字符串。
    • ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
    • ~ 开头表示区分大小写的正则匹配;
    • ~* 开头表示不区分大小写的正则匹配
    • / 通用匹配, 如果没有其它匹配,任何请求都会匹配到
     匹配优先级:

    (location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)

    按照上面的location顺序,以下的匹配示例成立:
    • / -> config A  # 精确完全匹配,即使/index.html也匹配不了
    • /downloads/download.html -> config B   # 匹配B以后,往下没有任何匹配,采用B
    • /images/1.gif -> configuration D   # 匹配到F,往下匹配到D,停止往下
    • /images/abc/def -> config D   # 最长匹配到G,往下匹配D,停止往下,你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序
    • /documents/document.html -> config C    # 匹配到C,往下没有任何匹配,采用C
    • /documents/1.jpg -> configuration E   # 匹配到C,往下正则匹配到E
    • /documents/Abc.jpg -> config CC   # 最长匹配到C,往下正则顺序匹配到CC,不会往下到E
     

    实际使用建议

     
    所以实际使用中,个人觉得至少有三个匹配规则定义,如下:#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。#这里是直接转发给后端应用服务器了,也可以是一个静态首页# 第一个必选规则location = / {    proxy_pass http://tomcat:8080/index}# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用location ^~ /static/ {    root /webroot/static/;}location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {    root /webroot/res/;}#第三个规则就是通用规则,用来转发动态请求到后端应用服务器#非静态文件请求就默认是动态请求,自己根据实际把握#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了location / {    proxy_pass http://tomcat:8080/}
    参考:http://tengine.taobao.org/book/chapter_02.html  http://nginx.org/en/docs/http/ngx_http_rewrite_module.html   

    Rewrite规则

    ewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。语法rewrite regex replacement [flag]; 如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。表明看rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:[list=1]
  • 执行server块的rewrite指令
  • 执行location匹配
  • 执行选定的location中的rewrite指令
  • 如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。  flag标志位
    • last : 相当于Apache的[L]标记,表示完成rewrite
    • break : 停止执行当前虚拟主机的后续rewrite指令集
    • redirect : 返回302临时重定向,地址栏会显示跳转后的地址
    • permanent : 返回301永久重定向,地址栏会显示跳转后的地址
      因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:[list=1]
  • last一般写在server和if中,而break一般使用在location中
  • last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
  • break和last都能组织继续执行后面的rewrite指令
  •   if指令与全局变量if判断指令语法为if(condition){...},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容:
    • 当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
    • 直接比较变量和内容时,使用=或!=
    • ~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配
    -f和!-f用来判断是否存在文件-d和!-d用来判断是否存在目录-e和!-e用来判断是否存在文件或目录-x和!-x用来判断文件是否可执行 示例:
    if ($http_user_agent ~ MSIE) {    rewrite ^(.*)$ /msie/$1 break;} //如果UA包含"MSIE",rewrite请求到/msid/目录下if ($http_cookie ~* "id=([^;]+)(?:;|$)") {    set $id $1; } //如果cookie匹配正则,设置变量$id等于正则引用部分if ($request_method = POST) {    return 405;} //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302if ($slow) {    limit_rate 10k;} //限速,$slow可以通过 set 指令设置if (!-f $request_filename){    break;    proxy_pass  http://127.0.0.1; } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查if ($args ~ post=140){    rewrite ^ http://example.com/ permanent;} //如果query string中包含"post=140",永久重定向到example.comlocation ~* \.(gif|jpg|png|swf|flv)$ {    valid_referers none blocked www.jefflei.com www.leizhenfang.com;    if ($invalid_referer) {        return 404;    } //防盗链}
     全局变量下面是可以用作if判断的全局变量:
    • $args : #这个变量等于请求行中的参数,同$query_string
    • $content_length : 请求头中的Content-length字段。
    • $content_type : 请求头中的Content-Type字段。
    • $document_root : 当前请求在root指令中指定的值。
    • $host : 请求主机头字段,否则为服务器名称。
    • $http_user_agent : 客户端agent信息
    • $http_cookie : 客户端cookie信息
    • $limit_rate : 这个变量可以限制连接速率。
    • $request_method : 客户端请求的动作,通常为GET或POST。
    • $remote_addr : 客户端的IP地址。
    • $remote_port : 客户端的端口。
    • $remote_user : 已经经过Auth Basic Module验证的用户名。
    • $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
    • $scheme : HTTP方法(如http,https)。
    • $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
    • $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
    • $server_name : 服务器名称。
    • $server_port : 请求到达服务器的端口号。
    • $request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
    • $uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
    • $document_uri : 与$uri相同。
     示例:http://localhost:88/test1/test2/test.php
    $host:localhost$server_port:88$request_uri:http://localhost:88/test1/test2/test.php$document_uri:/test1/test2/test.php$document_root:/var/www/html$request_filename:/var/www/html/test1/test2/test.php
    常用正则
    • . : 匹配除换行符以外的任意字符
    • ? : 重复0次或1次
    • + : 重复1次或更多次
    • * : 重复0次或更多次
    • \d :匹配数字
    • ^ : 匹配字符串的开始
    • $ : 匹配字符串的介绍
    • {n} : 重复n次
    • {n,} : 重复n次或更多次
    • [c] : 匹配单个字符c
    • [a-z] : 匹配a-z小写字母的任意一个

    小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
     
     
    rewrite实例
    示例1:
    http {
    # 定义image日志格式
    log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
    # 开启重写日志
    rewrite_log on;

    server {
    root /home/www;

    location / {
    # 重写规则信息
    error_log logs/rewrite.log notice;
    # 注意这里要用‘’单引号引起来,避免{}
    rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
    # 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行
    set $image_file $3;
    set $image_type $4;
    }

    location /data {
    # 指定针对图片的日志格式,来分析图片类型和大小
    access_log logs/images.log mian;
    root /data/images;
    # 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里
    try_files /$arg_file /image404.html;
    }
    location = /image404.html {
    # 图片不存在返回特定的信息
    return 404 "image not found\n";
    }
    }
    对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,于是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在则正常响应,如果不存在则重写tryfiles到新的image404 location,直接返回404状态码。
     
    示例2:
    rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;
    对形如/images/bla_500x400.jpg的文件请求,重写到/resizer/bla.jpg?width=500&height=400地址,并会继续尝试匹配location。

    一个IP的主机上配置Nginx的多个HTTPS虚拟主机

    运维 Ansible 发表了文章 0 个评论 3202 次浏览 2016-12-25 22:19 来自相关话题

    最近公司域名更变,同时,又要新旧域名同时运行。 那么,对于https的域名在同一个IP上如何同时存在多个虚拟主机呢?查看了下nginx手册,有这么一段内容,如下: 如果在同一个IP上配置多个HTTPS主机,会出现一个很普遍的问题:se ...查看全部
    最近公司域名更变,同时,又要新旧域名同时运行。 那么,对于https的域名在同一个IP上如何同时存在多个虚拟主机呢?查看了下nginx手册,有这么一段内容,如下:

    如果在同一个IP上配置多个HTTPS主机,会出现一个很普遍的问题:
    server {
    listen 443;
    server_name www.example.com;
    ssl on;
    ssl_certificate www.example.com.crt;
    ...
    }

    server {
    listen 443;
    server_name www.example.org;
    ssl on;
    ssl_certificate www.example.org.crt;
    ...
    }
    使用上面的配置,不论浏览器请求哪个主机,都只会收到默认主机www.example.com的证书。这是由SSL协议本身的行为引起的——先建立SSL连接,再发送HTTP请求,所以nginx建立SSL连接时不知道所请求主机的名字,因此,它只会返回默认主机的证书。

    最古老的也是最稳定的解决方法就是每个HTTPS主机使用不同的IP地址:
    server {
    listen 192.168.1.1:443;
    server_name www.example.com;
    ssl on;
    ssl_certificate www.example.com.crt;
    ...
    }

    server {
    listen 192.168.1.2:443;
    server_name www.example.org;
    ssl on;
    ssl_certificate www.example.org.crt;
    ...
    }
    那么,在同一个IP上,如何配置多个HTTPS主机呢?

    nginx支持TLS协议的SNI扩展(Server Name Indication,简单地说这个扩展使得在同一个IP上可以以不同的证书serv不同的域名)。不过,SNI扩展还必须有客户端的支持,另外本地的OpenSSL必须支持它。

    如果启用了SSL支持,nginx便会自动识别OpenSSL并启用SNI。是否启用SNI支持,是在编译时由当时的 ssl.h 决定的(SSL_CTRL_SET_TLSEXT_HOSTNAME),如果编译时使用的OpenSSL库支持SNI,则目标系统的OpenSSL库只要支持它就可以正常使用SNI了。

    nginx在默认情况下是TLS SNI support disabled。

    启用方法:
    需要重新编译nginx并启用TLS。步骤如下:
    # wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz
    # tar zxvf openssl-1.0.1e.tar.gz
    # ./configure --prefix=/usr/local/nginx --with-http_ssl_module \
    --with-openssl=./openssl-1.0.1e \
    --with-openssl-opt="enable-tlsext"
    # make
    # make install
    查看是否启用:
    # /usr/local/nginx/sbin/nginx -V
    TLS SNI support enabled
    这样就可以在 同一个IP上配置多个HTTPS主机了。

    实例如下:
    server  {
    listen 443;
    server_name www.baidu.com;
    index index.html index.htm index.php;
    root /data/wwwroot/baidu/webroot;
    ssl on;
    ssl_certificate "/usr/local/nginx/conf/ssl/www.baidu.com.public.cer";
    ssl_certificate_key "/usr/local/nginx/conf/ssl/www.baidu.com.private.key";
    ......
    }

    server {
    listen 443;
    server_name www.uko.com;
    index index.html index.htm index.php;
    root /data/wwwroot/www.uko.com/webroot;
    ssl on;
    ssl_certificate "/usr/local/nginx/conf/ssl/www.uko.com.public.cer";
    ssl_certificate_key "/usr/local/nginx/conf/ssl/www.uko.com.private.key";
    ......
    }
    分享阅读:http://www.ttlsa.com/web/multiple-https-host-nginx-with-a-ip-configuration/

    Apche和Nginx 状态页面开启设置

    运维 Ansible 发表了文章 0 个评论 3478 次浏览 2016-11-09 22:30 来自相关话题

    Apache Server Status​设置 1、确认apache已经加载了status_module 模块 一般yum安装的apache已经在主配置文件/etc/httpd/conf/httpd.conf 里面已经加载 ...查看全部
    ApachNginxStatus.png


    Apache Server Status​设置


    1、确认apache已经加载了status_module 模块
    一般yum安装的apache已经在主配置文件/etc/httpd/conf/httpd.conf 里面已经加载了
    LoadModule status_module modules/mod_status.so
    检验如下:
    [root@web1 httpd]# apachectl -M |grep -i 'status'
    status_module (shared)
    Syntax OK
    如果是编译安装的apache,那你就可能没有安装了,编译安装的,动态添加如下:
    # 进入到apache的源码mod_status.c目录
    cd /usr/local/httpd-2.2.3/modules/generators
    # 执行编译加载程序
    /usr/local/apache/bin/apxs -i -a -c mod_status.c
    # 重启httpd服务
    service httpd restart
    最后在用httpd -M检查模块是否已经加载,确认模块已经加载没有问题后,在httpd.conf文件增加相应的配置路径 ,引入mod_status.so的配置段:
    ExtendedStatus On

    SetHandler Server-status
    Order deny,allow
    Deny from all
    Allow from 192.168.1.100

    说明:
    1. Deny from表示禁止的访问地址;
    2. Allow from表示允许的地址访问;
    3. ExtendedStatus On表示的是待会访问的时候能看到详细的请求信息,另外该设置仅能用于全局设置,不能在特定的虚拟主机中打开或关闭。启用扩展状态信息将会导致服务器运行效率降低。

     状态页的配置到这里就结束了,下面我们来访问一下,看看具体状态页有哪些可以利用的价值数据。
    输入网址http://IP:PORT/server-status就可以看到apache状态页了。
    Apache Server Status for localhost
    Server Version: Apache/2.2.3 (Centos)
    Server Built: Nov 9 2016 15:18:56

    Current Time: Sunday, 11-Nov-2016 17:44:21 Öйú±ê׼ʱ¼ä
    Restart Time: Sunday, 11-Nov-2016 17:36:28 Öйú±ê׼ʱ¼ä
    Parent Server Generation: 1
    Server uptime: 7 minutes 52 seconds
    Total accesses: 0 - Total Traffic: 0 kB
    0 requests/sec - 0 B/second -
    1 requests currently being processed, 63 idle workers
    ______________________________________________________________W_
    ................................................................

    Scoreboard Key:"_" Waiting for Connection, "S" Starting up, "R" Reading Request,"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,"C" Closing connection, "L" Logging, "G" Gracefully finishing,"I" Idle cleanup of worker, "." Open slot with no current process
    Srv PID Acc M SS Req Conn Child Slot Client VHost Request
    0-1 4140 0/0/0 W 0 287636364 0.0 0.00 0.00 127.0.0.1 192.168.0.100 GET /c-server-status HTTP/1.1

    Srv Child Server number - generation
    PID OS process ID
    Acc Number of accesses this connection / this child / this slot
    M Mode of operation
    SS Seconds since beginning of most recent request
    Req Milliseconds required to process most recent request
    Conn Kilobytes transferred this connection
    Child Megabytes transferred this child
    Slot Total megabytes transferred this slot
    参数分析:
    字段 说明
    Server Version Apache 服务器的版本。
    Server Built Apache 服务器编译安装的时间。
    Current Time 目前的系统时间。
    Restart Time Apache 重新启动的时间。
    Parent Server Generation Apache 父程序 (parent process) 的世代编号,就是 httpd 接收到 SIGHUP 而重新启动的次数。
    Server uptime Apache 启动后到现在经过的时间。
    Total accesses 到目前为此 Apache 接收的联机数量及传输的数据量。
    CPU Usage 目前 CPU 的使用情形。
    _SWSS.... 所有 Apache process 目前的状态。每一个字符表示一个程序,最多可以显示 256 个程序的状态。
    Scoreboard Key 上述状态的说明。以下为每一个字符符号所表示的意义:
    * _:等待连结中。
    * S:启动中。
    * R:正在读取要求。
    * W:正在送出回应。
    * K:处于保持联机的状态。
    * D:正在查找DNS。
    * C:正在关闭连结。
    * L:正在写入记录文件。
    * G:进入正常结束程序中。
    * I:处理闲置。
    * .:尚无此程序。
    Srv 本程序与其父程序的世代编号。
    PID 本程序的process id。
    Acc 分别表示本次联机、本程序所处理的存取次数。
    M 该程序目前的状态。
    CPU 该程序所耗用的CPU资源。
    SS 距离上次处理要求的时间。
    Req 最后一次处理要求所耗费的时间,以千分之一秒为单位。
    Conn 本次联机所传送的数据量。
    Child 由该子程序所传送的数据量。
    Slot 由该 Slot 所传送的数据量。
    Client 客户端的地址。
    VHost 属于哪一个虚拟主机或本主机的IP。
    Request 联机所提出的要求信息。


    Nginx 状态页配置


    如果你的nginx看到了--with-http_sub_module 这个模块,就代表可以启用status,使用nginx -V 就可以看到你的编译参数,如果没有的话,自行重新编译加上--with-http_sub_module 就好。
     
    1、添加nginx status配置
    在默认主机里面加上location或者你希望能访问到的主机里面
     location /nginx_status {
    stub_status on;
    access_log off;
    allow 10.0.1.xx;
    allow 139.59.253.28;
    deny all;
    }

    2、重启nginx
    # service nginx restart
    3、查看status页面
    # curl http://127.0.0.1/nginx_status
    Active connections: 10132
    server accepts handled requests
     11302 11302 11409
    Reading: 0 Writing: 7 Waiting: 142
    第1列:
    当前与http建立的连接数,包括等待的客户端连接:10132

    第2列:
    接受的客户端连接总数目:11302
    处理的客户端连接总数目:11302
    客户端总的请求数目:11409
    总共处理了11302个连接 , 成功创建11302次握手, 总共处理了11409个请求

    第3列:
    reading — 读取客户端的连接数.
    writing — 响应数据到客户端的数量
    waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.
     
    nginx plus (企业用户)官网(http://demo.nginx.com/status.html#)图示如下:
    NginxStatus.png

    Nginx负载均衡MYSQL数据库

    运维 being 发表了文章 0 个评论 3587 次浏览 2016-11-09 14:16 来自相关话题

    默认Nginx只支持http的反向代理,要想nginx支持tcp的反向代理,还需要在编译时增加tcp代理模块支持,即nginx_tcp_proxy_module,具体实现如下。   一、编译安装 ...查看全部
    Nginx_Proxy_Mysql.png

    默认Nginx只支持http的反向代理,要想nginx支持tcp的反向代理,还需要在编译时增加tcp代理模块支持,即nginx_tcp_proxy_module,具体实现如下。
     


    一、编译安装


    添加nginx支持tcp_proxy模块,如需其他功能自动编译其他模块,例如:prce、gzip、ssl等功能。
    cd /usr/local/src/
    wget "https://github.com/yaoweibin/nginx_tcp_proxy_module/archive/master.zip"
    mkdir -pv /data/ModulePlugin && unzip master.zip -d /data/ModulePlugin/
    wget 'http://nginx.org/download/nginx-1.2.1.tar.gz'
    tar -xzvf nginx-1.2.1.tar.gz
    cd nginx-1.2.1/
    patch -p1 < /data/ModulePlugin/nginx_tcp_proxy_module-master/tcp.patch
    ./configure --prefix=/usr/local/nginx --add-module=/data/ModulePlugin/nginx_tcp_proxy_module-master/ --with-http_stub_status_module --with-http_gzip_static_module
    make
    make install

     
     


    二、添加配置


    1、在主配置文件nginx.conf 中include 加载目录
    user  nobody;
    worker_processes 4;

    error_log logs/error.log info;

    pid logs/nginx.pid;


    events {
    worker_connections 2048;
    }

    include /usr/local/nginx/conf/vhost/*.conf;

    http {
    include mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log logs/access.log main;

    sendfile on;
    #tcp_nopush on;

    keepalive_timeout 65;
    #gzip on;

    server {
    listen 3306;
    server_name udb.com;

    #charset utf-8;

    location / {
    root html;
    index index.html index.htm;
    }

    location /nginx_status {
    stub_status on;
    access_log logs/nginx_status.log;
    allow 10.0.1.136;
    deny all;
    }

    #error_page 404 /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }

    }

    }
    /usr/local/nginx/conf/vhost/proxy_mysql.conf 内容如下:
    tcp {
    upstream mysqldb {
    server 10.0.1.138:3306;
    server 10.0.1.139:3306;

    check interval=3000 rise=2 fall=5 timeout=1000;
    #check interval=3000 rise=2 fall=5 timeout=1000
    #check interval=3000 rise=2 fall=5 timeout=1000
    #check_http_send "GET /HTTP/1.0\r\n\r\n";
    #check_http_expect_alive http_2xxhttp_3xx;
    }

    server {
    listen 3307;
    proxy_pass mysqldb;
    }
    }
    参数说明:
    check interval 健康检查,单位是毫秒
    rise 检查几次正常后,将reslserver加入以负载列表中
    fall 检查几次失败后,摘除realserver
    timeout 检查超时时间,单位许毫秒
    具体可查看nginx_tcp_proxy_module-master/README,也可以查看:https://github.com/yaoweibin/nginx_tcp_proxy_module

    梳理nginx、fastCGI、php-fpm之间的关系

    运维 koyo 发表了文章 0 个评论 2888 次浏览 2016-10-15 17:17 来自相关话题

    背景介绍 在Linux下搭建Nginx+Mysql+PHP(LPMN)的时候,nginx.conf中配需要配置fastCGI,php需要安装php-fpm扩展并启动php-fpm守护进程,nginx才可以解析php脚本。那么,这样配置 ...查看全部
    NginxLogo.jpeg


    背景介绍


    在Linux下搭建Nginx+Mysql+PHP(LPMN)的时候,nginx.conf中配需要配置fastCGI,php需要安装php-fpm扩展并启动php-fpm守护进程,nginx才可以解析php脚本。那么,这样配置的背后原理是什么?nginx、fastCGI、php-fpm之间又有什么关系呢?一直有这样的疑惑,由于无法理清nginx、php-fpm之间的关系,遇到nginx解析不了php脚本的时候,往往不知所措,花费的问题排查时间也非常长。因此,特地抽时间了解这背后的原理,梳理了一下nginx、fastCGI、php-fpm之间的关系。


    什么是fastCGI


    fastCGI是由CGI(common gateway interface,通用网关接口)发展而来,是http服务器(nginx、apache)和动态脚本语言(php)之间的通信接口。记住,fastCGI只是一个接口。
     
    传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。
     
    FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
     


    Nginx+FastCGI运行原理


    Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。详细的过程,如图1所示。
    NginxFastcgi.png

     


    spawn-fcgi与PHP-FPM


    前面介绍过,FastCGI接口方式在脚本解析服务器上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是FastCGI进程管理器,或者称之为FastCGI引擎, spawn-fcgi与PHP-FPM就是支持PHP的两个FastCGI进程管理器。
     
    下面简单介绍spawn-fcgi与PHP-FPM的异同。
    spawn-fcgi是HTTP服务器lighttpd的一部分,目前已经独立成为一个项目,一般与lighttpd配合使用来支持PHP,但是ligttpd的spwan-fcgi在高并发访问的时候,会出现内存泄漏甚至自动重启FastCGI的问题。
     
    Nginx是个轻量级的HTTP server,必须借助第三方的FastCGI处理器才可以对PHP进行解析,因此Nginx+spawn-fcgi的组合也可以实现对PHP的解析,这里不过多讲述。

    PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。

    FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求。
    具体更多详解参考:http://ixdba.blog.51cto.com/2895551/806622

    Nginx动静分离和重定向设置

    运维 chris 发表了文章 0 个评论 2729 次浏览 2016-07-27 20:07 来自相关话题

    动静分离 通常我们拥有动态处理服务器(例如php、php-fpm、Python wsgi,Node.JS等),而静态文件我们又希望使用Nginx来管理,提供缓存等功能。那我们用到如下设置: location ~ .*\.( ...查看全部


    动静分离


    通常我们拥有动态处理服务器(例如php、php-fpm、Python wsgi,Node.JS等),而静态文件我们又希望使用Nginx来管理,提供缓存等功能。那我们用到如下设置:
    location ~ .*\.(htm|html|js|css|gif|jpg|jpeg|png|bmp|ico|swf|flv)$
    {
    root /data/www;
    }

    location / {
    proxy_pass http://10.0.1.110:8000;
    proxy_redirect off;
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    }
    }


    域名重写


    我们可以在同一个server中绑定域名www.baidu.com和baidu.com两个域名:
    server {
    listen 80;
    server_name baidu.com www.baidu.com;
    }
    但是这样对于SEO非常不利,我们需要使用301(rewrite)将一个域名重定向到另一个,比如将baidu.com重定向到www.baidu.com。这里要依赖于正则表达式的分组(使用$1来引用分组)。
    server {
    listen 80;
    server_name baidu.com www.baidu.com;
    if($host!= 'www.baidu.com'){
    rewrite ^/(.*)$ http://www.baidu.com/$1 permanent;
    }}


    http重写到https


    另外一个需求是将两个域名的所有的http请求转发到https上,提高安全级别,同时实现二级域名转向一级域名。
    server {
    listen 80;
    server_name www.baidu.com baidu.com;
    rewrite ^(.*)$ https://$host$1 permanent;
    }
    server {
    listen 443 ssl;
    ssl_certificate /etc/nginx/server.crt;
    ssl_certificate_key /etc/nginx/server.key;
    server_name www.baidu.com baidu.com;
    root /data/www;
    index index.html index.htm;
    if ($host != 'baidu.com') {
    rewrite ^/(.*)$ https://baidu.com/$1 permanent;
    }
    #...
    }

    Nginx的default_server指令解析

    运维 Rock 发表了文章 0 个评论 2900 次浏览 2016-04-25 23:17 来自相关话题

    server { listen 80 default_server; server_name openskill.cn www.openskill.cn; ... }先看 ...查看全部
    server {
    listen 80 default_server;
    server_name openskill.cn www.openskill.cn;
    ...
    }
    先看看上面这段配置,listen 指令后面有一个参数 default_server ,这个参数是在 0.8.21版本以后才有的,而之前是 default 指令来设定的。
     
    Nginx 的虚拟主机是通过HTTP请求中的Host值来找到对应的虚拟主机配置,如果找不到呢?那 Nginx 就会将请求送到指定了 default_server 的 节点来处理,如果没有指定为 default_server 的话,就跑到 localhost 的节点,如果没有 localhost 的节点,那只好 404 了。
     
    另外你也可以指定对于没有匹配的 Host 值时,返回错误到客户端,这在现在国内用来处理未备案域名指向自己时非常有用,看看下面的配置:
    server {
    listen 80 default_server;
    server_name _;
    return 444;
    }
    通过返回444这个Nginx的非标准错误码来让Nginx断开与浏览器之间的连接。
    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。