Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
搭建開始前,我們先來梳理下web服務(wù)工作流程,先看下圖:
1、用戶(PC)向web服務(wù)器發(fā)起http請求
2、web服務(wù)器判斷用戶請求文件是否為靜態(tài)文件,是則直接讀取靜態(tài)文件并返回給用戶,不是則通過WSGI協(xié)議將請求丟給web框架(django)代碼處理
3、看web框架是否啟動django中間件,如果啟用,則依據(jù)中間件對請求進(jìn)行修改,如果不啟用,則進(jìn)入下一步
4、web框架中的路由程序?qū)⒏鶕?jù)請求中的url文件名將請求路由至相應(yīng)py文件
5、相應(yīng)py文件收到請求后根據(jù)用戶提交的參數(shù)進(jìn)行計算(期間可能會調(diào)用數(shù)據(jù)庫),然后返回計算后的結(jié)果和自定義頭部信息以及狀態(tài)碼返回
6、web框架將返回的數(shù)據(jù)打上通用標(biāo)識符(頭部信息)后返回給web服務(wù)器
7、web服務(wù)器打上web服務(wù)器的通用標(biāo)識符(頭部信息)后返回給用戶
8、用戶收到返回的數(shù)據(jù)
通過上面可以看到django框架基于WSGI協(xié)議和web服務(wù)器進(jìn)行交互,那么WSGI協(xié)議又是什么呢? 咱們用代碼來說明(偽代碼。
寫一個簡易的遵循WSGI協(xié)議的web服務(wù)器軟件和django程序):
WSGI服務(wù)器的程序:
class WSGI_WEB(object):
def __init__(self):
# 1. 創(chuàng)建套接字
self.tcp_server_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2. 綁定
self.tcp_server_socket.bind(("", 7890))
# 3. 變?yōu)楸O(jiān)聽套接字
self.tcp_server_socket.listen(128)
def set_response_header(self, status, headers):
self.status=status
self.headers=[("server", "WSGI_simple_web v1.0")]
self.headers +=headers
def run(self):
new_socket, client_addr=self.tcp_server_socket.accept()
env=new_socket.recv(1024)
body=application(env, set_response_header) # env是web服務(wù)器接收到瀏覽器發(fā)送來的數(shù)據(jù)包;set_response_header為web服務(wù)器的一個方法地址,目的是讓django幫web服務(wù)器生成http頭部(不是以return的形式給web服務(wù)器);此外還有這里調(diào)用django里的應(yīng)用還有一個最核心的任務(wù),就是獲取返回數(shù)據(jù)的body!
header=self.status + self.headers
response=header + body
new_socket.send(response.encode("utf-8"))
django的app程序:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
問題:
在生產(chǎn)環(huán)境中使用django提供的簡易web服務(wù)器性能太差,一般只用于調(diào)試。強(qiáng)大的nginx又不支持WSGI,那么怎么辦呢?
方案:
在nginx和python應(yīng)用之間加一層支持WSGI協(xié)議的web服務(wù)器。以后靜態(tài)文件由nginx進(jìn)行處理,動態(tài)文件丟給WSGI服務(wù)器,然后WSGI服務(wù)器再丟給web框架處理。最理想的支持WSGI協(xié)議的web服務(wù)器就是uWSGI。
下面來詳細(xì)介紹下搭建uWSGI服務(wù)器以及與nginx聯(lián)動的方法:
1、安裝uWSGI(支持WSGI的WEB服務(wù)器):
centos下python3.6安裝uWSGI方法:
yum install -y gcc* pcre-devel openssl-devel python36-devel.x86_64
pip3.6 install uwsgi
2、開啟uWSGI服務(wù)
方式一:
uwsgi --http 192.168.31.123:80 --file teacher/wsgi.py --static-map=/static=static
--http 監(jiān)聽IP端口
--file 項目wsgi.py文件路徑
--static-map 靜態(tài)文件路徑
注意: 執(zhí)行這條命令的時候:一定要在這個項目目錄中~
方式二(使用配置文件):
vi uwsgi.ini:
[uwsgi]
# 監(jiān)聽端口(nginx采用反向代理模式時必填)
http=0.0.0.0:8888
# 項目目錄
chdir=/opt/test/test1/
# 啟動uwsgi的用戶名和用戶組
uid=root
gid=root
# 指定項目的application(我猜是這里的“test1.wsgi”拼接上面的項目目錄后,就將項目中的wsgi.py文件和uWSGI服務(wù)器關(guān)聯(lián)起來了)
module=test1.wsgi:application
# 指定sock的文件路徑(nginx采用本地模式時必填)
socket=/opt/test/script/uwsgi.sock
# 啟用主進(jìn)程
master=true
# 進(jìn)程個數(shù)
workers=5
pidfile=/opt/test/script/uwsgi.pid
# 自動移除unix Socket和pid文件當(dāng)服務(wù)停止的時候
vacuum=true
# 序列化接受的內(nèi)容,如果可能的話
thunder-lock=true
# 啟用線程
enable-threads=true
# 設(shè)置自中斷時間
harakiri=30
# 設(shè)置緩沖
post-buffering=4096
# 設(shè)置日志目錄
daemonize=/opt/test/script/uwsgi.log
# 設(shè)置隔多久加載一次項目代碼
py-autoreload=1
執(zhí)行配置文件(注意:這里用什么賬戶執(zhí)行的,以后滲透進(jìn)來獲取到的就是什么賬戶。所以這一步切忌不要用root執(zhí)行。):
uwsgi --ini uwsgi.ini
彩蛋:
重啟uWSGI進(jìn)程: uwsgi --reload uwsgi.pid # 代碼做變更后uWSGI進(jìn)程不會立即加載,此時可以重啟一下uWSGI進(jìn)程讓它生效。。。是不是感覺有點(diǎn)坑,沒事,可以在配置文件中設(shè)置py-autoreload
關(guān)閉uWSGI進(jìn)程: uwsgi --stop uwsgi.pid
3、配置nginx
方式一(反向代理模式):
upstream uwsgi{
server 10.10.10.29:8888;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://uwsgi; # 通過反向代理和uWSGI服務(wù)器關(guān)聯(lián)
}
}
方式二(本地模式):
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
include uwsgi_params; # 指定nginx和uWSGI服務(wù)器的通信方式
uwsgi_connect_timeout 30;
uwsgi_pass unix:/opt/test/script/uwsgi.sock; # 通過sock文件和uWSGI服務(wù)器關(guān)聯(lián)! 因為nginx會去讀取.sock文件,所以需要關(guān)閉selinux才行!!!
}
}
4、此時訪問django的admin管理后臺時,靜態(tài)資源會調(diào)取失敗。這時可以將該項目所有靜態(tài)資源統(tǒng)一收集到一個文件夾下,然后由nginx統(tǒng)一去調(diào)取,真正做到動靜分離(動的給uWSGI,靜的由nginx直接調(diào)取):
在settings.py中加入:
TATIC_ROOT=os.path.join(BASE_DIR, 'static_file')
執(zhí)行如下命令(搜集項目中所有靜態(tài)文件至'static_file'目錄):
python3.6 manage.py collectstatic --noinput
此時會在項目目錄下生成一個'static_file'文件夾,內(nèi)含admin和所有app涉及的靜態(tài)文件 。
在nginx中配置靜態(tài)文件路徑(如果nginx和uWSGI不屬同一臺服務(wù)器可以使用反向代理的方式來調(diào)取靜態(tài)文件):
location /static/ {
alias /opt/test/test1/static_file/;
}
此時就可以訪問基于python后臺的web網(wǎng)站了。
當(dāng)然不能只為游戲外掛去學(xué)習(xí),學(xué)習(xí)多個技術(shù),提升自己,你會發(fā)現(xiàn)其中很多小秘密都是貫通的,在此小編幫助大家整理了一套python教程,如果自己零基礎(chǔ)或者進(jìn)階的基本都有合適的,下面展示了部分,希望也能幫助對編程感興趣,如果能幫到你請點(diǎn)贊、點(diǎn)贊、點(diǎn)贊:
電子書系列:
點(diǎn)贊,收藏并轉(zhuǎn)發(fā)文章后,進(jìn)入小編主頁,看以下圖片操作:
一、前言】
本文章主要講解Nginx的基礎(chǔ)搭建(如果有不知道web服務(wù)器的可以百度,或者我再做一篇圖解web)。
Nginx在互聯(lián)網(wǎng)中作為一個不可或缺的組件,我們看到LNMP集成環(huán)境。LNMP(Linux+Nginx+Mysql+Php);如果只知道這個不知道Nginx的搭建過程的話我們有Nginx的主要特性會錯過。比如Nginx的優(yōu)點(diǎn):
高可用(一個組件可以服務(wù)上千人)
熱部署(可以做到不停機(jī)就能升級基礎(chǔ)設(shè)施服務(wù))
反向代理(通常可以,上游反向代理,下游負(fù)載均衡處理外部請求)
【二、Nginx搭建】
1、首先先下載一個版本。
2、Nginx版本分支
3、版本如下:
1)MainLine Version(主線版本開發(fā))
2)Stable(穩(wěn)定版本)
3)Legacy Version(歷史版本)-- 如果項目需要上到選定版本可以選這個
4、下載(我們以Nginx Stable Version為例子)。我們能看到Stable Version底下有三個欄目:
1)CHANGE-1.16 是介紹這個版本和上個版本的區(qū)別
2)Nginx-1.16 pgp 這個是Linux版本下載選項,將會下載倒tar.gzNginx/Windows
3)1.16.1 這個是Windows系統(tǒng)下載的,將會下載window包
【三、Nginx文件目錄(如下)】
1、文件目錄如下所示:
2、文件內(nèi)容解析如下:
1)conf(存放配置文件):Nginx.conf(主要的建站配置文件夾)
2)contrib(是一些Linux的Vim配置文件):作用是將整個vim文件移動到~/.vim/profile目錄底下,就會在vim下有高亮表現(xiàn)
3)doc (documentation 文檔目錄):一些日志改變以及readme文檔還有License授權(quán)
4)html(默認(rèn)的html,網(wǎng)站的入口):
5)logs(默認(rèn)的日志文件夾)
6)temp(臨時文件目錄)
【四、Windows下搭建】
首先需要解決如何對下一頁的網(wǎng)址進(jìn)行請求的問題。可以點(diǎn)擊下一頁的按鈕,觀察到網(wǎng)站的變化分別如下所示:
1、Windows下我們直接點(diǎn)擊Nginx根目錄下的Nginx.exe即可立即使用了。閃退是正常現(xiàn)象,之后檢查端口查看是否被占用,第一次啟動推薦使用命令行啟用 :
.\nginxpath\nginx.exe(一直停留不變則說明開啟成功)
2、 然后我們打開網(wǎng)址:
http://localhost:80
3、這樣就是成功 如果失敗了看下面。使用Windows + R啟動命令行,擁有最高權(quán)限,輸入命令:
netstart -ano | findstr 80 #找到占用的pid號。
4、然后將其kill掉,命令如下:
taskkill /F /pid
5、之后在使用最開始的方法啟動即可。
【五、Linux環(huán)境下(Centos下)搭建】
2、首先先安裝被依賴的插件,命令如下:
yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
3、之后依次如此下列的命令,記得看注釋噢~
tar -zxvf Nginx-1.16.1.tar.gz
cd Nginx-1.16.1
# 這下面幾步驟是進(jìn)行加載vim插件的,使其在修改conf的時候可以進(jìn)行常亮
cd contrib
mv contrib ~/.vim
cd ..
# path自己需要安裝的地方
./configure -prefix=/path/Nginx
# configure完成后即可,make && make install去
# configure 是進(jìn)行配置化操作
# make 是進(jìn)行編譯操作
# make install 是進(jìn)行編譯后文件的部署行為
# 為了方便就將make && make install 一起進(jìn)行
4、之后運(yùn)行Nginx,命令如下:
cd /nginxInStallPath
./Nginx
#沒有任何信息則是運(yùn)行成功了。Linux的沒有任何消息就是最好的消息
curl http://localhost
5、至此Nginx搭建完成。下列命令是一些常規(guī)的操作命令:
./Nginx -s reload #重新加載(Nginx能做到熱部署的一個原因)
./Nginx -s stop #關(guān)閉服務(wù)器
./Nginx -t # 可以測試剛修改的Nginx.conf能否生效
【六、Nginx.conf配置】
1、下面是進(jìn)行Nginx.conf配置,命令如下:
# 下面是進(jìn)行Nginx.conf配置
cd conf
vim Nginx.conf
2、修改文件中的內(nèi)容如下所示:
worker_processes number;
# error_log path #錯誤日志文件位置
# error_log path notice 提醒錯誤文件位置
# error_log path info 一些Logger::info的輸出位置
events {
work_connections 1024; #定義最大連接數(shù)量
}
# http 定義http的位置(高難度配置下章在講解)
http {
include mine.types; #定義包含類型,網(wǎng)頁請求request_type的地方屬性值設(shè)置地方在mine.types文件里賣你
default_type:application/ocet-stream #設(shè)置屬性流
sendfile on; #從一個 buffer到另一個 buffer的拷貝用于優(yōu)化速度
#tcp_nopush on;
keepalive_timeout 60; #設(shè)置請求超時時間
server {
listen 80 # 設(shè)置監(jiān)聽的端口
server_name localhost # 設(shè)置監(jiān)聽的域名
charset koi8-r #設(shè)置字符集
#access_log logs/host.access.log main #設(shè)置主訪問日志存儲
location / { #設(shè)置正則表達(dá)式匹配localhost/底下的目錄按照此位置進(jìn)行處理,
#下篇文章配置php會用到
root html; #設(shè)置網(wǎng)站根目錄為html路徑
index index.html index.htm; #設(shè)置沒有確定的資源文件下,會自動訪問index.hmtl例如
# 例如訪問http://localhost會實際訪問http://localhost/index.html
# 或者 http://localhost/index.htm
}
error_page 404 /404.html #自定義錯誤頁面代碼下訪問的頁面
error_page 500 502 503 504 /50x.html
location=/50.html { #訪問路徑為50x.html 無論是500, 502, 503, 504, 505這些頁面
root html;
}
# location ~\.php$ {
# proxy_pass http://127.0.0.1;
# }
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
#location ~/\.ht {
# deny all;拒絕所有用戶訪問
# }
}
# 底下是配置https,https是現(xiàn)在還在比較流行的一種安全web服務(wù)器的基本要求
https {
}
}
【七、總結(jié)】
1、Nginx是現(xiàn)代互聯(lián)網(wǎng)企業(yè)中不可缺少的一門技術(shù),在微服務(wù)中也極為重要,尤其反向代理所帶來的抗風(fēng)險能力極為重要,熱部署能力。
2、本文主要講述了Nginx在windows和Linux系統(tǒng)下的搭建過程,希望對搭建的學(xué)習(xí)有幫助。
想學(xué)習(xí)更多Python網(wǎng)絡(luò)爬蟲與數(shù)據(jù)挖掘知識,可前往專業(yè)網(wǎng)站:http://pdcfighting.com/
批量導(dǎo)出當(dāng)前開發(fā)環(huán)境的包信息
pip freeze > requirements.txt
下載requirements內(nèi)的包及其依賴到【某文件夾】
pip download -r requirements.txt
.whl文件
只有本地對應(yīng)版本的Python才能安裝這些包,如果想要要搭建pip鏡像站并兼容更多版本的Python怎么辦呢?
這里有一個網(wǎng)站
https://www.lfd.uci.edu/~gohlke/pythonlibs/
里面有常用的532個包,每一個對應(yīng)的有各種版本的whl文件,一共6000+
這就要爬蟲了,我寫了一個,代碼就不貼了,已上傳github
https://github.com/tjxj/whlFilesCrawler
本地安裝pip2pi
pip install pip2pi
命令行切換到下載的 .whl文件夾,建立索引(自動生成了index.html)
dir2pi -S 【某文件夾】
然后文件夾內(nèi)就出現(xiàn)了一個simple文件夾,這里的內(nèi)容就和阿里、清華、豆瓣的源差別沒那么大了。
準(zhǔn)備好Linux or Windows 的 Nginx 安裝程序
http://nginx.org/en/download.html
將【某文件夾】和Nginx 安裝包一起copy到內(nèi)網(wǎng)的服務(wù)器
Nginx 安裝很簡單,Terminal里執(zhí)行nginx不報錯就算大功告成。
找到nginx.conf文件,僅需修改如下幾個內(nèi)容,其他的都不需要動:
server{
listen 80;
server_name 你的IP地址
root 【某文件夾】的路徑
}
重啟nginx服務(wù)器
# Linux
sudo systemctl restart nginx
# Windows
nginx -s reload
瀏覽器打開 http://你的IP/simple
現(xiàn)在如果內(nèi)網(wǎng)的服務(wù)器墻是通的,其他機(jī)器應(yīng)該也能訪問這個網(wǎng)址,pip 鏡像站就搭建好了,so easy。
如果內(nèi)網(wǎng)內(nèi)的主機(jī)想要pip安裝所需的包,還需要配置一下pip
在 Linux & macOS 中,配置需要寫到 ~/.pip/pip.conf 文件中;Windows 中,配置文件位置為 %HOMEPATH%\pip\pip.ini,%HOMEPATH% 即你的用戶文件夾,一般為“\Users<你的用戶名>”,具體值可以使用 echo %HOMEPATH% 命令查看。
通常你需要手動創(chuàng)建對應(yīng)的目錄和文件,然后寫入下面的內(nèi)容:
[global]
index-url=http://你的IP/simple
[install]
trusted-host=你的IP
內(nèi)網(wǎng)的主機(jī)安裝Python的包及其依賴
pip install [所需的包名]
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。