CentOS+Nginx+PHP+Mysql+安全指南全環境搭建筆記

[size=small]參考:[url]http://www.moqifei.com/archives/37[/url][/size]


這是第一部分,

主要內容有:

[用戶管理與用戶安全]

[設置系統時間及自動同步系統時間]

[關閉不需要的服務]

[系統更新]

[用OpenSSH構建SSH服務器]


CentOS+Nginx+PHP+Mysql+安全指南全環境搭建筆記(1)


- 系統安裝後的初始環境設置


[普通用戶的建立與刪除]


# useradd lovemoon

↑ 建立用戶名爲 lovemoon 的普通用戶

# passwd lovemoon

↑ 爲用戶 lovemoon 設置密碼

Changing password for user lovemoon.

New UNIX password:

↑ 輸入密碼(密碼不會被顯示)

Retype new UNIX password:

↑ 再次輸入密碼確認兩次密碼一致

passwd: all authentication tokens updated successfully.

↑ 密碼設置成功


#userdel -r lovemoon

↑ 刪除用戶名爲 lovemoon 的普通用戶


[將普通用戶設置到不同的用戶組中]


# usermod -G wheel lovemoon

↑ 將普通用戶 lovemoon 加在管理員組wheel組中

# usermod -G wheel,www lovemoon

↑ 將普通用戶 lovemoon 同時加在wheel和www組中


[設置只有管理員wheel組纔可以使用su命令進入root權限]


# vi /etc/pam.d/su  ← 打開這個配置文件

auth required /lib/security/$ISA/pam_wheel.so use_uid

↑ 修改文件爲此狀態(大約在第6行的位置)

# echo "SU_WHEEL_ONLY yes" >> /etc/login.defs

↑ 添加語句到login.defs文件行末


[設置系統時間及自動同步系統時間]


# yum install –y ntp

↑ 安裝NTP官方的時間同步程序 (NTP:中國國家授時中心)

# /usr/sbin/ntpdate -s pool.ntp.org

↑ 以NTP官方服務器爲準調整本地時間

# crontab -e

↑ 編輯計劃任務列表

0 3 * * * /usr/sbin/ntpdate -s pool.ntp.org

↑ 編輯文件到此狀態,表示每天凌晨3點自動同步時間

# /sbin/service crond reload

↑ 重載計劃任務配置


[關閉不需要的服務]


# setup

↑ 開啓圖形設置界面

選擇System service 進入服務列表

使用"空格"鍵選擇"[*]"或取消"[ ]"服務


只保留以下服務,未列出的服務一律關閉:

crond

irqbalance

↑ 僅當服務器CPU爲S.M.P架構或支持雙核心、HT技術時,才需開啓,否則關閉。

iptables

microcode_ctl

network

sshd

syslog

vsftpd

yum-updatesd


[系統更新]


# vi /etc/yum.repos.d/CentOS-Base.repo

↑ 修改系統更新地址文件

將所有"baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/"

修改爲"baseurl=http://mirrors.shlug.org/centos/$releasever/os/$basearch/"

# yum -y upgrade

↑ 更新系統文件


[用OpenSSH構建SSH服務器]


# vi /etc/ssh/sshd_config

↑ 用vi打開SSH的配置文件

將"#Protocol 2,1"

修改爲 "Protocol 2"

↑ 只允許SSH2方式的連接(Centos 5.2中已包含此設置)


將"#ServerKeyBits 768"

修改爲 "ServerKeyBits 1024"

↑ 將ServerKey強度改爲1024比特


將"#PermitRootLogin yes"

修改爲 "PermitRootLogin no"

↑ 不允許用root進行登錄(wheel組用戶SSH登陸後可用su命令使用root權限)


將"#PasswordAuthentication yes"

修改爲 "PasswordAuthentication no"

↑ 不允許密碼方式的登錄(SSH遠程管理用密鑰登陸會安全很多)


將"#PermitEmptyPasswords no"

修改爲 "PermitEmptyPasswords no"

↑ 不允許空密碼登錄


# vi /etc/hosts.deny

↑ 修改屏蔽規則,在此限定僅有哪些IP地址可以SSH遠程登陸本服務器

sshd: ALL

↑ 在文件末尾添加這一行,屏蔽所有的SSH連接請求


# vi /etc/hosts.allow

↑ 修改允許規則,在此限定僅有哪些IP地址可以SSH遠程登陸本服務器

sshd:222.17.177.

sshd:10.3.92.25

sshd:10.3.97.137

↑ 在文件末尾添加這三行,只允許來自222.17.177網段、IP地址爲10.3.92.25和IP地址爲10.3.97.137的SSH連接請求


# /etc/rc.d/init.d/sshd restart

↑ 重新啓動SSH服務器

Stopping sshd:             [ OK ]

Starting sshd:             [ OK ]

↑ SSH服務器重新啓動成功


# su -lovemoon

↑ 用普通用戶 lovemoon 登陸服務器

$ ssh-keygen -t rsa

↑ 建立公鑰與私鑰

Generating public/private rsa key pair.

Enter file in which to save the key (/home/kaz/.ssh/id_rsa):

↑ 鑰匙的文件名,這裏保持默認直接回車

Created directory '/home/kaz/.ssh'

Enter passphrase (empty for no passphrase):

↑ 輸入密鑰口令(使用SSH遠程軟件時會用到)

Enter same passphrase again:

↑ 再次輸入密鑰口令(使用SSH遠程軟件時會用到)

Your identification has been saved in /home/kaz/.ssh/id_rsa.

↑ 建立了id_rsa私鑰文件

Your public key has been saved in /home/kaz/.ssh/id_rsa.pub.

↑ 建立了id_rsa.pub公鑰文件


$ cd ~/.ssh

↑ 進入 lovemoon 用戶SSH配置文件的目錄(~/目錄相當於/home/lovemoon/)

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

↑ 公鑰內容輸出到authorized_keys文件中

$ rm -f ~/.ssh/id_rsa.pub

↑ 刪除原來的公鑰文件

$ chmod 400 ~/.ssh/authorized_keys

↑ 將新建立的公鑰文件屬性設置爲400


$ exit

↑ 退出普通用戶的登錄

登陸爲root用戶,插入U盤

# fdisk -l

↑ 顯示目前所有硬盤,找到U盤設備名爲sdb1 (具體情況具體對待,這裏各服務器有所不同)

# mount /dev/sdb1 /mnt

↑ 掛載U盤設備到/mnt目錄

# mv /home/lovemoon/.ssh/id_rsa /mnt/

↑ 移動id_rsa私鑰文件到U盤中

# umount /mnt/

↑ 卸載U盤


-Nginx+PHP+MySQL環境搭建


[利用yum命令配置、升級所需程序庫]


# sudo -s

# LANG=C

# yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel

↑安裝、升級這些程序庫


[下載環境所需文件到指定目錄]


# mkdir -p /software

↑ 在根目錄建立software文件夾

# cd /software

↑ 進入software文件夾

# wget http://sysoev.ru/nginx/nginx-0.7.19.tar.gz

# wget http://www.php.net/get/php-5.2.6.tar.gz/from/this/mirror

# wget http://php-fpm.anight.org/downloads/head/php-5.2.6-fpm-0.5.9.diff.gz

# wget http://blog.s135.com/soft/linux/mysql/mysql-5.1.26-rc.tar.gz

# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz

# wget http://mirror.optus.net/sourceforge/m/mc/mcrypt/libmcrypt-2.5.8.tar.gz

# wget http://mirror.optus.net/sourceforge/m/mc/mcrypt/mcrypt-2.6.7.tar.gz

# wget http://pecl.php.net/get/memcache-2.2.3.tgz

# wget http://mirror.optus.net/sourceforge/m/mh/mhash/mhash-0.9.9.tar.gz

# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz

# wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2

↑ 下載這些文件到software目錄


[編譯安裝PHP 5.2.6所需的支持庫]


# tar zxvf libiconv-1.12.tar.gz

↑ 解壓(tar) 參數(zxvf) 文件名(libiconv-1.12.tar.gz)

# cd libiconv-1.12/

↑ 進入解壓出來的文件的文件夾(libiconv-1.12)

# ./configure --prefix=/usr/local

↑ 配置安裝信息 指定安裝目錄爲/usr/local

# make

↑ make安裝文件

# make install

↑ 開始安裝

# cd ../

↑ 返回上級目錄(此處即software目錄)


# tar zxvf libmcrypt-2.5.8.tar.gz

# cd libmcrypt-2.5.8/

# ./configure

# make

# make install

# /sbin/ldconfig

# cd libltdl/

# ./configure --enable-ltdl-install

# make

# make install

# cd ../../


# tar zxvf mhash-0.9.9.tar.gz

# cd mhash-0.9.9/

# ./configure

# make

# make install

# cd ../


# cp /usr/local/lib/libmcrypt.* /usr/lib

# ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2


# tar zxvf mcrypt-2.6.7.tar.gz

# cd mcrypt-2.6.7/

# ./configure

# make

# make install

# cd ../


[編譯安裝MySQL 5.1.26-rc]


# /usr/sbin/groupadd mysql

↑ 建立mysql用戶組

# /usr/sbin/useradd -g mysql mysql

↑ 建立mysql用戶到mysql用戶組中

# tar zxvf mysql-5.1.26-rc.tar.gz

# cd mysql-5.1.26-rc/

# ./configure --prefix=/usr/local/webserver/mysql/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile

# make && make install

# chmod +w /usr/local/webserver/mysql

# chown -R mysql:mysql /usr/local/webserver/mysql

# cp support-files/my-medium.cnf /usr/local/webserver/mysql/my.cnf

# cd ../


# /usr/local/webserver/mysql/bin/mysql_install_db --defaults-file=/usr/local/webserver/mysql/my.cnf --basedir=/usr/local/webserver/mysql --datadir=/usr/local/webserver/mysql/data --user=mysql --pid-file=/usr/local/webserver/mysql/mysql.pid --skip-locking --port=3306 --socket=/tmp/mysql.sock

↑ 以mysql用戶帳號的身份建立數據表


# /bin/sh /usr/local/webserver/mysql/bin/mysqld_safe --defaults-file=/usr/local/webserver/mysql/my.cnf &

↑ 啓動MySQL(最後的&表示在後臺運行)


[編譯安裝PHP(FastCGI模式)]


# tar zxvf php-5.2.6.tar.gz

# gzip -cd php-5.2.6-fpm-0.5.9.diff.gz | patch -d php-5.2.6 -p1

# cd php-5.2.6/

# ./configure --prefix=/usr/local/webserver/php --with-config-file-path=/usr/local/webserver/php/etc --with-mysql=/usr/local/webserver/mysql --with-mysqli=/usr/local/webserver/mysql/bin/mysql_config --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl

# sed -i 's#-lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt#& -liconv#' Makefile

# make

# make install

# cp php.ini-dist /usr/local/webserver/php/etc/php.ini

# cd ../


[編譯安裝PHP5擴展模塊]


# tar zxvf memcache-2.2.3.tgz

# cd memcache-2.2.3/

# /usr/local/webserver/php/bin/phpize

# ./configure --with-php-config=/usr/local/webserver/php/bin/php-config

# make

# make install

# cd ../


# tar jxvf eaccelerator-0.9.5.3.tar.bz2

# cd eaccelerator-0.9.5.3/

# /usr/local/webserver/php/bin/phpize

# ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/webserver/php/bin/php-config

# make

# make install

# cd ../


[修改php.ini文件]


手工修改:

# vi /usr/local/webserver/php/etc/php.ini

將 " extension_dir = "./" "

修改爲 " extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/" "


將 "output_buffering = Off"

修改爲 " output_buffering = On "


extension = "memcache.so"

↑ 文件末尾增加此行


自動修改(已使用手動修改的跳過):

# sed -i 's#extension_dir = "./"#extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/"\nextension = "memcache.so"\n#' /usr/local/webserver/php/etc/php.ini

# sed -i 's#output_buffering = Off#output_buffering = On#' /usr/local/webserver/php/etc/php.ini


[配置eAccelerator加速PHP]


# mkdir -p /usr/local/webserver/eaccelerator_cache

# vi /usr/local/webserver/php/etc/php.ini

按shift+g鍵跳到配置文件的最末尾,加入以下配置信息:


[eaccelerator]

zend_extension="/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"

eaccelerator.shm_size="128"

eaccelerator.cache_dir="/usr/local/webserver/eaccelerator_cache"

eaccelerator.enable="1"

eaccelerator.optimizer="1"

eaccelerator.check_mtime="1"

eaccelerator.debug="0"

eaccelerator.filter=""

eaccelerator.shm_max="0"

eaccelerator.shm_ttl="300"

eaccelerator.shm_prune_period="120"

eaccelerator.shm_only="0"

eaccelerator.compress="1"

eaccelerator.compress_level="9"


# vi /etc/sysctl.conf

↑ 修改配置文件


將 "kernel.shmmax = **********"

修改爲 "kernel.shmmax = 134217728"


# /sbin/sysctl -p

↑ 執行此命令使配置生效


[創建www用戶和組]


# /usr/sbin/groupadd www -g 48

↑ 創建www用戶組並指定組ID爲48

# /usr/sbin/useradd -u 48 -g www www

↑ 創建www用戶到www用戶組中

# mkdir -p /wwwroot

↑ 在根目錄中創建wwwroot網站目錄

# chmod +w /wwwroot

↑ 給wwwroot目錄增加可寫權限

# chown -R www:www /wwwroot

↑ 使wwwroot目錄所屬用戶組爲www,所屬用戶爲www


[創建php-fpm配置文件]


php-fpm是爲PHP打的一個FastCGI管理補丁,可以平滑變更php.ini配置而無需重啓php-cgi

# rm -f /usr/local/webserver/php/etc/php-fpm.conf

↑ 刪除原有php-fpm.conf文件

# vi /usr/local/webserver/php/etc/php-fpm.conf

↑ 建立新的php-fpm.conf文件並啓動vi編輯器編輯該文件

輸入以下內容(請注意以下內容中"↑"標誌後的內容不能出現在實際文件中):





All relative paths in this config are relative to php's install prefix





Pid file

/usr/local/webserver/php/logs/php-fpm.pid


Error log file

/usr/local/webserver/php/logs/php-fpm.log


Log level

notice


When this amount of php processes exited with SIGSEGV or SIGBUS ...

10


... in a less than this interval of time, a graceful restart will be initiated.

Useful to work around accidental curruptions in accelerator's shared memory.

1m


Time limit on waiting child's reaction on signals from master

5s


Set to 'no' to debug fpm

yes


Name of pool. Used in logs and stats.

default


Address to accept fastcgi requests on.

Valid syntax is 'ip.ad.re.ss:port' or just 'port' or '/path/to/unix/socket'

127.0.0.1:9000


Set listen(2) backlog

-1


Set permissions for unix socket, if one used.

In Linux read/write permissions must be set in order to allow connections from web server.

Many BSD-derrived systems allow connections regardless of permissions.

0666


Additional php.ini defines, specific to this pool of workers.

/usr/sbin/sendmail -t -i0

↑ 如果安裝 Nginx + PHP 用於程序調試,則此處應設置爲"1"以顯示PHP錯誤信息,設置爲"0" Nginx 會報狀態爲500的空白錯誤頁




Unix user of processes

www


Unix group of processes

www


Process manager settings




Sets style of controling worker process count.

Valid values are 'static' and 'apache-like'

static


Sets the limit on the number of simultaneous requests that will be served.

Equivalent to Apache MaxClients directive.

Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi

Used with any pm_style.

64

↑ 進程數爲64,如果服務器內存大於3GB,可以只開啓128-200個進程


Settings group for 'apache-like' pm style




Sets the number of server processes created on startup.

Used only when 'apache-like' pm_style is selected

20


Sets the desired minimum number of idle server processes.

Used only when 'apache-like' pm_style is selected

5


Sets the desired maximum number of idle server processes.

Used only when 'apache-like' pm_style is selected

35


The timeout (in seconds) for serving a single request after which the worker process will be terminated

Should be used when 'max_execution_time' ini option does not stop script execution for some reason

'0s' means 'off'

0s


The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file

'0s' means 'off'

0s


The log file for slow requests

logs/slow.log


Set open file desc rlimit

51200


Set max core size rlimit

0


Chroot to this directory at the start, absolute path




Chdir to this directory at the start, absolute path




Redirect workers' stdout and stderr into main error log.

If not set, they will be redirected to /dev/null, according to FastCGI specs

yes


How much requests each process should execute before respawn.

Useful to work around memory leaks in 3rd party libraries.

For endless request processing please specify 0

Equivalent to PHP_FCGI_MAX_REQUESTS

10240


Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.

Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)

Makes sense only with AF_INET listening socket.

127.0.0.1


Pass environment variables like LD_LIBRARY_PATH

All $VARIABLEs are taken from current environment

$HOSTNAME/usr/local/bin:/usr/bin:/bin/tmp/tmp/tmp$OSTYPE$MACHTYPE2


[啓動php-cgi進程,監聽127.0.0.1的9000端口]


# ulimit -SHn 51200

# /usr/local/webserver/php/sbin/php-fpm start


[安裝Nginx所需的pcre庫]


# tar zxvf pcre-7.7.tar.gz

# cd pcre-7.7/

# ./configure

# make && make install

# cd ../


[安裝Nginx 0.7.19]


# tar zxvf nginx-0.7.19.tar.gz

# cd nginx-0.7.19/

# ./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module

# make

# make install

# cd ../


[創建Nginx日誌目錄]


# mkdir -p /logs

# chmod +w /logs

# chown -R www:www /logs


[創建nginx.conf配置文件]


# rm -f /usr/local/webserver/nginx/conf/nginx.conf

# vi /usr/local/webserver/nginx/conf/nginx.conf

輸入以下內容(請注意以下內容中"↑"標誌後的內容不能出現在實際文件中):


user www www;


worker_processes 8;

↑ Nginx每個進程耗費10M~12M內存


error_log /logs/nginx_error.log warn;


pid /usr/local/webserver/nginx/nginx.pid;


#Specifies the value for maximum file descriptors that can be opened by this process.

worker_rlimit_nofile 51200;


events

{

use epoll;

worker_connections 51200;

}


http

{

include mime.types;

default_type application/octet-stream;


#charset gb2312;


server_names_hash_bucket_size 128;

client_header_buffer_size 32k;

large_client_header_buffers 4 32k;


sendfile on;

tcp_nopush on;


keepalive_timeout 60;


tcp_nodelay on;


fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;


gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.0;

gzip_comp_level 2;

gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;


limit_zone crash $binary_remote_addr 10m;

↑ 定義一個叫“crash”的記錄區,總容量爲 10M,以變量 $binary_remote_addr 作爲會話的判斷基準(即一個地址一個會話),當區的大小爲 1M 的時候,大約可以記錄 32000 個會話信息(一個會話佔用 32 bytes)


server

{

listen 80;

server_name 222.17.177.205;

index index.html index.htm index.php;

root /wwwroot;


#limit_conn crash 5;

↑ *此處已被#註釋掉了,即不起作用*定義整個網站的限制。此處爲在"crash"記錄區中,以變量 $binary_remote_addr 作爲會話的判斷基準(即一個地址一個會話),限制網站全局目錄,一個會話只能進行5個連接(即一個IP只能發起5個連接,多過5個,一律503錯誤)


location ~ .*\.(php|php5)?$

{

#fastcgi_pass unix:/tmp/php-cgi.sock;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fcgi.conf;

}


location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

{

expires 30d;

}


location ~ .*\.(js|css)?$

{

expires 1h;

}


location /resource/ {

limit_conn crash 2;

↑ 定義resource目錄的限制。此處爲在"crash"記錄區中,以變量 $binary_remote_addr 作爲會話的判斷基準(即一個地址一個會話),限制resource目錄,一個會話只能進行2個連接(即一個IP只能發起2個連接,多過2個,一律503錯誤)

}


log_format access '$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 access;

sendfile on;

tcp_nopush on;

client_max_body_size 50m;

↑ 網站程序中允許上傳的最大size,這裏設置成50M,這裏只是nginx的限制,PHP本身限制2M

}

}


[創建fcgi.conf配置文件]


# vi /usr/local/webserver/nginx/conf/fcgi.conf

輸入以下內容:


fastcgi_param GATEWAY_INTERFACE CGI/1.1;

fastcgi_param SERVER_SOFTWARE nginx;


fastcgi_param QUERY_STRING $query_string;

fastcgi_param REQUEST_METHOD $request_method;

fastcgi_param CONTENT_TYPE $content_type;

fastcgi_param CONTENT_LENGTH $content_length;


fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;

fastcgi_param REQUEST_URI $request_uri;

fastcgi_param DOCUMENT_URI $document_uri;

fastcgi_param DOCUMENT_ROOT $document_root;

fastcgi_param SERVER_PROTOCOL $server_protocol;


fastcgi_param REMOTE_ADDR $remote_addr;

fastcgi_param REMOTE_PORT $remote_port;

fastcgi_param SERVER_ADDR $server_addr;

fastcgi_param SERVER_PORT $server_port;

fastcgi_param SERVER_NAME $server_name;


# PHP only, required if PHP was built with --enable-force-cgi-redirect

fastcgi_param REDIRECT_STATUS 200;


[啓動Nginx]


# ulimit -SHn 51200

# /usr/local/webserver/nginx/sbin/nginx


[在不停止Nginx服務的情況下平滑變更Nginx配置]


修改/usr/local/webserver/nginx/conf/nginx.conf配置文件後,請執行以下命令檢查配置文件是否正確:

# /usr/local/webserver/nginx/sbin/nginx -t

如果測試ok successfully,則可以使用下面命令重啓Nginx

(第1種)# pkill nginx

# /usr/local/webserver/nginx/conf/nginx.conf

(第2種)# kill -HUP `cat /usr/local/webserver/nginx/nginx.pid`

# /usr/local/webserver/nginx/conf/nginx.conf

(第3種)# ps -ef | grep "nginx: master process" | grep -v "grep" | awk -F ' ' '{print $2}'

# kill -HUP 數字

↑ 此數字來自於上一條命令執行後屏幕輸出的數字,即Nginx的pid進程號

# /usr/local/webserver/nginx/conf/nginx.conf


如果屏幕顯示以下兩行信息,說明配置文件正確:

the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok

the configuration file /usr/local/webserver/nginx/conf/nginx.conf was tested successfully


[配置開機自動啓動Nginx + PHP + MySQL]


# vi /etc/rc.local

在末尾增加以下內容:

/bin/sh /usr/local/webserver/mysql/bin/mysqld_safe --defaults-file=/usr/local/webserver/mysql/my.cnf &

ulimit -SHn 51200

/usr/local/webserver/php/sbin/php-fpm start

/usr/local/webserver/nginx/sbin/nginx


[優化Linux內核參數]


# vi /etc/sysctl.conf

在文件末尾增加以下內容:


net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 300

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.ip_local_port_range = 5000 65000


# /sbin/sysctl -p

↑ 使配置立即生效


[編寫每天定時切割Nginx日誌的腳本]


# vi /usr/local/webserver/nginx/sbin/cut_nginx_log.sh

↑ 創建切割腳本


輸入以下內容:

#!/bin/bash

# This script run at 00:00


# The Nginx logs path

logs_path="/logs/"


mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/

mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log

mv ${logs_path}nginx_error.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/nginx_error_$(date -d "yesterday" +"%Y%m%d").log

kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`


[設置切割日誌的計劃任務]


# crontab -e

↑ 編輯計劃任務列表


輸入以下內容:

00 00 * * * /bin/bash /usr/local/webserver/nginx/sbin/cut_nginx_log.sh

↑ 每天凌晨00:00切割nginx訪問日誌


- 服務器的安全設置及其他


主要內容:

[設置Ngnix可提供AVI、MP3等的下載]

[設置網站併發數限制]

[設置nginx程序限制的1M上傳問題]

[優化PHP]

[優化mysql]

[mysql的安全設置]

[系統整體安全調整]


[設置Ngnix可提供AVI、MP3等的下載]


# vi /usr/local/webserver/nginx/conf/mime.types

↑ 編輯mime.types文件

將需要提供下載的格式前的文件類型修改爲"application/octet-stream"

# vi /usr/local/webserver/nginx/conf/mime.types.default

↑ 編輯mime.types.default文件

將需要提供下載的格式前的文件類型修改爲"application/octet-stream"


[設置網站併發數限制]

已在配置nginx.conf文件時加入併發數限制,具體參見官方維基百科(http://wiki.codemongers.com/NginxChsHttpLimit_zoneModule)"httplimit_zonemodule "部分


[設置nginx程序限制的1M上傳問題]

已在配置nginx.conf文件時取消1M上傳限制,具體參見nginx.conf文件內註釋


[優化PHP]

具體參見(http://www.cnprint.org/bbs/blogs/1/blog312.html)"php 優化設置"部分

此處僅設置部分必要內容


# vi /usr/local/webserver/php/etc/php.ini

↑ 編輯php.ini文件


1.將"disable_functions ="

修改爲 "disable_functions = phpinfo,passthru,exec,system,popen,chroot,escapeshellcmd,escapeshellarg,shell_exec,proc_open,proc_get_status"

↑**這條建議在網站建成之後修改**該選項可以設置哪些PHP函數是禁止使用的,PHP中有一些函數的風險性還是相當大的,可以直接執行一些系統級腳本命令,如果允許這些函數執行,當PHP程序出現漏洞時,損失是非常嚴重的!

需注意:如果您的服務器中含有一些系統狀態檢測的PHP程序,則不要禁用shell_exec,proc_open,proc_get_status等函數。


2.將"upload_max_filesize = 2M"

修改爲 "upload_max_filesize = 50M"

↑該選項設定PHP所能允許最大上傳文件大小,默認爲2MB。根據實際應用需求,可以適當增大該設置。


[優化mysql]

具體參見(http://www.cnprint.org/bbs/blogs/1/blog312.html)"mysql 優化及安全設置"部分

此處僅設置部分必要內容


# vi /usr/local/webserver/mysql/my.cnf ↑ 編輯my.cnf文件


1.將"table_cache = 64"

修改爲 "table_cache = 512"

↑指定表高速緩存的大小。每當MySQL訪問一個表時,如果在表緩衝區中還有空間,該表就被打開並放入其中,這樣可以更快地訪問表內容。通過檢查峯值時間的狀態值 Open_tables和Opened_tables,可以決定是否需要增加table_cache的值。如果您發現open_tables等於 table_cache,並且opened_tables在不斷增長,那麼您就需要增加table_cache的值了(上述狀態值可以使用show status like 'Open_tables'獲得)。注意,不能盲目地把table_cache設置成很大的值。如果設置得太高,可能會造成文件描述符不足,從而造成性能不穩定或者連接失敗。


2.將"sort_buffer_size = 512k"

修改爲 "sort_buffer_size = 2M"

↑每個線程排序所需的緩衝


3.將"read_buffer_size = 128k"

修改爲 "read_buffer_size = 2M"

↑當一個查詢不斷地掃描某一個表,MySQL會爲它分配一段內存緩衝區。read_buffer_size變量控制這一緩衝區的大小。如果您認爲連續掃描進行得太慢,可以通過增加該變量值以及內存緩衝區大小提高其性能。


4.將"read_rnd_buffer_size = 512k"

修改爲 "read_rnd_buffer_size = 4M"

↑加速排序操作後的讀數據,提高讀分類行的速度。如果正對遠遠大於可用內存的表執行GROUP BY或ORDER BY操作,應增加read_rnd_buffer_size的值以加速排序操作後面的行讀取。仍然不明白這個選項的用處…


5.將"myisam_sort_buffer_size = 8M"

修改爲 "myisam_sort_buffer_size = 32M"

↑用於REPAIR TABLE。不明白這個選項的用處,百度上找到的設置方向也是五花八門,有128M、64M、32M等,折中選一個。


[mysql的安全設置]

具體參見(http://www.cnprint.org/bbs/blogs/1/blog312.html)"Mysql 的安全設置"部分

此處僅設置部分必要內容


**iptables中設置**關閉遠程連接,即3306端口。這是MySQL的默認監聽端口。由於此處MySQL只服務於本地腳本,所以不需要遠程連接。儘管MySQL內建的安全機制很嚴格,但監聽一個TCP端口仍然是危險的行爲,因爲如果MySQL程序本身有問題,那麼未授權的訪問完全可以繞過 MySQL的內建安全機制。(您必須確定,您是否真的不需要遠程連接mysql)


[系統整體安全調整]


1、**最後設置**RHEL或Red Had Enterprise Linux 5.X 的用戶要首先要打開SElinux,方法是修改/etc/selinux/config文件中的SELINUX="" 爲enforcing 。它可以保證您的系統不會非正常的崩潰。有些人認爲應該關閉,我強烈不推薦,當然只是將RHEL用來玩玩,不是用於實際服務器則無所謂了。

2、**最後設置**啓用iptables 防火牆,對增加系統安全有許多好處。設置好防火牆的規則。

iptables要求:

* 屏蔽所有端口

* 把SSH的缺省端口設置爲56565

* 把56565、80、3306端口打開

* 把3306端口設置爲只允許本機訪問


Iptables規則:

# vi /usr/local/webserver/fw.sh

將以下腳本命令粘貼到 fw.sh 文件中

#!/bin/bash

# Stop iptables service

/sbin/service iptables stop

# Inital chains default policy

/sbin/iptables -F -t filter

/sbin/iptables -P INPUT DROP

/sbin/iptables -P OUTPUT ACCEPT

# Enable Native Network Transfer

/sbin/iptables -A INPUT -i lo -j ACCEPT

# Accept Established Connections

/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# ICMP Control

/sbin/iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

# WWW Service

/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# SSH Service

/sbin/iptables -A INPUT -p tcp --dport 56565 -j ACCEPT

# Anti DDOS

/sbin/iptables -I INPUT -p tcp --syn -m ttl --ttl-eq 117 -j DROP

/sbin/iptables -I INPUT -p tcp --syn -m length --length :40 -j DROP

# mysql 3306 Accept

/sbin/iptables -A INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT

/sbin/iptables -A OUTPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT

# Start iptables service

/sbin/service iptables start


保存後執行以下命令

# chmod 755 /usr/local/webserver/fw.sh

# echo '/usr/local/webserver/fw.sh' >> /etc/rc.d/rc.local

# /usr/local/webserver/fw.sh


3、執行setup關閉那些不需要的服務,少開一個服務,就少一個危險,已在中設置

4、禁止Control-Alt-Delete鍵盤關閉命令

在"/etc/inittab"文件中註釋掉下面這行(使用#):

# vi /etc/inittab

將"ca::ctrlaltdel:/sbin/shutdown -t3 -r now" 修改爲: "#ca::ctrlaltdel:/sbin/shutdown -t3 -r now"

爲了使這項改動起作用,輸入下面這個命令:

# /sbin/init q

5、給"/etc/rc.d/init.d"下script文件設置權限

給執行或關閉啓動時執行的程序的script文件設置權限。

# chmod -R 700 /etc/rc.d/init.d/*

這表示只有root才允許讀、寫、執行該目錄下的script文件。

6、使"/etc/services"文件免疫

使"/etc/services"文件免疫,防止未經許可的刪除或添加服務:

#chattr +i /etc/services

7.阻止您的系統響應任何從外部/內部來的ping請求。

既然沒有人能ping通您的機器並收到響應,您可以大大增強您的站點的安全性。您可以加下面的一行命令到/etc/rc.d/rc.local,以使每次啓動後自動運行。

# vi /etc/rc.d/rc.local

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

8、對您的系統上所有的用戶設置資源限制可以防止DoS類型攻擊(denial of service attacks)

如最大進程數,內存數量等。例如,對所有用戶的限制象下面這樣:

# vi /etc/security/limits.conf

下面的代碼示例中,所有用戶每個會話都限制在 10 MB,並允許同時有四個登錄。第三行禁用了每個人的內核轉儲。第四行除去了用戶 bin 的所有限制。

* hard rss 10000

* hard maxlogins 4

* hard core 0

bin -

激活這些限制

# vi /etc/pam.d/login 底部添加一行: session required /lib/security/pam_limits.so。

9、用chattr命令給下面的文件加上不可更改屬性。

# chattr +i /etc/passwd

# chattr +i /etc/shadow

# chattr +i /etc/group

# chattr +i /etc/gshadow

**mysql數據庫密碼變更後再設置**注意執行這個操作後,以root身份都不能向系統增加用戶或者修改密碼了。

如果我們要增加用戶或者修改密碼的。應該先用chattr -i /etc/passwd等命令解除不可寫設置,再進行操作。

10、修改sshd的端口:

修改防火牆配置,開啓新的遠程端口(56565)

# vi /etc/sysconfig/iptables


修改/etc/ssh/sshd_config:

# vi /etc/ssh/sshd_config

將裏面的 Port 改爲 56565,(具體的端口隨意,不能和其他程序的端口衝突)。並註釋掉前面的#號


使sshd服務生效:

# pkill sshd

# service sshd start


修改防火牆配置,關閉舊的遠程端口(22)

# vi /etc/sysconfig/iptables

注意:修改了防火牆配置文件後不得再使用setup修改防火牆設置,否則現在的設置會失效

11、 內核參數調整

編輯sysctl.conf文件:

# vi /etc/sysctl.conf

修改如下:

net.ipv4.conf.default.accept_source_route=0

net.ipv4.icmp_echo_ignore_broadcasts=1

net.ipv4.icmp_echo_ignore_all=1

net.ipv4.icmp_ignore_bogus_error_responses=1

net.ipv4.ip_conntrack_max=65535

net.ipv4.tcp_syn_retries=1

net.ipv4.tcp_synack_retries=1

net.ipv4.route.gc_timeout=100

net.ipv4.tcp_max_syn_backlog=32768

net.ipv4.conf.default.rp_filter=0

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_max_tw_buckets = 5000

kernel.shmmax = 134217728

查看狀態:

# sysctl -p

12、經常檢查系統日誌。系統日誌主要位於/var/log/目錄下。防患於未然。


- 數據自動備份


主要內容:

[安裝NCFTP軟件以支持自動上傳數據庫備份]

[數據庫每日備份]

[數據庫即時備份**按需操作**]

[日誌備份]


[安裝NCFTP軟件以支持自動上傳數據庫備份]


# cd /software

# wget ftp://ftp.ncftp.com/ncftp/ncftp-3.2.2-src.tar.gz

# tar zxvf ncftp-3.2.2-src.tar.gz

# cd ncftp-3.2.2

# ./configure --prefix=/usr/local/webserver/ncftp

# make && make install


[數據庫每日備份]

每天4:00,將數據庫拷貝至/backup/day後進行壓縮,然後上傳至FTP服務器上,/backup/day/留有壓縮文件一天。


# vi /usr/local/webserver/backupd.sh


↑ 編輯腳本/usr/local/webserver/backupd.sh


寫入以下內容:


#!/bin/bash

rm -rf /backup/day/*

cd /backup/day/

cp -rf /usr/local/webserver/mysql/data/(此處爲數據庫名稱)/ /backup/day/wp_db_$(date +%Y%m%d)

sleep 10

echo "ready to tar in 10s ."

tar zcvf `hostname`_wpdata_of_$(date +%Y%m%d).tar.gz wp_db_$(date +%Y%m%d)

sleep 10

echo "ready to upload in 10s ."

/usr/local/webserver/ncftp/bin/ncftpput -u backupd -p (FTP密碼) (FTP服務器地址) / /backup/day/`hostname`_wpdata_of_$(date +%Y%m%d).tar.gz

sleep 30

echo "upload done ."

rm -f `hostname`_wpdata_of_$(date +%Y%m%d).tar.gz

sleep 5

rm -rf wp_db_$(date +%Y%m%d)

clear


保存,並設置計劃任務:


# crontab -e


增加一行:


00 4 * * * /bin/bash /usr/local/webserver/backupd.sh


↑ 每天凌晨4點將自動備份數據庫並上傳。


[數據庫即時備份**按需操作**]

每隔6小時,將數據庫拷貝至/backup/hour目錄進行備份,然後將壓縮文件上傳至FTP服務器上,/backup/hour/留有壓縮文件一天。


# vi /usr/local/webserver/backuph.sh


↑ 編輯腳本/usr/local/webserver/backuph.sh


寫入以下內容::


#!/bin/bash

rm -rf /backup/hour/*

cd /backup/hour/

cp -rf /usr/local/webserver/mysql/data/(數據庫名稱)/ /backup/hour/wp_db_$(date +%Y%m%d%H)

sleep 10

echo "ready to tar in 10s ."

tar zcvf `hostname`_wpdata_of_$(date +%Y%m%d%H).tar.gz wp_db_$(date +%Y%m%d%H)

sleep 10

echo "ready to upload in 10s ."

/usr/local/webserver/ncftp/bin/ncftpput -u backuph -p (FTP密碼) (FTP服務器地址) / /backup/hour/`hostname`_wpdata_of_$(date +%Y%m%d%H).tar.gz

sleep 30

echo "upload done ."

rm -f `hostname`_wpdata_of_$(date +%Y%m%d%H).tar.gz

sleep 5

rm -rf wp_db_$(date +%Y%m%d%H)

clear


保存,並設置計劃任務:


# crontab -e


增加一行:


0 */6 * * * /bin/bash /usr/local/webserver/backuph.sh


↑ 每6小時將自動備份數據庫並上傳一次。


[日誌備份]

每天02:00,將/logs/下前一天的日誌,進行壓縮,然後上傳至FTP服務器。


# vi /usr/local/webserver/logs.sh


↑ 編輯腳本/usr/local/webserver/logs.sh


寫入以下內容::


#!/bin/bash

cd /logs/

mkdir logs_of_$(date -d "yesterday" +"%Y%m%d")

cp $(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log /logs/logs_of_$(date -d "yesterday" +"%Y%m%d")

cp $(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/nginx_error_$(date -d "yesterday" +"%Y%m%d").log /logs/logs_of_$(date -d "yesterday" +"%Y%m%d")

sleep 10

echo "ready to tar in 10s ."

tar zcvf `hostname`_logs_of_$(date -d "yesterday" +"%Y%m%d").tar.gz logs_of_$(date -d "yesterday" +"%Y%m%d")

sleep 10

echo "ready to upload in 10s ."

/usr/local/webserver/ncftp/bin/ncftpput -u logs -p (FTP密碼) (FTP服務器地址) / /logs/`hostname`_logs_of_$(date -d "yesterday" +"%Y%m%d").tar.gz

sleep 30

echo "upload done ."

rm -f `hostname`_logs_of_$(date -d "yesterday" +"%Y%m%d").tar.gz

sleep 5

rm -rf logs_of_$(date -d "yesterday" +"%Y%m%d")

clear


保存,並設置計劃任務::


# crontab -e


增加一行:


00 2 * * * /bin/bash /usr/local/webserver/logs.sh


↑ 每天凌晨2點將自動備份日誌並上傳。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章