菜鸟学Linux 第096篇笔记 nginx
内容总览
ngix
进程模型
I/O models
nginx配置含义
安装配置nginx
配置nginx基于ssl通信
作业 (未做)
ngix
web服务器
反向代理:reverse proxy
http, mail
支持AIO, mmap, event-driven
模块化
热部署
进程模型
单进程:请求变多时会排队响应用户请求
多进程:每个进程响应一个请求,当请求变多时,进程量也会相应增加,进程切换次数太多
每个进程的地址空间是独立的,很多空间是重复的数据,所以内存使用效率较低
线程:thread
light weight process, LWP
linux支持多少种类型的线程库?如何切换线程库?
每个线程响应一个请求:
线程依然需要切换,相比进程线程切换属于轻量组
同一个进程的线程可以共享进程的诸多资源,比如打开的文件等;
对内存的需求较之进程略有下降
快速线程切换时会带来线程抖动
多进程多线程:相对上述响应请求相对较多,每个进程里的每个线程响应一个请求
多线程:N个请求 一个线程响应多个请求
IO复用,多路IO
I/O models
blocking I/O
nonblocking I/O
I/O multiplexing I/O复用
signal driven I/O 信号驱动I/O
asynchronous I/O 异步I/O
httpd
MPM
prefork: 一个进程响应一个请求 1024
worker: 一个线程响应一个请求,多进程,
一个进程生成多个线程(没有提升单线程并发连接数)
event: 基于事件驱动比前两者性能好
nginx的功能单一,许多httpd所支持的特性,nginx不支持,但并发连接数httpd无法相比
智能DNS
缓冲服务器(地域划分)
只有管理员才有权限启动小于1024的端口
nginx配置含义
server{} 虚拟主机
location{}
location URI {} 对当前路径及子路径下的所有对象都生效;
location = URI {} 精确匹配指定的路径,不包括子路径,因此,只对当前资源生效
location ~ URI {}
location ~* URI {} 此两项表示模式匹配,可使用正则表达式,一个区分大小写另一不区分
location ^~ URI {} 不使用正则表达式
index 默认打开页面文件
root 访问目录
allow 允许哪些客户端访问
deny 拒绝哪些客户端访问
auth_basic "User Area"
auth_basic_user_file /etc/nginx/.users 此两项定义此location需要使用用户登录访问
此文件的生成是使用htpasswd 命令生成(如提示没有此命令需要安装httpd程序)
查看nginx状态的location,访问时只需要在域名后加/status即可,我这里设置了认证
location /status {
stub_status on;
auth_basic "User Area";
auth_basic_user_file /etc/nginx/.users;
}
查看nginx状态显示含义
Active connections 当前处于活动连接的个数
server accepts handled requests 已经处理过了的请求个数
已经接受的连接个数 正在处理的连接的个数 已经处理的请求个数
Reading: 正在读首部的请求个数
Writing: 读请求的主体,处理请求或者正在响应给客户端的请求
Waiting: 是上两个之和(保持的长连接)
安装配置nginx
1. 创建用户nginx
2. 官方网站下载nginx
3. 编译安装nginx
# tar -xf nginx-1.4.7.tar.gz
# cd nginx-1.4.7
#./configure \
--prefix=/usr \
--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 \
--with-file-aio
4. 为nginx添加服务脚本(非本人所写,现在只会看呵呵)
#!/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 --list nginx
配置nginx基于ssl通信
1. 创建CA,并为自己签名
# cd /etc/pki/CA
# (umask 077; openssl genrsa 2048 > private/cakey.pem) 创建CA私钥
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem 为CA证书签名
CN HB ZJK mysky Tech ca.mysky.com caadmin@mysky.com
# touch serial
# echo 01 > serial
# touch index.txt
2. 为程序做私钥 和请求
# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl
# (umask 077;openssl genrsa 1027 > nginx.key) 为程序生成私钥
# openssl req -new -key nginx.key -out nginx.csr 生成证书请求
CN HB ZJK mysky Tech www.mysky.com
# openssl ca -in nginx.csr -out nginx.crt -days 365 使用CA为此证书请求签名
3. 配置nginx使其使用ssl通信
# vim /etc/nginx/nginx.conf
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /web/html;
index index.html index.htm;
}
}
4. 此时便可进行加密通信
https://192.168.11.141 (这个看每个人的建立的IP了,具体输入的IP要按实际的为准)
或在服务器查看是否启用443端口
# netstat -tnlp
作业
实现nginx + php + mysql + xcache 使其可运行动态网站
实现keepalived + nginx 和 corosync + nginx