1. 程式人生 > >筆記11(LNMP)

筆記11(LNMP)

lnmp

MySQL安裝

卸載原來的mysql步驟

第一步,先進入到src下:

cd /usr/local/src/

第二步,刪除

rm -rf /usr/local/mysql

rm -rf /etc/init.d/mysqld

cd /usr/local/src

wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz

tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz

mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql

cd /usr/local/mysql

useradd mysql

mkdir /data/

./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

cp support-files/my-default.cnf /etc/my.cnf

cp support-files/mysql.server /etc/init.d/mysqld

vi /etc/init.d/mysqld

定義basedir和datadir

/etc/init.d/mysqld start


PHP安裝

和LAMP安裝PHP方法有差別,需要開啟php-fpm服務

cd /usr/local/src/

wget http://cn2.php.net/distributions/php-5.6.30.tar.gz

tar zxf php-5.6.30.tar.gz

useradd -s /sbin/nologin php-fpm

cd php-5.6.30 (make clean可以吧以前的配置信息全部刪掉,讓他回到剛解壓完的狀態)

./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl --with-openssl

make && make install

cp php.ini-production /usr/local/php-fpm/etc/php.ini

vi /usr/local/php/etc/php-fpm.conf //寫入如下內容(參考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/php-fpm.conf)

cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

chmod 755 /etc/init.d/php-fpm

chkconfig --add php-fpm

chkconfig php-fpm on

service php-fpm start

ps aux |grep php-fpm


nginx介紹

Nginx官網 nginx.org,最新版1.13,最新穩定版1.12

Nginx應用場景:web服務、反向代理、負載均衡

Nginx著名分支,淘寶基於Nginx開發的Tengine,使用上和Nginx一致,服務名,配置文件名都一樣,和Nginx的最大區別在於Tenging增加了一些定制化模塊,在安全限速方面表現突出,另外它支持對js,css合並

Nginx核心+lua相關的組件和模塊組成了一個支持lua的高性能web容器openresty,參考http://jinnianshilongnian.iteye.com/blog/2280928


Nginx安裝

cd /usr/local/src

wget http://nginx.org/download/nginx-1.12.1.tar.gz

tar zxf nginx-1.12.1.tar.gz

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

make && make install

編輯啟動腳本:vim /etc/init.d/nginx //復制如下內容(參考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/etc_init.d_nginx )

chmod 755 /etc/init.d/nginx

chkconfig --add nginx

chkconfig nginx on

配置它的配置文件:先進去,cd /usr/local/nginx/conf/; 再拷貝,mv nginx.conf nginx.conf.bak

vim nginx.conf //寫入如下內容(參考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/nginx.conf)

檢查一下有沒有出錯:/usr/local/nginx/sbin/nginx -t

啟動:/etc/init.d/nginx start

netstat -lntp |grep 80


測試php解析

vi /usr/local/nginx/html/1.php //加入如下內容

<?php

echo "test php scripts.";

?>

curl localhost/1.php


Nginx默認虛擬主機

進到:/usr/local/nginx/conf

編輯vim /usr/local/nginx/conf/nginx.conf //把最後一段server刪除,增加

include vhost/*.conf;

創建conf子目錄:mkdir /usr/local/nginx/conf/vhost

進到vhost下:cd vhost/

在創建一個比如aaa.com.conf,編輯

vim aaa.com.conf //加入如下內容

server

{

listen 80 default_server; // 有這個標記的就是默認虛擬主機

server_name aaa.com;

index index.html index.htm index.php;

root /data/wwwroot/default;

}


創建目錄(因為配置文件裏有這個目錄):

mkdir /data/wwwroot/default

然後進到這個目錄下:cd /data/wwwroot/default/

定義一個東西:vim index.html 在裏邊隨便寫一句:this is the default site.

或者用這種定向的方式寫入:echo “This is a default site.”>/data/wwwroot/default/index.html

寫完檢查一下有沒有錯誤/usr/local/nginx/sbin/nginx -t

從新加載(加上選項-s reload):/usr/local/nginx/sbin/nginx -s reload

測試一下看看是否顯示剛才定義的那句話:curl localhost

測試一下指定域名:curl -x127.0.0.1:80 123.com


Nginx用戶認證

在這個目錄下做操作:

cd /usr/local/nginx/conf/vhost

編輯配置文件:創建一個虛擬主機

vim /usr/local/nginx/conf/vhost/test.com.conf//寫入如下內容

server

{

listen 80;

server_name test.com;

index index.html index.htm index.php;

root /data/wwwroot/test.com;

location /

{

auth_basic "Auth";

auth_basic_user_file /usr/local/nginx/conf/htpasswd;

}

}

下面是生成密碼文件:

如果你上邊安裝過Apache可以直接用這個命令:

-c是生成的意思,你要設置第二個就不用加了,要不他就會重置

/usr/local/apache2.4/bin/htpasswd -c /usr/local/nginx/conf/htpasswd awei

沒有就安裝一個yum install -y httpd 再用上邊的命令

測試一下/usr/local/nginx/sbin/nginx -t

重新加載:/usr/local/nginx/sbin/nginx -s reload

curl -x127.0.0.1:80 test.com 狀態碼為401說明需要認證

我們需要創建index.html目錄:

mkdir /data/wwwroot/test.com

echo “test.com”>/data/wwwroot/test.com/index.html

指定用戶,用-u用戶加密碼:

curl -uawei:123456789 -x127.0.0.1:80 test.com -I 訪問狀態碼變為200

編輯windows的hosts文件,然後在瀏覽器中訪問test.com會有輸入用戶、密碼的彈窗

針對指定目錄的用戶認證

location /admin/ 在後邊加目錄名字就行,這樣的話只有訪問他的時候才需要驗證

{

auth_basic "Auth";

auth_basic_user_file /usr/local/nginx/conf/htpasswd;

}

可以測試一下:創建一個測試頁面,用戶跟密碼根據自己的改

技術分享\


Nginx域名重定向

更改test.com.conf

在這個路徑下:cd /usr/local/nginx/conf/vhost

server

{

listen 80;

server_name test.com test1.com test2.com; 在後邊加上域名

index index.html index.htm index.php;

root /data/wwwroot/test.com;

if ($host != ‘test.com‘ ) {//域名跳轉,如果不是test.com就讓他調轉過來

rewrite ^/(.*)$ http://test.com/$1 permanent;(301)

}

}

測試配置文件:/usr/local/nginx/sbin/nginx -t

重新加載:/usr/local/nginx/sbin/nginx -s reload

測試一下是否為301:curl -x127.0.0.1:80 test2.com/index.html -I

server_name後面支持寫多個域名,這裏要和httpd的做一個對比

permanent為永久重定向,狀態碼為301,如果寫redirect則為302


Nginx訪問日誌

日誌格式

打開主配置文件:vim /usr/local/nginx/conf/nginx.conf //搜索log_format 這一段就是用來定義日誌格式的

技術分享

combined_realip:這是日誌個是的名字,可以隨便定義,這裏寫成什麽,後邊引用他時就寫成啥

nginx配置有個特點,他會認為什麽時候有分號;,才會結束

技術分享

除了在主配置文件nginx.conf裏定義日誌格式外,還需要在虛擬主機配置文件中:

vi /usr/local/nginx/conf/vhost/test.com.conf

增加:access_log /tmp/test.com.log combined_reali;意思是把日誌放到一個目錄下

這裏的combined_realip就是在nginx.conf中定義的日誌格式名字

-t && -s reload

訪問一下:curl -x127.0.0.1:80 test2.com/index.html -I

查看一下日誌:cat /tmp/test.com.log


Nginx日誌切割

自定義shell 腳本

vim /usr/local/sbin/nginx_log_rotate.sh//寫入如下內容

#! /bin/bash

## 假設nginx的日誌存放路徑為/data/logs/

d=`date -d "-1 day" +%Y%m%d`

logdir="/data/logs"

nginx_pid="/usr/local/nginx/logs/nginx.pid"

cd $logdir

for log in `ls *.log`

do

mv $log $log-$d

done

/bin/kill -HUP `cat $nginx_pid`

任務計劃

crontab -e 把下邊內容寫進去

0 0 * * * /bin/bash /usr/local/sbin/nginx_log_rotate.sh


靜態日誌不記錄日誌和過期時間


配置如下

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

{

expires 7d;

access_log off;

}

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

{

expires 12h;

access_log off;

}

模擬一下

先到這個目錄下:cd /data/wwwroot/test.com/

編輯:vi 1.gif 隨便寫點東西

編輯:vi 2.js 隨便寫點東西

測試一下:

curl -x127.0.0.1:80 test.com/1.gif

curl -x127.0.0.1:80 test.com/2.js

curl -x127.0.0.1:80 test.com/index.html

訪問完查看一下日誌:

cat /tmp/test.com.log 你會發現他只記錄了最後一條


Nginx防盜鏈

配置如下,可以和上面的配置結合起來

location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$

{

expires 7d;

valid_referers none blocked server_names *.test.com ; 定義白名單如果不匹配直接403

if ($invalid_referer) {

return 403;

}

access_log off;

}

測試:

curl -e "http://baidu.com/1.txt" -x127.0.0.1:80 -I test.com/1.gif 403

curl -e "http://test.com/1.txt" -x127.0.0.1:80 -I test.com/1.gif 200


Nginx訪問控制


需求:訪問/admin/目錄的請求,只允許某幾個IP訪問,配置如下:

location /admin/

{

allow 192.168.133.1;

allow 127.0.0.1;

deny all;

}

mkdir /data/wwwroot/test.com/admin/

echo “test,test”>/data/wwwroot/test.com/admin/1.html

-t && -s reload

curl -x127.0.0.1:80 test.com/admin/1.html -I

curl -x192.168.133.130:80 test.com/admin/1.html -I

可以匹配正則

location ~ .*(abc|image)/.*\.php$

{

deny all;

}

根據user_agent限制

if ($http_user_agent ~ ‘Spider/3.0|YoudaoBot|Tomato‘)

{

return 403;

}

deny all和return 403效果一樣


Nginx解析PHP的配置

配置如下:

location ~ \.php$

{

include fastcgi_params;

fastcgi_pass unix:/tmp/php-fcgi.sock;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;

}

fastcgi_pass 用來指定php-fpm監聽的地址或者socket

編輯完配置文件先不要重新加載,等測試中在加載,直接測試

測試:

vi /data/wwwroot/test.com/3.php 把下面內容寫進去:

<?php

phpinfo();

然後curl一下:curl -x127.0.0.1:80 test.com/3.php 這時他是解析不了的

然後重新加載一下配置文件:

/usr/local/nginx/sbin/nginx -s reload

在解析:

curl -x127.0.0.1:80 test.com/3.php




Nginx代理

技術分享

cd /usr/local/nginx/conf/vhost

vim proxy.conf //加入如下內容

server

{

listen 80;

server_name ask.apelearn.com;定義域名


location /

{

proxy_pass http://121.201.9.155/;遠程服務端web服務器的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;

}

}

驗證一下:curl ask.apelearn.com/robots.txt

本機也能訪問:curl -x127.0.0.1:80 ask.apelearn.com/robots.txt


Nginx負載均衡

vim /usr/local/nginx/conf/vhost/load.conf // 寫入如下內容

upstream qq_com 這個名字代表著下邊的兩個IP

{

ip_hash;

server 61.135.157.156:80;

server 125.39.240.113:80;

}

server

{

listen 80;

server_name www.qq.com;

location /

{

proxy_pass http://qq_com;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

upstream來指定多個web server


SSL工作原理

技術分享

1.瀏覽器發送一個https的請求給服務器;

2.服務器要有一套數字證書,可以自己制作(後面的操作就是阿銘自己制作的證書),也可以向組織申請,區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用受信任的公司申請的證書則不會彈出>提示頁面,這套證書其實就是一對公鑰和私鑰;

3.服務器會把公鑰傳輸給客戶端;

4.客戶端(瀏覽器)收到公鑰後,會驗證其是否合法有效,無效會有警告提醒,有效則會生成一串隨機數,並用收到的公鑰加密;

5.客戶端把加密後的隨機字符串傳輸給服務器;

6.服務器收到加密隨機字符串後,先用私鑰解密(公鑰加密,私鑰解密),獲取到這一串隨機數後,再用這串隨機字符串加密傳輸的數據(該加密為對稱加密,所謂對稱加密,就是將數據和私鑰也就是這個隨機字符串>通過某種算法混合在一起,這樣除非知道私鑰,否則無法獲取數據內容);

7.服務器把加密後的數據傳輸給客戶端;

8.客戶端收到數據後,再用自己的私鑰也就是那個隨機字符串解密;


生成SSL密鑰對

先進入到這個目錄下:cd /usr/local/nginx/conf

生成一個私鑰:openssl genrsa -des3 -out tmp.key 2048//key文件為私鑰

openssl rsa -in tmp.key -out aminglinux.key //轉換key,取消密碼

刪掉沒用的這個:rm -f tmp.key

openssl req -new -key aminglinux.key -out aminglinux.csr//生成證書請求文件,需要拿這個文件和私鑰一起生產公鑰文件

生成公鑰文件:openssl x509 -req -days 365 -in aminglinux.csr -signkey aminglinux.key -out aminglinux.crt

這裏的aminglinux.crt為公鑰


Nginx配置SSL

vim /usr/local/nginx/conf/vhost/ssl.conf//加入如下內容

server

{

listen 443;

server_name aming.com;

index index.html index.php;

root /data/wwwroot/aming.com;

ssl on;

ssl_certificate aminglinux.crt;

ssl_certificate_key aminglinux.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

}

創建一個路徑:mkdir /data/wwwroot/aming.com 因為跑配置文件有這個路徑

-t && -s reload //若報錯unknown directive “ssl” ,需要重新編譯nginx,加上--with-http_ssl_module

方法:

進到這個目錄下,cd /usr/local/src/nginx-1.12.1/

./configgure --help |grep -i ssl

添加一條正則表達式:

./configure --prefix=/usr/local/nginx --with-http_ssl_module

make && make install

用命令查看:/usr/local/nginx/sbin/nginx -V 會多一個參數

檢查錯誤:/usr/local/nginx/sbin/nginx -t

重啟一下:/etc/init.d/nginx restart

查一下他的監聽端口:netstat -lntp 會發現多了一個443端口

創建一個測試文件

把這句話寫入到配置文件去:

echo This is ssl.>/data/wwwroot/aming.com/index.html

要想直接訪問IP就編輯hosts:

vi /etc/hosts 增加127.0.0.1 aming.com

curl https://aming.com/

再從你的電腦hosts裏添加上你的虛擬機ip:192.168.65.135 aming

用電腦連網輸入:https//aming.com 如果不能上查看防火墻

iptables -nvL

iptables -F


php-fpm的pool

vim /usr/local/php/etc/php-fpm.conf//在[global]部分增加

include = etc/php-fpm.d/*.conf

mkdir /usr/local/php/etc/php-fpm.d/

cd /usr/local/php/etc/php-fpm.d/

vim www.conf //內容如下

[www]

listen = /tmp/www.sock

listen.mode=666

user = php-fpm

group = php-fpm

pm = dynamic

pm.max_children = 50

pm.start_servers = 20

pm.min_spare_servers = 5

pm.max_spare_servers = 35

pm.max_requests = 500

rlimit_files = 1024

繼續編輯配置文件

vim aming.conf //內容如下

[aming]

listen = /tmp/aming.sock

listen.mode=666

user = php-fpm

group = php-fpm

pm = dynamic

pm.max_children = 50

pm.start_servers = 20

pm.min_spare_servers = 5

pm.max_spare_servers = 35

pm.max_requests = 500

rlimit_files = 1024

檢查:/usr/local/php/sbin/php-fpm –t

重啟:/etc/init.d/php-fpm restart


php-fpm慢執行日誌

vim /usr/local/php-fpm/etc/php-fpm.d/www.conf//加入如下內容

request_slowlog_timeout = 1

slowlog = /usr/local/php-fpm/var/log/www-slow.log

配置nginx的虛擬主機test.com.conf,把unix:/tmp/php-fcgi.sock改為unix:/tmp/www.sock

重新加載nginx服務

vim /data/wwwroot/test.com/sleep.php//寫入如下內容

<?php echo “test slow log”;sleep(2);echo “done”;?>

curl -x127.0.0.1:80 test.com/sleep.php

cat /usr/local/php-fpm/var/log/www-slow.log


php-fpm定義open_basedir

vim /usr/local/php-fpm/etc/php-fpm.d/aming.conf//加入如下內容

php_admin_value[open_basedir]=/data/wwwroot/aming.com:/tmp/

創建測試php腳本,進行測試

再次更改aming.conf,修改路徑,再次測試

配置錯誤日誌

再次測試

查看錯誤日誌


php-fpm進程管理

pm = dynamic //動態進程管理,也可以是static,如果改成static下邊的就不會生效了

pm.max_children = 50 //最大子進程數,ps aux可以查看

pm.start_servers = 20 //啟動服務時會啟動的進程數

pm.min_spare_servers = 5 //定義在空閑時段,子進程數的最少數量,如果達到這個數值時,php-fpm服務會自動派生新的子進程。

pm.max_spare_servers = 35 //定義在空閑時段,子進程數的最大值,如果高於這個數值就開始清理空閑的子進程。

pm.max_requests = 500 //定義一個子進程最多處理的請求數,也就是說在一個php-fpm的子進程最多可以處理這麽多請求,當達到這個數值時,它會自動退出。


本文出自 “12912638” 博客,請務必保留此出處http://12922638.blog.51cto.com/12912638/1956156

筆記11(LNMP)