
本文首发 http://zhaoda.net/2018/05/23/discuz-attachment-oss/转载请注明出处 Discuz 论坛的附件、头像等资源不断增长,如果和主程序一起存储在云服务器上,就会导致云盘要定期进行扩容操作;附件如果需要进行 CDN 加速也只能使用回源策略进行 CDN 配置。为了一劳永逸的解决附件存储和加速问题,将附件等资源迁移到对象存储服务上是一个好的选择,本文以阿里云 ECS、OSS 服务为背景,其他云计算平台也可以参考。 创建 OSS Bucket 在 OSS 管理页面分别给论坛附件、头像创建 Bucket,名称为 img-bucket 和 avatar-bucket(如果自定为其他名字,后文提到的 Bucket 名称请自行替换),区域选择和论坛所在云服务器 ESC 一致的区域,记录下该区域的 Endpoint,存储类型选择标准存储,读取权限选择私有 到 访问控制 创建网站用户,生成 AccessKey和AccessKeySecret,给该用户授权 AliyunOSSFullAccess 开启 CDN 到刚创建好的 Bucket 的域名管理中绑定用户域名,比如img.example.com和avatar.example.com 勾选阿里云 CDN 加速,如果域名 dns 解析在阿里云,可以勾选自动添加 CNAME 记录,如果不在请自行添加域名的cname为阿里云 CDN 加速域名 勾选CDN 缓存自动刷新 建议单独为 CDN 申请单独的根域名,这样 CDN 请求不会带上网站的 cookie 等信息 到 CDN 域名管理中对新创建的域名进行配置 开启私有Bucket回源 缓存过期时间添加规则,内容目录/过期时间为3年,权重99 设置HTTP头添加规则,Cache-Control 设置为 max-age=315360000 开启智能压缩 其他设置请根据实际需求自行修改 迁移附件和头像 安装 ossfs,该工具能让您在 Linux 系统中把 OSS Bucket 挂载到本地文件系统中 ossfs 基于s3fs 构建,具有s3fs 的全部功能。主要功能包括 支持POSIX 文件系统的大部分功能,包括文件读写,目录,链接操作,权限,uid/gid,以及扩展属性(extended attributes) 通过OSS 的multipart 功能上传大文件 MD5 校验保证数据完整性 # 下载并安装 wget http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/32196/cn_zh/1524809958556/ossfs_1.80.4_centos7.0_x86_64.rpm?spm=a2c4g.11186623.2.6.XJB3Dd&file=ossfs_1.80.4_centos7.0_x86_64.rpm mv ossfs_1.80.4_centos7.0_x86_64.rpm?spm=a2c4g.11186623.2.6.QwMtDE ossfs_1.80.4_centos7.0_x86_64.rpm yum localinstall ossfs_1.80.4_centos7.0_x86_64.rpm 将每个 bucket name、AccessKey和AccessKeySecret用:连接后填写到 /etc/passwd-ossfs,每行一个,并设置文件权限为 640 img-bucket:AccessKey:AccessKeySecret my-bucket:AccessKey:AccessKeySecret chmod 640 /etc/passwd-ossfs 安装 mailcap,解决 bucket 中的文件 Content-Type 全是 application/octet-stream 的问题 yum install mailcap 将论坛附件和头像剪切到其他临时目录 # 假设论坛根目录为 /data/htdocs/www ,后续脚本将以此为准,请根据实际情况修改 mv /data/htdocs/www/data/attachment /data/ mv /data/htdocs/www/uc_server/data/avatar /data/ 挂载 OSS Bucket # 重新创建被剪的目录 mkdir /data/htdocs/www/data/attachment mkdir /data/htdocs/www/uc_server/data/avatar # 获取运行 php-fpm 和 nginx 的系统用户 uid 和 gid,比如 www 用户 # uid=1000(www) gid=1000(www) 组=1000(www) id www # 挂载 bucket # Endpoint:请使用内网地址,速度快且流量免费 # -o noxattr:如果你没有使用eCryptFs等需要XATTR的文件系统,可以提升性能 # -o kernel_cache:使用文件系统的 page cache # -o allow_other:允许其他用户访问挂载文件夹 # -ouid -ogid:制定挂载目录的用户和组权限 ossfs img-bucket /data/htdocs/www/data/attachment -ourl=Endpoint -o noxattr -o kernel_cache -o allow_other -ouid=1000 -ogid=1000 ossfs avatar-bucket /data/htdocs/www/uc_server/data/avatar -ourl=Endpoint -o noxattr -o kernel_cache -o allow_other -ouid=1000 -ogid=1000 复制附件、头像到 bucket cp -rf /data/attachment/* /data/htdocs/www/data/attachment cp -rf /data/avatar/* /data/htdocs/www/uc_server/data/avatar # 到 oss bucket 文件管理验证数据没有问题后可以删除临时拷贝 rm -rf /data/attachment/ rm -rf /data/avatar/ 如何卸载 bucket # root用户 umount /data/htdocs/www/data/attachment umount /data/htdocs/www/uc_server/data/avatar # 非root用户 fusermount -u /data/htdocs/www/data/attachment fusermount -u /data/htdocs/www/uc_server/data/avatar 开机启动,以 CentOS 7.0 为例,其他系统参考 FAQ # 根据下面的模板创建启动脚本 vi /etc/init.d/ossfs # 添加执行权限 chmod a+x /etc/init.d/ossfs # 设置开机启动 chkconfig ossfs on #! /bin/bash # # ossfs Automount Aliyun OSS Bucket in the specified direcotry. # # chkconfig: 2345 90 10 # description: Activates/Deactivates ossfs configured to start at boot time. ossfs img-bucket /data/htdocs/www/data/attachment -ourl=Endpoint -o noxattr -o kernel_cache -o allow_other -ouid=1000 -ogid=1000 ossfs avatar-bucket /data/htdocs/www/uc_server/data/avatar -ourl=Endpoint -o noxattr -o kernel_cache -o allow_other -ouid=1000 -ogid=1000 修改论坛附件和头像地址 到论坛后台 -> 全局 -> 上传设置 -> 基本设置 中修改 本地附件 URL 地址 到论坛后台 -> 站长 -> UCenter 设置 中修改头像调用方式为使用静态地址调用头像 由于有用户没有上传头像而使用默认头像,到 avatar bucket 的根目录添加3个默认头像文件 noavatar_big.gif、noavatar_middle.gif 和 noavatar_small.gif 修改source/function/function_core.php中头像地址 // 查找下面的代码并修改 // $file = $ucenterurl.'/data/avatar/'.$dir1.'/'.$dir2.'/'.$dir3.'/'.substr($uid, -2).($real ? '_real' : '').'_avatar_'.$size.'.jpg'; // return $returnsrc ? $file : '<img src="'.$file.'" onerror="this.onerror=null;this.src=\''.$ucenterurl.'/images/noavatar_'.$size.'.gif\'" />'; // 使用头像cdn地址 $cdnurl = 'http://avatar.example.com/'; $file = $cdnurl.$dir1.'/'.$dir2.'/'.$dir3.'/'.substr($uid, -2).($real ? '_real' : '').'_avatar_'.$size.'.jpg'; return $returnsrc ? $file : '<img src="'.$file.'" onerror="this.onerror=null;this.src=\''.$cdnurl.'noavatar_'.$size.'.gif\'" />'; 修改uc_server/avatar.php中头像重定向地址 $avatar = './data/avatar/'.get_avatar($uid, $size, $type); if(file_exists(dirname(__FILE__).'/'.$avatar)) { if($check) { echo 1; exit; } $random = !empty($random) ? rand(1000, 9999) : ''; // rewrite avatar url $avatar = 'http://avatar.example.com/'.substr($avatar, 14); $avatar_url = empty($random) ? $avatar : $avatar.'?random='.$random; } else { if($check) { echo 0; exit; } $size = in_array($size, array('big', 'middle', 'small')) ? $size : 'middle'; // $avatar_url = 'images/noavatar_'.$size.'.gif'; // rewrite avatar url $avatar_url = 'http://avatar.example.com/noavatar_'.$size.'.gif'; } if(empty($random)) { header("HTTP/1.1 301 Moved Permanently"); header("Last-Modified:".date('r')); header("Expires: ".date('r', time() + 86400)); } // header('Location: '.UC_API.'/'.$avatar_url); header('Location: '.$avatar_url); 论坛 JS、CSS、样式图片等资源接入 CDN 到 CDN 域名管理中添加域名 static.example.com 回源设置中源站信息类型选择IP,并填写源站地址IP为论坛外网 ip,端口 80 其他缓存和 HTTP 头设置参考上面 OSS Bucket 的 CDN 设置 添加论坛 Nginx 的 vhost 配置,如果是其他 web server 请参考添加 server { listen 80; server_name static.example.com; index index.html index.htm; root /data/htdocs/www; # error_page 404 = /topic-1.html; expires max; location ~ /\.git { return 404; } location ~ ^/.*\.(php|php5)$ { deny all; } access_log off; } 到论坛后台 -> 全局 -> 性能优化 -> 服务器优化 中修改 JS 文件 URL 和 CSS 文件 URL 为 自定义 URL 并填写 CDN 地址 http://static.example.com/data/cache/ 小云 APP 缩略图接入 CDN 如果论坛使用小云 APP 开发了客户端程序,且开启了生成缩略图功能,同样可以参照上面附件、头像的方式接入 OSS 和 CDN 创建 thumb bucket 并开启 CDN 加速域名 thumb.example.com 用 ossfs 将 /data/htdocs/www/data/appbyme/thumb 目录挂载到 thumb bucket,并将已有缩略图拷贝进去 复制一份 /data/htdocs/www/mobcent/app/config/mobcent.php 为 /data/htdocs/www/mobcent/app/config/my_mobcent.php 修改 my_mobcent.php 中 cdndomain 的值为 thumb.example.com 修改 /data/htdocs/www/mobcent/app/components/web/ImageUtils.php 中缩略图地址 private static function _getThumbUrlFile($image, $thumb) { //支持自定义CDN域名 $cacheurl = Yii::app()->params['mobcent']['cache']['cdndomain']; if(empty($cacheurl)){ $cacheurl = Yii::app()->getController()->dzRootUrl; } // return sprintf('%s/%s/%s/%s_%s', // $cacheurl, // MOBCENT_THUMB_URL_PATH, // self::_getThumbTempPath($image), // (isset($_GET['sdkVersion']) && $_GET['sdkVersion'] > '1.0.0') ? 'xgsize' : 'mobcentSmallPreview', // $thumb // ); // 修改缩略图地址 return sprintf('%s/%s/%s_%s', $cacheurl, self::_getThumbTempPath($image), (isset($_GET['sdkVersion']) && $_GET['sdkVersion'] > '1.0.0') ? 'xgsize' : 'mobcentSmallPreview', $thumb ); } 后记 至此,Discuz 论坛全站资源、附件、头像都接入了 OSS 和 CDN,将降低论坛主服务器 http 请求量压力并提高页面打开速度 除了本文使用的 ossfs 方案将附件接入 OSS,还有一些其他方案将附件接入 OSS 或 CDN;比如最简单的 CDN 回源方式将附件接入 CDN;还可以通过 [ossftp](https://help.aliyun.com/document_detail/32190.html?spm=a2c4g.11186623.6.1061.3oclSk) 工具绑定 OSS,然后开启论坛远程附件方式来将附件接入 OSS 和 CDN;但是这些方案都没有本文的方案更具有通用性和易用性 参考 ossfs 安装和使用 ossfs 中文文档 ossfs 常见问题 Discuz如何存储远程附件到OSS discuz附件图片迁移阿里云OSS ossftp 安装和使用
本文首发 http://zhaoda.net/2018/05/22/centos-php-nginx/转载请注明出处 创建用户、组和目录 # web 用户和组 groupadd www useradd -g www www -s /sbin/nologin # 网站目录 mkdir -p /data/htdocs # 日志目录 mkdir -p /data/logs # 创建软件包下载和编译目录,后续软件都下载到这里 mkdir -p /data/software # 创建软件安装目录,PHP、Nginx 将安装到这里 mkdir -p /usr/local/webserver # 可写目录进行如下设置 # chown -R www:www /path 服务器基础环境和依赖安装 # 如果系统自带 Apache、PHP、MySQL,先卸载 yum remove httpd yum remove php yum remove mysql # 升级所有软件包 yum update -y # 安装可能用到的软件包,大部分其实已经内置在系统中 # gcc:GNU 编译器套装 # gcc-c++:GCC 的 C++ 支持 # autoconf:在sh下制作供编译、安装和打包软件的配置脚本的工具 # libjpeg-turbo-static:处理 JPEG 图像数据格式的自由库 # libpng:处理 PNG 图像数据格式的自由库 # freetype: 字体光栅化库 # libxml2: 解析XML文档的函数库 # zlib: 提供数据压缩之用的库 # glibc:C函数库 # glib2:跨平台的、用C语言编写的五个底层库的集合 # bzip2:比传统的 gzip 或者 ZIP 的压缩效率更高的库 # ncurses:虚拟终端中的“类GUI”应用软件工具箱 # curl:利用URL语法在命令行下工作的文件传输工具 # e2fsprogs:用以维护ext2,ext3和ext4文件系统的工具程序集 # krb5-libs:网络身份验证系统 # libidn:通过IETF国际域名(IDN)实施字符串预处理、Punycode 和 IDNA规格定义的工具 # openssl:安全通信软件包 # openldap:轻型目录访问协议 # nss-pam-ldapd:使用目录服务器的 nsswitch 模块 # openldap-clients:LDAP 客户端实用工具 # openldap-servers:LDAP 服务 # bison:自动生成语法分析器程序 # lrzsz:远程上传和下载文件 # libmcrypt:mcrypt 算法库 # mhash:mhash 算法库 # ImageMagick:用于查看、编辑位图文件以及进行图像格式转换的开放源代码软件套装 # libmemcached: memcache 客户端 yum -y install gcc gcc-c++ autoconf libjpeg-turbo-static libjpeg-turbo-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel pcre pcre-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-libs krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss-pam-ldapd openldap-clients openldap-servers bison lrzsz libmcrypt libmcrypt-devel mcrypt mhash ImageMagick ImageMagick-devel libmemcached libmemcached-devel 安装其他 PHP 依赖库 # libiconv:提供了一个iconv()的函数,以实现一个字符编码到另一个字符编码的转换 wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz tar zxvf libiconv-1.15.tar.gz cd libiconv-1.15 ./configure --prefix=/usr/local make make install # 在 /etc/ld.so.conf 加一行 /usr/local/lib,再执行如下 /sbin/ldconfig 安装 PHP # 下载并解压 wget http://cn2.php.net/get/php-5.6.36.tar.gz/from/this/mirror -O php-5.6.36.tar.gz tar zxvf php-5.6.36.tar.gz cd php-5.6.36 # 编译安装 # 内存如果小于1G,增加 --disable-fileinfo ./configure --prefix=/usr/local/webserver/php --with-config-file-path=/usr/local/webserver/php/etc --with-mysql --with-mysqli --with-curl --with-mcrypt --with-gd --with-openssl --with-mhash --with-xmlrpc --with-gettext --with-bz2 --with-zlib --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-libxml-dir --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-mbstring --enable-gd-native-ttf --enable-pcntl --enable-sockets --enable-zip --enable-soap --enable-ftp --enable-exif --enable-opcache --enable-fpm --with-fpm-user=www --with-fpm-group=www --without-pear # 如果遇到 undefined reference to `libiconv_open' 错误 # make 后面增加 ZEND_EXTRA_LIBS='-liconv' make ZEND_EXTRA_LIBS='-liconv' make install # 创建配置文件 cp php.ini-production /usr/local/webserver/php/etc/php.ini # 复制启动脚本到 init.d 目录并修改权限 cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm chmod 700 /etc/init.d/php-fpm # 设置开机启动 chkconfig php-fpm on # 查看开机启动服务 chkconfig --list # 启动服务 service php-fpm start # 停止服务 service php-fpm stop # 重启服务 service php-fpm reload # 创建软连接,方便全局执行 php-fpm start | stop | reload ln -s /usr/local/webserver/php/bin/php /usr/bin/php ln -s /etc/init.d/php-fpm /usr/bin/php-fpm 安装 PHP 扩展 # memcache 扩展 # memcached 支持 Binary Protocol,而 memcache 不支持,意味着 memcached 会有更高的性能 # https://pecl.php.net/package/memcached # 3.x.x 支持 php 7,2.x.x 支持 php 5.2-5.6 wget https://pecl.php.net/get/memcached-2.2.0.tgz tar zxvf memcached-2.2.0.tgz cd memcached-2.2.0 /usr/local/webserver/php/bin/phpize ./configure --with-php-config=/usr/local/webserver/php/bin/php-config make make install # 如果需要再本地缓存业务侧数据,安装 apcu # apc 包含 opcode 缓存和 KV 数据缓存 # PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展,所以不需要安装 apc # apcu 只包含 KV 数据缓存 # https://pecl.php.net/package/APCu wget https://pecl.php.net/get/apcu-4.0.11.tgz tar zxvf apcu-4.0.11.tgz cd apcu-4.0.11 /usr/local/webserver/php/bin/phpize ./configure --with-php-config=/usr/local/webserver/php/bin/php-config make make install # 图片处理 ImageMagick 扩展 # https://pecl.php.net/package/imagick wget https://pecl.php.net/get/imagick-3.4.3.tgz tar zxvf imagick-3.4.3.tgz cd imagick-3.4.3 /usr/local/webserver/php/bin/phpize ./configure --with-php-config=/usr/local/webserver/php/bin/php-config make make install 修改 php.ini 配置文件 ; vi /usr/local/webserver/php/etc/php.init ; 该选项设置为 On 时,将在所有的脚本中使用输出控制 output_buffering = On ; 将 PHP 所能打开的文件限制在指定的目录树 open_basedir = /data/htdocs/:/tmp/ ; 禁用函数 disable_functions = system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open,proc_get_status,dl,chroot,show_source,syslog,readlink,symlink,popepassthru,stream_socket_server ; 禁止暴露 PHP 被安装在服务器上 expose_php = Off ; 禁止错误信息输出 display_errors = Off ; 错误信息记录到服务器错误日志 log_errors = On ; 设置脚本错误将被记录到的文件 ; 该文件必须是web服务器用户可写的 ; mkdir /data/logs ; touch /data/logs/php_error.log ; chown www:www /data/logs/php_error.log error_log = /data/logs/php_error.log ; 传递给存储处理器的参数 session.save_path = "/tmp" ; 防止 Nginx 文件类型错误解析漏洞 cgi.fix_pathinfo = 0 ; 文件上传临时目录 upload_tmp_dir = /tmp ; 时区 date.timezone = "Asia/Shanghai" ; 允许使用 PHP 代码开始标志的缩写形式 short_open_tag = On ; php 扩展目录 ; php 5.2 ; extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/" ; php 5.4 ; extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20100525/" ; php 5.5 ; extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20121212/" extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20131226/" ; 文件结尾添加扩展配置,按需添加 [apcu] extension = "apcu.so" apc.enabled = on apc.shm_size = 256M apc.enable_cli = on [memcached] extension = "memcached.so" [imagick] extension = "imagick.so" [opcache] zend_extension="opcache.so" opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 opcache.enable_cli=1 修改 php-fpm.conf 配置文件 ; cp /usr/local/webserver/php/etc/php-fpm.conf.default /usr/local/webserver/php/etc/php-fpm.conf ; vi /usr/local/webserver/php/etc/php-fpm.conf ; 查找并修改如下配置,其他保持默认 ; 错误日志的位置 error_log = /data/logs/php-fpm.log ; 错误级别 log_level = error ; 如果子进程在设定的时间内收到该参数设定次数的 SIGSEGV 或者 SIGBUS退出信息号,则FPM会重新启动 emergency_restart_threshold = 10 ; 用于设定平滑重启的间隔时间 emergency_restart_interval = 1m ; 设置子进程接受主进程复用信号的超时时间 process_control_timeout = 5s ; 设置 FPM 在后台运行 daemonize = yes ; 设置允许连接到 FastCGI 的服务器 IPV4 地址 listen.allowed_clients = 127.0.0.1 ; 子进程的数量是固定的 pm = static ; pm 设置为 static 时表示创建的子进程的数量 pm.max_children = 64 ; 设置启动时创建的子进程数目。仅在 pm 设置为 dynamic 时使用 pm.start_servers = 10 ; 设置空闲服务进程的最低数目。仅在 pm 设置为 dynamic 时使用 pm.min_spare_servers = 10 ; 设置空闲服务进程的最大数目。仅在 pm 设置为 dynamic 时使用 pm.max_spare_servers = 30 ; 设置每个子进程重生之前服务的请求数 pm.max_requests = 500 ; FPM 状态页面的网址 pm.status_path = /phpfpm_status ; 设置单个请求的超时中止时间 request_terminate_timeout = 30 ; 设置文件打开描述符的 rlimit 限制 rlimit_files = 65535 ; 禁止输出错误信息 php_flag[display_errors] = off 启动 php # 修改文件句柄数为 65535 ulimit -SHn 65535 # 启动 php-cgi 进程 # 监听 127.0.0.1 的 9000 端口 # 进程数为 64(如果服务器内存小于3GB,可以只开启64个进程) # 用户为www php-fpm start 安装 nginx wget http://nginx.org/download/nginx-1.14.0.tar.gz tar zxvf nginx-1.14.0.tar.gz cd nginx-1.14.0/ # --prefix=PATH:指定nginx的安装目录 # --user=name:设置nginx工作进程的用户 # --group=name:设置nginx工作进程的组 # --with-pcre:设置PCRE库的源码路径,如果已通过 yum 方式安装,使用 --with-pcre 自动找到库文件 # --with-http_stub_status_module:用来监控 Nginx 的当前状态 # --with-http_ssl_module:使用https协议模块 # --with-http_realip_module:通过这个模块允许我们改变客户端请求头中客户端IP地址值 # 更多配置参考 https://tengine.taobao.org/nginx_docs/cn/docs/install.html ./configure --prefix=/usr/local/webserver/nginx --user=www --group=www --with-pcre --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module make make install ln -s /usr/local/webserver/nginx/sbin/nginx /usr/bin/ 升级 nginx # make 之后不要 make install mv /usr/local/webserver/nginx/sbin/nginx /usr/local/webserver/nginx/sbin/nginx.old cp objs/nginx /usr/local/webserver/nginx/sbin/ nginx -t kill -USR2 `cat /usr/local/webserver/nginx/logs/nginx.pid` kill -QUIT `cat /usr/local/webserver/nginx/logs/nginx.pid.oldbin` nginx -v 修改 nginx.conf 配置文件 Nginx 配置文件主要分成四部分:main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理、负载均衡相关配置)和 location(URL匹配特定位置后的设置),每部分包含若干个指令。main 部分设置的指令将影响其它所有部分的设置;server 部分的指令主要用于指定虚拟主机域名、IP 和端口;upstream 的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;location 部分用于匹配网页位置(比如,根目录“/”,“/images”,等等)。他们之间的关系式:server 继承 main,location 继承 server;upstream 既不会继承指令也不会被继承,它有自己的特殊指令,不需要在其他地方的应用。 # vi /usr/local/webserver/nginx/conf/nginx.conf # 查找并修改如下配置,其他保持默认 # 运行的用户和用户组 user www www; # 全局错误日志和级别 error_log /data/logs/nginx_error.log error; # 进程文件 pid /usr/local/webserver/nginx/logs/nginx.pid; # 单个进程打开的最多文件描述符数目 worker_rlimit_nofile 65535; events { # 事件模型,epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型 use epoll; # 单个进程可以处理的最大连接数 worker_connections 65535; } http { # 日志名称和格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 允许客户端请求的最大单文件字节数 client_max_body_size 8m; # 防止网络阻塞 tcp_nopush on; # 开启gzip压缩 gzip on; # 隐藏 nginx 的版本信息 server_tokens off; # 包含其它自定义虚拟主机配置文件 # mkdir /usr/local/webserver/nginx/conf/vhost include vhost/*.conf; # 注释掉 server { } 部分的默认配置 } nginx 开机启动 # vi /etc/rc.local /usr/local/webserver/nginx/sbin/nginx # 测试 # nginx -t # 重启和停止 # nginx -s reload | stop Nginx 站点加密 创建脚本 vi /usr/local/sbin/htpasswd.pl,输入 #!/usr/bin/perl use strict; my $pw=$ARGV[0] ; print crypt($pw,$pw)."\n"; 生成密码 chmod +x /usr/local/sbin/htpasswd.pl # passwd 是要生成的密码 /usr/local/sbin/htpasswd.pl passwd # 创建完成后删除 htpasswd.pl 创建存放用户名和密码的文件 vi /usr/local/webserver/nginx/conf/.htpasswd 输入 user:passwd,user 是用户名,passwd 是刚才生成的密码 在需要加密的 server 或者 location 中增加如下配置 auth_basic "login..."; auth_basic_user_file /usr/local/webserver/nginx/conf/.htpasswd https ssl 证书配置 如果需要创建一个服务器监控和管理站点,用来查看 phpinfo 或 nginx 状态等信息,建议将该站点设置密码和 https 访问 # 替换下面的 example.com 为你的服务器运维域名 mkdir -p /usr/local/webserver/nginx/conf/ssl cd /usr/local/webserver/nginx/conf/ssl openssl genrsa -des3 -out example.com.key 1024 795dsl ## 输入密码、确认密码 openssl req -new -key example.com.key -out example.com.csr ## 分别输入之前设置的密码、CN、Beijing、Beijing、example.com、example.com、*.example.com、邮箱、回车、回车 cp example.com.key example.com.key.org openssl rsa -in example.com.key.org -out example.com.key ## 输入之前设置的密码 openssl x509 -req -days 365 -in example.com.csr -signkey example.com.key -out example.com.crt 在需要开启 https 的 server 或者 location 中增加如下配置 ssl on; ssl_certificate ssl/example.com.crt; ssl_certificate_key ssl/example.com.key; 配置运维站点 替换下面的 example.com 为你的服务器运维域名 创建站点配置文件 vi /usr/local/webserver/nginx/conf/vhost/example.com server { listen 80 default; server_name _; access_log off; deny all; } server { listen 8080 default; server_name _; access_log off; deny all; } server { listen 80; server_name example.com; index index.html index.htm index.php; root /data/htdocs/example.com; location / { rewrite ^(.*) https://$server_name$1 permanent; } access_log off; } server { listen 443; server_name example.com; if ($host != 'example.com') { rewrite ^/(.*)$ http://www.example.com/ permanent; } index index.html index.htm index.php; root /data/htdocs/example.com; ssl on; ssl_certificate ssl/example.com.crt; ssl_certificate_key ssl/example.com.key; auth_basic "login..."; auth_basic_user_file /usr/local/webserver/nginx/conf/.htpasswd; location /status { stub_status on; } location /phpfpm_status { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param HTTPS on; include fastcgi.conf; } location ~ \.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param HTTPS on; include fastcgi.conf; } location ~ \.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { expires 30d; } access_log off; } 创建站点目录 mkdir /data/htdocs/example.com,创建以下文件 index.html <html> <head> <title>example.com</title> </head> <body> <ul> <li><a href="/status" target="_blank">status</a></li> <li><a href="/phpfpm_status" target="_blank">phpfpm_status</a></li> <li><a href="/phpinfo.php" target="_blank">phpinfo</a></li> <li><a href="/ocp.php" target="_blank">opcache</a></li> <li><a href="/apc.php" target="_blank">apcu</a></li> </ul> <div><iframe src="/status" style="width: 400px; height: 100px;"></iframe></div> <div><iframe src="/phpfpm_status" style="width: 400px; height: 240px;"></iframe></div> </body> </html> phpinfo.php <?phpinfo();?> ocp.php,https://gist.github.com/ck-on/4959032 apc.php,https://github.com/krakjoe/apcu/blob/master/apc.php ,修改文件中的用户名和密码 重启并测试 nginx -s reload php-fpm reload 上面配置的运维域名如果没有解析,可以到 /etc/hosts 中配置,然后访问 https://运维域名 看个页面输出是否正确;如果一切顺利,继续到 /usr/local/webserver/nginx/conf/vhost 中添加站点配置吧