我们编译安装nginx来定制自己的模块,机器CentOS 6.2 x86_64。首先安装缺少的依赖包:
- # yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel
这些软件包如果yum上没有的话可以下载源码来编译安装,只是要注意编译时默认安装的目录,确保下面在安装nginx时能够找到这些动态库文件(ldconfig)。
从http://nginx.org/en/download.html下载稳定版nginx-1.6.3.tar.gz到/usr/local/src下解压。
为了后续准备我们另外下载2个插件模块:nginx_upstream_check_module-0.3.0.tar.gz—— 检查后端服务器的状态,nginx-goodies-nginx-sticky-module-ng-bd312d586752.tar.gz(建议在/usr/local/src下解压后将目录重命名为nginx-sticky-module-ng-1.2.5) —— 后端做负载均衡解决session sticky问题(与upstream_check模块结合使用需要另外打补丁,请参考nginx负载均衡配置实战)。
请注意插件与nginx的版本兼容问题,一般插件越新越好,nginx不用追新,稳定第一。nginx-1.4.7,nginx-sticky-module-1.1,nginx_upstream_check_module-0.2.0,这个搭配也没问题。sticky-1.1与nginx-1.6版本由于更新没跟上编译出错。(可以直接使用Tengine,默认就包括了这些模块)
- [root@cachets nginx-1.6.3]# pwd
- /usr/local/src/nginx-1.6.3
- [root@cachets nginx-1.6.3]# ./configure --prefix=/usr/local/nginx-1.6 --with-pcre /
- > --with-http_stub_status_module --with-http_ssl_module /
- > --with-http_gzip_static_module --with-http_realip_module /
- > --add-module=../nginx_upstream_check_module-0.3.0
- [root@cachets nginx-1.6.3]# make && make install
nginx大部分常用模块,编译时./configure –help以–without开头的都默认安装。
再提供一种编译方案:
- ./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_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 /
- > --with-pcre=../pcre-7.8
- > --with-zlib=../zlib-1.2.3
- ## 检查配置文件是否正确
- # /usr/local/nginx-1.6/sbin/nginx -t
- # ./sbin/nginx -V # 可以看到编译选项
- ## 启动、关闭
- # ./sbin/nginx # 默认配置文件 conf/nginx.conf,-c 指定
- # ./sbin/nginx -s stop
- 或 pkill nginx
- ## 重启,不会改变启动时指定的配置文件
- # ./sbin/nginx -s reload
- 或 kill -HUP `cat /usr/local/nginx-1.6/logs/nginx.pid`
当然也可以将 nginx 作为系统服务管理,下载 nginx 到/etc/init.d/,修改里面的路径然后赋予可执行权限。
- # service nginx {start|stop|status|restart|reload|configtest}
yum安装rpm包会比编译安装简单很多,默认会安装许多模块,但缺点是如果你想以后安装第三方模块那就没办法了。
- # vi /etc/yum.repo.d/nginx.repo
- [nginx]
- name=nginx repo
- baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
- gpgcheck=0
- enabled=1
剩下的就yum install nginx搞定,也可以yum install nginx-1.6.3安装指定版本(前提是你去packages里看到有对应的版本,默认是最新版稳定版)。
Nginx配置文件主要分成四部分:main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理、负载均衡相关配置)和 location(URL匹配特定位置后的设置),每部分包含若干个指令。main部分设置的指令将影响其它所有部分的设置;server部分的指令主要用于指定虚拟主机域名、IP和端口;upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;location部分用于匹配网页位置(比如,根目录"/","/images",等等)。他们之间的关系式:server继承main,location继承server;upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。
当前nginx支持的几个指令上下文:
下面的nginx.conf简单的实现nginx在前端做反向代理服务器的例子,处理js、png等静态文件,jsp等动态请求转发到其它服务器tomcat:
- user www www;
- worker_processes 2;
- error_log logs/error.log;
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
- pid logs/nginx.pid;
- events {
- use epoll;
- worker_connections 2048;
- }
- 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压缩功能设置
- gzip on;
- gzip_min_length 1k;
- gzip_buffers 4 16k;
- gzip_http_version 1.0;
- gzip_comp_level 6;
- gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
- gzip_vary on;
-
- # http_proxy 设置
- client_max_body_size 10m;
- client_body_buffer_size 128k;
- proxy_connect_timeout 75;
- proxy_send_timeout 75;
- proxy_read_timeout 75;
- proxy_buffer_size 4k;
- proxy_buffers 4 32k;
- proxy_busy_buffers_size 64k;
- proxy_temp_file_write_size 64k;
- proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
- # 设定负载均衡后台服务器列表
- upstream backend {
- #ip_hash;
- server 192.168.10.100:8080 max_fails=2 fail_timeout=30s ;
- server 192.168.10.101:8080 max_fails=2 fail_timeout=30s ;
- }
- # 很重要的虚拟主机配置
- server {
- listen 80;
- server_name itoatest.example.com;
- root /apps/oaapp;
- charset utf-8;
- access_log logs/host.access.log main;
- #对 / 所有做负载均衡+反向代理
- location / {
- root /apps/oaapp;
- index index.jsp index.html index.htm;
- proxy_pass http://backend;
- proxy_redirect off;
- # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
-
- }
- #静态文件,nginx自己处理,不去backend请求tomcat
- location ~* /download/ {
- root /apps/oa/fs;
-
- }
- location ~ .*/.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
- {
- root /apps/oaapp;
- expires 7d;
- }
- location /nginx_status {
- stub_status on;
- access_log off;
- allow 192.168.10.0/24;
- deny all;
- }
- location ~ ^/(WEB-INF)/ {
- 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;
- }
- }
- ## 其它虚拟主机,server 指令开始
- }
nginx在运行时与具体业务功能(比如http服务或者email服务代理)无关的一些参数,比如工作进程数,运行的身份等。
与提供http服务相关的一些配置参数。例如:是否使用keepalive啊,是否使用gzip进行压缩等。
这个模块实现的是nginx作为反向代理服务器的功能,包括缓存功能(另见文章)
proxy_pass,proxy_redirect见 location 部分。
http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时,也可以建立若干server。每个server通过监听地址或端口来区分。
这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡,upstream后接负载均衡器的名字,后端realserver以 host:port options; 方式组织在 {} 中。如果后端被代理的只有一台,也可以直接写在 proxy_pass 。
http服务中,某些特定的URL对应的一系列配置项。
关于location匹配规则的写法,可以说尤为关键且基础的,参考文章nginx配置location总结及rewrite规则写法;
Nginx 的访问控制模块默认就会安装,而且写法也非常简单,可以分别有多个allow,deny,允许或禁止某个ip或ip段访问,依次满足任何一个规则就停止往下匹配。如:
- location /nginx-status {
- stub_status on;
- access_log off;
- # auth_basic "NginxStatus";
- # auth_basic_user_file /usr/local/nginx-1.6/htpasswd;
- allow 192.168.10.100;
- allow 172.29.73.0/24;
- deny all;
- }
我们也常用 httpd-devel 工具的 htpasswd 来为访问的路径设置登录密码:
- # htpasswd -c htpasswd admin
- New passwd:
- Re-type new password:
- Adding password for user admin
- # htpasswd htpasswd admin //修改admin密码
- # htpasswd htpasswd sean //多添加一个认证用户
这样就生成了默认使用CRYPT加密的密码文件。打开上面nginx-status的两行注释,重启nginx生效。
Nginx默认是不允许列出整个目录的。如需此功能,打开nginx.conf文件,在location,server 或 http段中加入autoindex on;,另外两个参数最好也加上去:
- location /images {
- root /var/www/nginx-default/images;
- autoindex on;
- autoindex_exact_size off;
- autoindex_localtime on;
- }