- 安装NGINX
- 编译前准备
- Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保nginx安装顺利完成
# yum -y install zlib-devel pcre-devel
- 创建运行用户、组:
Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性、降低安全风险。如:创建一个名为nginx的用户,不建立宿主目录,也禁止登录到shell环境。
# useradd -M -s /sbin/nologin nginx
- 编译安装nginx
- # tar -zxvf nginx-1.0.8.tar.gz
- #cd nginx-1.0.8/
- # ./configure --prefix=/usr/local/nginx --user=nginx--group=nginx --with-http_stub_status_module
注:配置前可以参考:./configure --help给出说明
--us--prefix:设定Nginx的安装目录
er和—group:指定Nginx运行用户和组
--with-http_stub_status_module:启用http_stub_status_module模块以支持状态统计
- # make && make install
- #vim nginx #编写nginx的启动脚本
#!/bin/bash
#chkconfig: 2345 67 23
#description:this script for nginx stop or start or restart or reload
CMDPATH="/usr/local/nginx/sbin/nginx"
PIDDIR="/usr/local/nginx/logs/nginx.pid"
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
Usage(){
echo "Usage: $0 start|stop|reload|restart"
exit
}
Start(){
if [ ! -e ${PIDDIR} ];then
${CMDPATH}
action "Nginx starting..." /bin/true
else
echo "Nginx is running..."
exit
fi
}
Stop(){
if [ -e ${PIDDIR} ];then
kill -s QUIT $(cat ${PIDDIR})
action "Nginx is stopping..." /bin/true
else
echo "Nginx stopped..."
exit
fi
}
Restart(){
Stop &>/dev/null
Start &>/dev/null
action "Nginx restarted..." /bin/true
}
Reload(){
kill -s HUP $(cat ${PIDDIR})
action "Nginx reload" /bin/true
}
if [ $# -ne 1 ];then
Usage
exit
fi
case "$1" in
start)
Start
;;
stop)
Stop
;;
restart)
Restart
;;
reload)
Reload
;;
*)
Usage
exit
esac
- # chmod +x nginx
# cp nginx /etc/init.d/nginx
# cd /etc/init.d/
# chkconfig --add nginx
- # service nginx start #启动nginx
- # ss -tunlp | grep 80
- # curl http://192.168.131.135
- 编译MySQL
- # tar xf mysql-5.1.55.tar.gz
- # cd mysql-5.1.55
- # yum -y install ncurses-devel
- # ./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=gbk,gb2312
注:--with-charset:指定默认使用的字符集编码;--with-collation:指定默认使用的字符集校对规则,utf8_general_ci是适用于UTF-8字符集的通用规则;--with-extra-charsets:指定额外支持的其他字符集编码。
- 优化调整
# cp support-files/my-medium.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/init.d/mysqld
# chmod +x /etc/init.d/mysqld
# chkconfig --add mysqld
# ln -s /usr/local/mysql/bin/* /usr/local/bin/
# ln -s /usr/local/mysql/lib/mysql/* /usr/lib/
# ln -s /usr/local/mysql/include/mysql/* /usr/include/
- 初始化数据库
# useradd -M -s /sbin/nologin mysql
# cd /usr/local/mysql/bin/
# ./mysql_install_db --user=mysql
# chown -R root:mysql /usr/local/mysql/
# chown -R mysql:mysql /usr/local/mysql/var/
# service mysqld start
# mysqladmin -uroot –p password '123456' #给root加密码
- 安装php
1、简介:较新版本(如5.3)的PHP已经自带FPM(fastCGI process manager,FastCGI进程管理器)模块,用来对PHP解析实例进行管理,优化解析效率,因此在配置PHP编译选项时应添加"--enable-fpm"以启用此模块。
为了提高PHP解析效率,建议将相应版本的ZendGuardLander也装上
- # yum -y install libxml2-devel libpng-devel libjpeg-devel
- # tar xf php-5.3.6.tar.gz
- # cd php-5.3.6
- # ./configure --prefix=/usr/local/php5 --with-gd --with-zlib --with-mysql=/usr/local/mysql/ --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm
注:在RHEL6的64系统中按上面的配置项配置可能会报以下错误,如果要是报错的话请按如下方法解决:
解决方法:
根据报错发现是因为libpng.so和libpng.a找不到,但libpng的相关软件包我已经安装了,如下图查询结果,发现libpng的包都安装了。
# rpm -qa | grep libpng
执行下列命令,可以查找libpng.so在哪里
# yum –y install mlocate
# updatedb
# locate libpng
# cp -rfp /usr/lib64/libpng.* /usr/lib/
# cp -frp /usr/lib64/libpng12.so* /usr/lib/
解决完后重新执行./configure进行编译前的配置
如果报configure: error: libjpeg.(a|so) not found错误解决方法和上面的解决方法类似。具体操作如下:
# rpm -qa | grep libjpeg #查询是否安装
# locate libjpeg.so
# cp -rfp /usr/lib64/libjpeg.so* /usr/lib/
- 重新进行configure
- #make && make install
- # cp php.ini-production /usr/local/php5/php.ini
- # ln -s /usr/local/php5/bin/* /usr/local/bin/
- # ln -s /usr/local/php5/sbin/* /usr/local/sbin/
- 安装ZendGuardLander
- #tar xf ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz
- #cd ZendGuardLoader-php-5.3-linux-glibc23-x86_64
- # cp php-5.3.x/ZendGuardLoader.so /usr/local/php5/lib/php/
- # vim /usr/local/php5/php.ini
zend_extension=/usr/local/php5/lib/php/ZendGuardLoader.so
- 配置Nginx支持PHP环境:
若要让Nginx能够解析PHP网页,有两种方法可以选择;其一,充当中介,将访问PHP页面的WEB请求转交给其他服务器(LAMP)去处理;其二,通过使用PHP的FPM模块来调用本机的PHP环境
如果选用FPM方式,则需要先启动php-fpm进程,以便监听PHP解析请求。参考范例建立php-fpm.conf配置文件,并修改其中的PID文件、运行用户、服务数(进程数量)等相关设置,然后启动php-fpm程序即可(默认监听本机的9000端口)
# cd /usr/local/php5/etc/
# cp php-fpm.conf.default php-fpm.conf
# vim php-fpm.conf
# /usr/local/sbin/php-fpm #启动php-fpm
# netstat -tunlp | grep php-fpm
在php-fpm.conf文件中,pid配置行指出了PID信息的存放位置,对应的实际路径为/usr/local/php5/var/run/php-fpm.pid,根据上述信息,可以修改Nginx服务脚本,以便在启动/停止Nginx服务器时将php-fpm进程也自动启动/停止。
# vim /etc/init.d/nginx
#!/bin/bash
#!/bin/bash
#chkconfig: 2345 67 23
#description:this script for nginx stop or start or restart or reload
CMDPATH="/usr/local/nginx/sbin/nginx"
PIDDIR="/usr/local/nginx/logs/nginx.pid"
FPMPATH="/usr/local/php5/sbin/php-fpm"
FPMPID="/usr/local/php5/var/run/php-fpm.pid"
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
Usage(){
echo "Usage: $0 start|stop|reload|restart|configtest"
exit
}
Start(){
if [ ! -e ${PIDDIR} ];then
${CMDPATH}
${FPMPATH}
action "Nginx starting..." /bin/true
else
echo "Nginx is running..."
exit
fi
}
Stop(){
if [ -e ${PIDDIR} ];then
kill -s QUIT $(cat ${PIDDIR})
kill -s QUIT $(cat ${FPMPID})
action "Nginx is stopping..." /bin/true
else
echo "Nginx stopped..."
exit
fi
}
Restart(){
Stop &>/dev/null
Start &>/dev/null
action "Nginx restarted..." /bin/true
}
Reload(){
kill -s HUP $(cat ${PIDDIR})
kill -s HUP $(cat ${FPMPID})
action "Nginx reload" /bin/true
}
Configtest(){
${CMDPATH} -t
}
if [ $# -ne 1 ];then
Usage
exit
fi
case "$1" in
start)
Start
;;
stop)
Stop
;;
restart)
Restart
;;
reload)
Reload
;;
configtest)
Configtest
;;
*)
Usage
exit
esac
这样一来,一旦启动或关闭nginx服务,php-fpm程序也会随之启动或关闭,不需要额外再启动或关闭php-fpm
- 配置Nginx支持PHP解析:
①无论是将PHP页面交给LAMP服务器去解析,还是调用本机的php-fpm进程进行解析,都需要在"server{}"配置段中添加location设置,以便指定当访问.php面页时采取何种操作。
# vim /usr/local/nginx/conf/nginx.conf
location ~ .php$ { #访问php的页面段
root html; #php网页文档根目录
fastcgi_pass 127.0.0.1:9000; #php-fpm的监听地址
fastcgi_index index.php; #php的首页文件
include /usr/local/nginx/conf/fastcgi.conf;
#包括fastcgi.conf样本配置
}
- php页面访问测试
# vim /usr/local/nginx/html/index.php
<?php
phpinfo();
?>
# service nginx restart #记得重启nginx,使修改配置文件生效
- 访问mysql数据库测试
# vim mysqlconn.php
<?php
$link=mysql_connect('localhost','root','123456');
if ($link) echo "connect to mysql success";
mysql_close();
?>
# curl http://192.168.131.135/mysqlconn.php
- 在LNMP平台搭建web应用
# vim /usr/local/nginx/conf/nginx.conf
这样不用每次访问都输入全路径
# mysql -uroot -p123456
mysql> create database movie;
mysql> grant all on movie.* to wdd@'localhost' identified by '123456';
# tar xf SKYUC_3.2.2_Free_For_PHP5.3.tar.bz2
# cd SKYUC_3.2.2_Free_For_PHP5.3
# cp -r wwwroot/ /usr/local/nginx/html/movie
#cd /usr/local/nginx/html/movie
# chown -R nginx:nginx admincp/ data/ templates/ upload/
在浏览器输入http://192.168.131.135/movie/install/index.php进入安装界面,点击"",在点击进入下一个页面,如下图所示
1、Nginx内置了HTTP_STUB_STATUS状态统计模块,用来反馈当前的WEB访问情况。配置
location /statictical { #匹配任何包含/statictical的任何查询
auth_basic "nginx status" ; #登录提示
- # yum -y install httpd
- # chkconfig httpd off
- # mkdir /usr/local/nginx/statictical
- #service nginx restart #重启服务
输入用户名和密码,进入页面
Active connections: 1
server accepts handled requests
7 7 12
Reading: 0 Writing: 1 Waiting: 0
其中"Active connections"表示当前的活动连接数;而"server accepts handled,requests"表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数.
2、客户端访问控制
# vim /usr/local/nginx/conf/nginx.conf
在客户机192.168.216.233上输入http://192.168.131.135/statictical/,发现无法访问了
注:allow 允许规则,deny拒绝规则;规则的执行是按从上向下执行,匹配某条规则后将不再检查其他规则。
- # curl www.taobao.com
- # curl www.sina.com
- 案例3、nginx+openssl实现https传输加密
1、查看是否已经安装 ssl,没有的话,重新编译安装
# /usr/local/nginx/sbin/nginx –V
# yum -y install pcre-devel zlib-devel openssl-devel
# tar xf nginx-1.7.7.tar.gz
# cd nginx-1.7.7
# useradd -M -s /sbin/nologin nginx
# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6
# make
# make install
# /usr/local/nginx/sbin/nginx
]# netstat -tunlp | grep 80
2、生成 key
# cd /usr/local/nginx/conf/
# openssl genrsa -des3 -out server.key 1024 #输入密码即可
genrsa 生成rsa类型的秘钥
-des3 指定算法
-out 输出秘钥
1024 指定输出文件的大小
3、生成证书
# openssl req -new -key server.key -out server.csr
req -new产生一个新的证书 -key 之前生成的秘钥 –out输入的证书
填写好相关信息
# cp server.key server.key.bak #将秘钥备份一下,防止丢失
# openssl rsa -in server.key.bak -out server.key #重新输出一下新密钥
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt #生成自签证书
# vim /usr/local/nginx/conf/nginx.conf
server {
listen 443; https的监听端口为443
server_name localhost;
ssl on;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server.key;
# killall -9 nginx
# /usr/local/nginx/sbin/nginx
在浏览器输入https://192.168.131.130/,弹出如下对话框:
点击"我已充分了解可能的风险"->"添加例外—获取证书—确认安全例外"即可以访问页面
小结:当配置文件修改这个值worker_connections 1024超过1024时,实际上如果系统没有用#ulimit 50000进行设置的话是不生效的,两边都得改,要想开机每次生效,可以将其写入/etc/rc.d/rc.local
Nginx的location
基本语法:
location [=|~|~*|^~] /uri/ { … }
= 表示做精确匹配
~ :为区分大小写匹配
~*: 为不区分大小写匹配
!~ :和 !~* 分别为区分大小写不匹配及不区分大小写不匹配
正则表达式匹配,其中:
文件及目录匹配,其中:
-f 和 !-f 用来判断是否存在文件
-d 和 !-d 用来判断是否存在目录
-e 和 !-e 用来判断是否存在文件或目录
-x 和 !-x 用来判断文件是否可执行
示例1:
location = / {
# 只匹配 / 查询。
}
location / {
#匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先查询匹配
}
示例2:
location ^~ /images/ {
# 匹配任何以 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
}
示例3:
location ~* .(gif|jpg|jpeg)$ {
# 匹配任何以 gif、jpg 或 jpeg 结尾的请求。
}
配置文件讲解:
在Nginx服务器的主配置文件nginx.conf中,包括全局配置、I/O事件配置、HTTP配置这三大块内容,配置语句的格式为"关键字值;"(末尾以分号表示结束),以"#"开始的部分表示注释。
1)全局配置
由各种配置语句组成,不使用特定的界定标记。全局配置部分包括运行用户、工作进程数、错误日志、PID存放位置等基本设置。
常用配置项:
#user nobody;
//运行用户,Nginx的运行用户实际是编译时指定的nginx,若编译时未指定则默认为nobody
worker_processes 2;
//指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般为它的倍数
worker_cpu_affinity 00000001 00000010;
//为每个进程分配cpu,上例中将2个进程分配到两个cpu,当然可以写多个,或者将一个
进程分配到多个cpu
worker_rlimit_nofile 102400;
//这个指令是指当一个nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit
-n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值
保持一致。(通过"ulimit –n 数值"可以修改打开的最多文件数目)
error_log logs/error.log; //全局错误日志文件的位置
pid logs/nginx.pid; //PID文件的位置
2) I/O事件配置:
使用"events {}"界定标记,用来指定Nginx进程的I/O响应模型,每个进程的连接数等设置
events {
use epool; //使用epool模型,对于2.6以上的内核,建议使用epool模型以提高性能
worker_connections 4096; //每个进程允许的最多连接数(默认为1024),每个进程的连接数应根据实际需要来定,一般在10000以下,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。
}
3)HTTP配置
使用"http{}"界定标记,包括访问日志、HTTP端口、网页目录、默认字符集、连接保持、以
及虚拟主机、PHP解析等一系列设置。其中大部分配置语句包含在子界定标记"servier {}"内。
http {
#设定mime类型,即conf/目录下的mime.types文件中的设定。
include mime.types;
default_type application/octet-stream;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local]'
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
#设定access log
access_log logs/access.log main;
sendfile on; //支持文件发送(下载)
keepalive_timeout 65; //连接保持超时
#设定虚拟主机
server { //用来配置虚拟主机
listen 80; //WEB服务的监听设置,可以采用"IP地址:端口"形式
server_name www.lnmp.com;//网站名称可以写多个名称,用空格分隔
location / { //表示如何匹配后面的路径的
index index.html; //默认首页
root html; //网页根目录位置,默认为Nginx安装目录下的html/子目录,root语句用来设置特定访问位置的网页文档路径,根据需要可改为/var/www/html等其他路径。
}
charset gb2312; //网页的默认字符集
#设定本虚拟主机的访问日志
access_log logs/www.lnmp.com.access.log main;
error_page 500 502 503 504 /50x.html; //内部错误的反馈页面
location = /50x.html {
root html;
}
}
}