标签:代理服务器 web服务器 虚拟主机 配置文件 nginx-proxy 反向代理
基本功能:
静态资源的web服务器,能缓存打开的文件描述符
反向代理服务器丶缓存丶负载均衡:
支持FastCGI
模块化,非DSO机制,过滤器gzip,SSI和图像大小调整
支持SSL
扩展功能:
基于名称和IP做虚拟主机
支持keepalive
支持平滑配置更新或程序版本升级
支持访问日志,支持使用日志缓存以提高性能
支持url rewrite
支持路径别名
支持基于IP及用户的认证
支持速率限制,并发限制等
Nginx的基本架构:
一个master,生成一个或多个worker
事件驱动:kqueue,epool,/dev/poll
支持sendfile,sendfile64
文件AIO
支持mmap
Nginx:非阻塞、时间驱动、一个master多个worker、一个worker响应多个用户请求
Nginx的模块类别:
核心模块
标准的http模块
可选的http模块
邮件模块
第三方扩展模块
main配置段
http{
}
配置参数需要以分号结尾
语法格式: 参数名 值1 [值2 ...];
还支持使用变量:
模块内置变量
用户自定义变量
set var_name value
Nginx基本配置的类别:
用户调试、定位问题
正长运行的必备配置
优化性能的配置
事件类的配置
Worker进程应该以普通用户身份运行:nginx用户、nginx组:
HTTP的方法:GET, HEAD, POST, PUT, DELETE,
正常运行的必备配置
1、user username [groupname]
指定运行worker进程的用户和组
2、pid /path/to/pidfile_name;
指定nginx的pid文件
3、worker_rlimit_nofile #;
指定worker进程所能打开的最大文件据炳数;
4、worker_rlimit_sigpending #;
设定每个用户能够发往worker进程的信号的数量
1、worker_processes #;
worker进程的个数:通常其个数应该为CPU的物理核心数减1
2、worker_cpu_affinity cpumask ....;
绑定cpu
0000
0001
0010
0100
1000
worker_processes 6;
worker_cpu_affinity 00000001 00000010 00001000 00010000 00100000;
3、ssl_engine device;
在存在ssl硬件加速器的服务器上,指定所使用的ssl硬件加速设备。
4、timer_resoltion t;
每次内核事件调用返回时,都会使用gettimeofday()来更新nginx缓存时钟;
Timer_resolution 用于定义每隔多久才会由gettimeofday()来更新一次缓存时钟;x86-64系统上,gettimeofday()代价已经很小,可以忽略此配置;
5、work_priority nice;
-20,19之间的值
例如:work_priority -10;
1、accept_mutex [on|off]
是否打开nginx负载均衡,此锁能够让多个worker进行轮流地、序列化地与新的用户建立连接;而通常当一个worker进程的负载达到7/8.master就尽可能不再将请求调度次worker;
2、lock_file /path/to/lock_file
lock文件
3、accept_mutex_delay #ms;
accept锁模式种,一个worker进程为取得accept锁的等待时长;如果某worker进程在某次试图取得锁时失败了,至少等待#ms才能再一次请求锁;
4、multi_accept on|off;
是否允许一次性地响应多个用户请求;
5、use [epoll|rtsig|select|poll]
定义使用的事件模型,建议让nginx自动选择;
6、worker_connections #;
每个worker能够并发响应的并发请求数。
用于调试、定位问题:只调试nginx时使用
1、daemon [on|off];
是否让nginx运行后台,默认为on,调试时可以设置为off,使得所有信息都去接输出控制台;
2、master_process [on|off]
是否以master/worker模式运行nginx;默认为on;调试时可设置为off以方便追踪;
3、error_log /path/to/error.log level;
调试日志文件及其级别;默认为error级别,调试时可以使用debug级别,但要求在编译时必须使用 --with-debug启用debug功能;
必须使用虚拟主机来配置站点,每个虚拟主机使用一个server{}段配置;
Server{
}
非虚拟主机的配置或公共配置,需要定义在server之外,http之内。
1、server{}
定义一个虚拟主机;nginx支持使用基于主机名或IP的虚拟主机;
2、listen
listen address[:port];
Listen port
default_server:定义次server为http中默认的server;如果所有的server中没有任何一个listen使用此参数,那么第一个server为默认server。
rcvbuf=SIZE;接受缓冲大小;
sndbuf=SIZE;发送缓冲大小;
ssl;https server;
3、server_name [...];
server_name可以跟多个主机名,名称可以使用通配符;当nginx收到一个请求时,会取出其首部的server的值而后跟众server_name进行比较;
比较方式:
(1)先做精确匹配; www.zx.com
(2)左侧通配符匹配; *.zx.com
(3)右侧通配符匹配; www.abc.com,www.*
(4)正则表达式匹配;
4、server_name_hash_bucket_size 32|64|128;
为了实现快速查找,nginx使用hash表来保存主机名;
编译安装
rpm包安装
首先添加用户nginx,实现以之运行nginx服务进程:
# groupadd -r nginx
# useradd -r -g nginx nginx
yum groupinstall "Development Tools" "Server Platform Development" -y
yum -y install pcre-devel
wget http://nginx.org/download/nginx-1.6.3.tar.gz
tar zxvf nginx-1.6.3.tar.gz
cd nginx-1.6.3.tar.gz
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre&&make && make install
配置启动脚本
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed ‘s/[^*]*--user=\([^ ]*\).*/\1/g‘ -`
options=`$nginx -V 2>&1 | grep ‘configure arguments:‘`
for opt in $options; do
if [ `echo $opt | grep ‘.*-temp-path‘` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
而后为此脚本赋予执行权限:
# chmod +x /etc/rc.d/init.d/nginx
添加至服务管理列表,并让其开机自动启动:
# chkconfig --add nginx
# chkconfig nginx on
而后就可以启动服务并测试了:
# service nginx start
vim /etc/nginx/nginx.conf
全局:
worker_processes 6; (建议是物理cpu核心数减一)
worker_rlimit_nofile 99999;
http{
keepalive_timeout 5
}
1、虚拟主机配置:
server {
listen 80 default_server;
server_name www.b.com;
root html/b.com;
}
2、Ip访问控制
server {
listen 80 default_server;
server_name www.b.com;
root html/b.com;
allow 192.168.19.140;
deny 192.168.19.;
deny all;
}
3、用户控制
server {
listen 80 default_server;
server_name www.b.com;
root html/b.com;
#allow 192.168.19.;
#deny 192.168.19.;
#deny all;
location /admin/{
root html/b.com;
auth_basic "admin area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
建立用户认证文件:
htpasswd -c -m /etc/nginx/.htpasswd tom
4、建立下载站点
server {
listen 80 default_server;
server_name www.b.com;
root html/b.com;
location /download/ {
root html/b.com/;
autoindex on;
}
防盗链(盗链:其他网站使用你网站的图片,他的服务器负载很小,但是你的负载很大,而且访问的地址还是其他网站)
(1)定义合规的引用
valid_referers none | blocked | server_name |string ...;
(2)拒绝
if ($invalid_referer) {
rewrite ^/.* http://www.b.com/403.html
}
(3)例如
location ~* \.(jpg|png|gif|jpeg)$ {
root html/b.com/images/;
valid_referers none blocked www.b.com *.b.com;
if ($invalid_referer) {
rewrite ^/ http://www.b.com/403.html;
}
}
rewrite regex replacement [flag];基于正则表达式的查找替换
正则表达式 替换 [标志位]
location / {
root html/b.com
rewrite ^/bbs/(.*)$ http://www.cc.com/$1 break;
}
http://www.b.com/bbs/a.jpg --> http://www.cc.com/a.jpg
http://www.b.com/bbs/a.php --> http://www.cc.com/a.jpg
http://www.c.com/bbs/a.php --> http://www.cc.com/a.jpg
http://www.c.com/bbs/a.jpg --> http://www.cc.com/a.jpg
last:一旦当前规则匹配并重写后立即停止检查后续的其他rewrite,而通过重写后的规则重新发起请求;
break:一旦当前规则匹配并重写后立即停止检查后续的其他rewrite,而后继续由nginx进行后续的操作;
redirect:返回302临时重定向;
permanent:返回301永久重定向;
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break ;
Nginx 最多循环10次; 超出之后返回500错误。
rewrite ^/download/(.*\.(jpg|gif|jpeg|png)$) /images/$1 break;
凡是访问download下以(jpg|gif|jpeg|png)结尾的 都转到images下以(jpg|gif|jpeg|png)结尾的
注意:一般将rewrite卸载location中时都是用break标记,或者将rewrite卸载if上下文中;
rewrite_log on|off
是否把重写过程记录在错误日志中;默认级别为notice级别 默认off;
return code:
用于结束rewrite规则;并且为客户返回状态码;可以使用的状态码有:204,400,402-406,500-504等;
if (condition) {
}
7、压缩
压缩
nginx将响应报文发送至客户端之前可以启用压缩功能,这能够有效地节约带宽,并提高响应至客户端的速度。通常编译nginx默认会附带gzip压缩的功能,因此,可以直接启用之。
http {
gzip on;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/json;
gzip_disable msie6;
}
Php:
location / {
proxy_pass http://location
}
location ~ .php${
fastcgi_pass http://192.168.100.20
}
1. #配置发布目录为/data/www/wugk
2. root /data/www/wugk;
3.
4. location /
5. {
6. proxy_next_upstream http_502 http_504 error timeout invalid_header;
7. proxy_set_header Host $host;
8. proxy_set_header X-Real-IP $remote_addr;
9. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
10. proxy_pass http://tdt_wugk;
11. expires 3d;
12. }
13. #动态页面交给http://tdt_wugk,也即我们之前在nginx.conf定义的upstream tdt_wugk 均衡
14. location ~ .*\.(php|jsp|cgi)?$
15. {
16. proxy_set_header Host $host;
17. proxy_set_header X-Real-IP $remote_addr;
18. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
19. proxy_pass http://tdt_wugk;
20. }
21. #配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。
22. location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
23. {
24. root /data/www/wugk;
25. #expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
26. expires 3d;
27. }
生产配置:
#!/bin/bash
#user nobody nobody;
worker_processes 4;
worker_rlimit_nofile 51200;
error_log logs/error.log notice;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 51200;
}
http {
server_tokens off;
include mime.types;
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 20m;
client_body_buffer_size 256k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 128k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
default_type application/octet-stream;
charset utf-8;
client_body_temp_path /var/tmp/client_body_temp 1 2;
proxy_temp_path /var/tmp/proxy_temp 1 2;
fastcgi_temp_path /var/tmp/fastcgi_temp 1 2;
uwsgi_temp_path /var/tmp/uwsgi_temp 1 2;
scgi_temp_path /var/tmp/scgi_temp 1 2;
ignore_invalid_headers on;
server_names_hash_max_size 256;
server_names_hash_bucket_size 64;
client_header_buffer_size 8k;
large_client_header_buffers 4 32k;
connection_pool_size 256;
request_pool_size 64k;
output_buffers 2 128k;
postpone_output 1460;
client_header_timeout 1m;
client_body_timeout 3m;
send_timeout 3m;
log_format main ‘$server_addr $remote_addr [$time_local] $msec+$connection ‘
‘"$request" $status $connection $request_time $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;
open_log_file_cache max=1000 inactive=20s min_uses=1 valid=1m;
access_log logs/access.log main;
log_not_found on;
sendfile on;
tcp_nodelay on;
tcp_nopush off;
reset_timedout_connection on;
keepalive_timeout 10 5;
keepalive_requests 100;
gzip on;
gzip_http_version 1.1;
gzip_vary on;
gzip_proxied any;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_proxied expired no-cache no-store private auth no_last_modified no_etag;
gzip_types text/plain application/x-javascript text/css application/xml application/json;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
upstream tomcat8080 {
ip_hash;
server 172.16.100.103:8080 weight=1 max_fails=2;
server 172.16.100.104:8080 weight=1 max_fails=2;
server 172.16.100.105:8080 weight=1 max_fails=2;
}
server {
listen 80;
server_name www.magedu.com;
# config_apps_begin
root /data/webapps/htdocs;
access_log /var/logs/webapp.access.log main;
error_log /var/logs/webapp.error.log notice;
location / {
location ~* ^.*/favicon.ico$ {
root /data/webapps;
expires 180d;
break;
}
if ( !-f $request_filename ) {
proxy_pass http://tomcat8080;
break;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 8088;
server_name nginx_status;
location / {
access_log off;
deny all;
return 503;
}
location /status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow 172.16.100.71;
deny all;
}
}
}
本文出自 “火拳艾斯” 博客,请务必保留此出处http://xinzong.blog.51cto.com/10018904/1693409
标签:代理服务器 web服务器 虚拟主机 配置文件 nginx-proxy 反向代理
原文地址:http://xinzong.blog.51cto.com/10018904/1693409